❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Datenbank für Genealogie
Re: Datenbank für Genealogie
Danke dir, Robert, für deinen Vorschlag. Die empfohlene Variante mit der eingebauten Bedingung hatte ich auch schon ausprobiert, ohne Erfolg. Die Fehlermeldung erscheint, egal ob ich einen neuen oder einen bereits vorhandenen Namen eintrage.
Der eingetippte Name bleibt im Kombinationsfeld stehen. Drücke ich anschließend die Taste „Speichern“ (Aktion: Datensatz speichern), wird der Name problemlos abgespeichert oder, wenn der Name schon in der Tabelle steht, abgelehnt.
Wenn ich nach der Fehlermeldung in ein anderes Kombinationsfeld wechsle (= anderes Formular), wird der angezeigte Name automatisch abgespeichert oder abgelehnt, wie zuvor.
Irgendeine Einstellung verhindert die Ausführung des Befehls „insertRow“. Ohne diesen Befehl klappt das Makro, dann aber nur das Reload.
In den Eigenschaften ist „Aktion – Keine“ ausgewählt, das Makro hängt am Ereignis „Aktion ausführen“.
Ich habe auch versucht, über uno-Befehle ans Ziel zu kommen. Nur kann ich unter „Eigenschaften > Dokument/Webseite öffnen“ nicht mehrere Befehle in das Feld „URL“ eintragen.
Nun ja, ich kann auf jeden Fall mit dem Formular arbeiten.
Der eingetippte Name bleibt im Kombinationsfeld stehen. Drücke ich anschließend die Taste „Speichern“ (Aktion: Datensatz speichern), wird der Name problemlos abgespeichert oder, wenn der Name schon in der Tabelle steht, abgelehnt.
Wenn ich nach der Fehlermeldung in ein anderes Kombinationsfeld wechsle (= anderes Formular), wird der angezeigte Name automatisch abgespeichert oder abgelehnt, wie zuvor.
Irgendeine Einstellung verhindert die Ausführung des Befehls „insertRow“. Ohne diesen Befehl klappt das Makro, dann aber nur das Reload.
In den Eigenschaften ist „Aktion – Keine“ ausgewählt, das Makro hängt am Ereignis „Aktion ausführen“.
Ich habe auch versucht, über uno-Befehle ans Ziel zu kommen. Nur kann ich unter „Eigenschaften > Dokument/Webseite öffnen“ nicht mehrere Befehle in das Feld „URL“ eintragen.
Nun ja, ich kann auf jeden Fall mit dem Formular arbeiten.
Re: Datenbank für Genealogie
Mit welchem Ereignis hast Du denn das Makro verknüpft?
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: Datenbank für Genealogie
Deine Frage war die passende Antwort, Robert!
„Fokussieren bei Klick“ hatte ich auf „Nein“ gesetzt. Das Makro war gekoppelt an „Aktion ausführen“.
„Fokussieren bei Klick“ habe ich auf „Ja“ umgestellt, das Makro startet jetzt „Bei Fokuserhalt“ – und funktioniert!
„Umschalten“ steht auch auf „Ja“, dürfte aber nur optisch eine Rolle spielen.
Weil in diesen Feldern das Ändern oder Löschen von Daten nicht zulässig ist, benötige ich nicht die Bedingung „IF oForm.isNew …“, verwende sie aber trotzdem.
Tippt man einen bereits vorhandenen Namen ein, kommt die (korrekte) Fehlermeldung, dass der Eintrag gegen die Bedingung „UNIQUE“ verstößt. Klickt man die Fehlermeldung weg, öffnet sich die Seite mit den Makros ebenfalls mit einer Fehlermeldung. Aus dieser Schleife komme ich nur heraus durch Schließen der Datenbank ohne zu Speichern.
Den Befehl „… ELSE oForm.updateRow() …“ habe ich deshalb versuchsweise ersetzt durch
„… ELSE oForm.cancelRowUpdates“ oder
„… ELSE oForm.updateNull“.
Das hat nichts gebracht.
Im Normalfall trage ich in diese Felder nur Namen ein, die in den Listenfeldern noch nicht vorhanden sind. Doppeleinträge ergeben sich also nur aus Versehen.
„Fokussieren bei Klick“ hatte ich auf „Nein“ gesetzt. Das Makro war gekoppelt an „Aktion ausführen“.
„Fokussieren bei Klick“ habe ich auf „Ja“ umgestellt, das Makro startet jetzt „Bei Fokuserhalt“ – und funktioniert!
„Umschalten“ steht auch auf „Ja“, dürfte aber nur optisch eine Rolle spielen.
Weil in diesen Feldern das Ändern oder Löschen von Daten nicht zulässig ist, benötige ich nicht die Bedingung „IF oForm.isNew …“, verwende sie aber trotzdem.
Tippt man einen bereits vorhandenen Namen ein, kommt die (korrekte) Fehlermeldung, dass der Eintrag gegen die Bedingung „UNIQUE“ verstößt. Klickt man die Fehlermeldung weg, öffnet sich die Seite mit den Makros ebenfalls mit einer Fehlermeldung. Aus dieser Schleife komme ich nur heraus durch Schließen der Datenbank ohne zu Speichern.
Den Befehl „… ELSE oForm.updateRow() …“ habe ich deshalb versuchsweise ersetzt durch
„… ELSE oForm.cancelRowUpdates“ oder
„… ELSE oForm.updateNull“.
Das hat nichts gebracht.
Im Normalfall trage ich in diese Felder nur Namen ein, die in den Listenfeldern noch nicht vorhanden sind. Doppeleinträge ergeben sich also nur aus Versehen.
Re: Datenbank für Genealogie
Hallo zusammen,
jetzt habe ich versucht, die ursprünglichen Schaltflächen „Neu“, Speichern“ und „Aktualisieren“ in den (Neben-)Formularen zu einem einzigen Schalter mit der Bezeichnung „OK“ zusammenzufassen. „Bei Fokuserhalt“ wird dann dieses Makro ausgeführt:
Die bisherige Ergänzung der IF-Anweisung mit „… ELSE oForm.updateRow ...“ habe ich weggelassen, weil bei diesem Formular mit nur einem Eingabefeld (Kombinationsfeld oder Textfeld) die Änderung eines vorhandenen Eintrags nicht möglich ist und der Versuch zu einer Fehlermeldung führt.
Hinzugefügt habe ich am Schluss „MoveToInsertRow“. Betätigt man nach der Eingabe eines neuen Namens die Schaltfläche „OK“, steht das Eingabefeld direkt wieder bereit für den nächsten Eintrag. Das ist recht praktisch, hat aber gleich mehrere Haken.
Wenn ich zwischendurch eine andere Seite, z.B. eine Tabelle, aufrufe, will das Formular automatisch die neue Zeile ohne Inhalt abspeichern und löst damit eine Fehlermeldung aus. Die gleiche Fehlermeldung erscheint, wenn man versehentlich die Taste „OK“ drückt, bevor man etwas in das Feld eingegeben hat. („Eingabe erforderlich?“ steht in der Tabelle und im Formular auf „Nein“.) Dazu kommt noch die bereits erwähnte Fehlermeldung bei der Eingabe eines schon vorhandenen Namens.
Insgesamt also ein etwas instabiles Konstrukt. Ein Test mit uno-Befehlen hat zum Glück diese Probleme beseitigt. Jetzt löst die Taste „OK“ bei Fokuserhalt dieses neue Makro aus:
Es kann also sofort wieder ein neuer Name eingetragen werden, der nur noch mit „OK“ bestätigt werden muss. Damit auch gleich zu Beginn ein neuer Name eingetippt werden kann, startet beim Laden des Formulars dieser Befehl:
Bis jetzt ist es mir bei den Tests nicht gelungen, mit der neuen Schaltfläche „OK“ eine Fehlermeldung zu provozieren. Die uno-Befehle haben offenbar eine deutlich umfassendere Funktionalität als die Makro-Befehle.
jetzt habe ich versucht, die ursprünglichen Schaltflächen „Neu“, Speichern“ und „Aktualisieren“ in den (Neben-)Formularen zu einem einzigen Schalter mit der Bezeichnung „OK“ zusammenzufassen. „Bei Fokuserhalt“ wird dann dieses Makro ausgeführt:
Code: Alles auswählen
SUB NameFormSaveReloadNew (oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
IF oForm.isNew THEN
oForm.insertRow()
END IF
oForm.reload()
oForm.MoveToInsertRow()
END SUBHinzugefügt habe ich am Schluss „MoveToInsertRow“. Betätigt man nach der Eingabe eines neuen Namens die Schaltfläche „OK“, steht das Eingabefeld direkt wieder bereit für den nächsten Eintrag. Das ist recht praktisch, hat aber gleich mehrere Haken.
Wenn ich zwischendurch eine andere Seite, z.B. eine Tabelle, aufrufe, will das Formular automatisch die neue Zeile ohne Inhalt abspeichern und löst damit eine Fehlermeldung aus. Die gleiche Fehlermeldung erscheint, wenn man versehentlich die Taste „OK“ drückt, bevor man etwas in das Feld eingegeben hat. („Eingabe erforderlich?“ steht in der Tabelle und im Formular auf „Nein“.) Dazu kommt noch die bereits erwähnte Fehlermeldung bei der Eingabe eines schon vorhandenen Namens.
Insgesamt also ein etwas instabiles Konstrukt. Ein Test mit uno-Befehlen hat zum Glück diese Probleme beseitigt. Jetzt löst die Taste „OK“ bei Fokuserhalt dieses neue Makro aus:
Code: Alles auswählen
SUB NameFormSaveReloadNewNEU
DIM oForm AS OBJECT
DIM oDispatcher AS OBJECT
DIM Array()
oForm = thisComponent.CurrentController.Frame
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDispatcher.executeDispatch(oForm,".uno:RecSave","",0,Array())
oDispatcher.executeDispatch(oForm,".uno:Refresh","",0,Array())
oDispatcher.executeDispatch(oForm,".uno:NewRecord","",0,Array())
END SUBCode: Alles auswählen
SUB NameFormNew (oEvent AS OBJECT)
oForm = oEvent.Source
oForm.MoveToInsertRow()
END SUBRe: Datenbank für Genealogie
Ich frage mich inzwischen, ob für das Eingeben von neuen Namen ein Kombinationsfeld sinnvoll ist. Sicherlich, man sieht im Popup-Menü, welche Namen bereits in der zugrundeliegenden Tabelle vorhanden sind. Das sehe ich aber auch in dem Listenfeld des MainForm. Erst wenn dort ein Name in der Auswahlliste fehlt, wechsle ich in das Nebenformular mit der ComboBox, um den neuen Namen in die dahinterliegende Tabelle zu schreiben.
Das Kombinationsfeld weist dabei einige Tücken auf. Hat man für die darunterliegende Tabelle nicht die Bedingung „UNIQUE“ festgelegt, wird derselbe Name evtl. mehrfach mit verschiedenen ID’s abgespeichert. Das gilt natürlich genauso für ein Textfeld. (Die Bedingung „UNIQUE“ hat bei mir allerdings diverse Probleme mit den Makros verursacht!)
Ruft man über das Popup-Menü des Kombinationsfeldes einen vorhandenen Namen auf in der Absicht diesen zu ändern - sofern in den Formular-Einstellungen das Ändern erlaubt ist -, dann wird beim Abspeichern jedesmal der erste Datensatz ausgetauscht. Ebenso trifft es beim vermeintlichen Löschen eines ausgewählten Datensatzes jedesmal den ersten Datensatz. Ändern und Löschen von Datensätzen schließe ich deshalb in den (Neben-)Formularen aus. Im Prinzip könnte ich also auch mit einem Textfeld arbeiten.
Wenn ich nun im Nebenformular einen neuen Namen eingegeben und mit der Schaltfläche „OK“ abgespeichert habe, will ich in die letzte Zeile des MainForm zurückkehren, wo ich den neuen Namen normalerweise benötige. Dafür dient eine Schaltfläche mit der Aufschrift „Zurück“. „Beim Fokuserhalt“ führt der Schalter diesen Befehl aus:
Der Hinweis im Handbuch, dass der Befehl „Reload“ nicht ausreicht, war sehr hilfreich. Deshalb also ein „Refresh“.
Ob es mir viel bringt, den Fokus in ein bestimmtes Feld zu setzen, muss sich in der Praxis zeigen. Ich habe ja zahlreiche Felder mit Namen. Und auf jede Tabelle mit Namen greifen jeweils mehrere Listenfelder zu, wie man hier am Beispiel „wVN“, den weiblichen Vornamen, sehen kann (Mädchen, Mutter, Patin):
Ruft man über das Popup-Menü des Kombinationsfeldes einen vorhandenen Namen auf in der Absicht diesen zu ändern - sofern in den Formular-Einstellungen das Ändern erlaubt ist -, dann wird beim Abspeichern jedesmal der erste Datensatz ausgetauscht. Ebenso trifft es beim vermeintlichen Löschen eines ausgewählten Datensatzes jedesmal den ersten Datensatz. Ändern und Löschen von Datensätzen schließe ich deshalb in den (Neben-)Formularen aus. Im Prinzip könnte ich also auch mit einem Textfeld arbeiten.
Wenn ich nun im Nebenformular einen neuen Namen eingegeben und mit der Schaltfläche „OK“ abgespeichert habe, will ich in die letzte Zeile des MainForm zurückkehren, wo ich den neuen Namen normalerweise benötige. Dafür dient eine Schaltfläche mit der Aufschrift „Zurück“. „Beim Fokuserhalt“ führt der Schalter diesen Befehl aus:
Code: Alles auswählen
SUB MainFormNeuEinlesenUndZurLetztenZeileGehen
REM Wird aktiviert durch die Schaltfläche „Zurück“: „Bei Fokuserhalt“
DIM oForm AS OBJECT
DIM oDispatcher AS OBJECT
DIM Array()
oForm = thisComponent.CurrentController.Frame
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDispatcher.executeDispatch(oForm,".uno:Refresh","",0,Array())
oDispatcher.executeDispatch(oForm,".uno:LastRecord","",0,Array())
DIM oGrid AS OBJECT
DIM oController AS OBJECT
oGrid = thisComponent.Drawpage.forms.getByName("MainForm").getByName("xxxGrid")
oController = thisComponent.CurrentController.GetControl(oGrid)
oController.SetFocus
oController.SetCurrentColumnPosition(3)
END SUBOb es mir viel bringt, den Fokus in ein bestimmtes Feld zu setzen, muss sich in der Praxis zeigen. Ich habe ja zahlreiche Felder mit Namen. Und auf jede Tabelle mit Namen greifen jeweils mehrere Listenfelder zu, wie man hier am Beispiel „wVN“, den weiblichen Vornamen, sehen kann (Mädchen, Mutter, Patin):
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.