❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️

❤️ HELFEN SIE JETZT >> << HELFEN SIE JETZT ❤️

>> 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

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
GenOtto
Beiträge: 11
Registriert: Sa 30. Aug 2025, 12:39

Re: Datenbank für Genealogie

Beitrag von GenOtto » So 2. Nov 2025, 22:44

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.

RobertG
* LO-Experte *
Beiträge: 2905
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Datenbank für Genealogie

Beitrag von RobertG » Mo 3. Nov 2025, 07:41

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

GenOtto
Beiträge: 11
Registriert: Sa 30. Aug 2025, 12:39

Re: Datenbank für Genealogie

Beitrag von GenOtto » Mo 3. Nov 2025, 22:37

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.

GenOtto
Beiträge: 11
Registriert: Sa 30. Aug 2025, 12:39

Re: Datenbank für Genealogie

Beitrag von GenOtto » Fr 7. Nov 2025, 22:42

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:

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 SUB
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:

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 SUB
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:

Code: Alles auswählen

SUB NameFormNew (oEvent AS OBJECT)
	oForm = oEvent.Source
	oForm.MoveToInsertRow()
END SUB
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.

GenOtto
Beiträge: 11
Registriert: Sa 30. Aug 2025, 12:39

Re: Datenbank für Genealogie

Beitrag von GenOtto » Mo 10. Nov 2025, 18:25

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.
mNN_Nebenformular.JPG
mNN_Nebenformular.JPG (11.68 KiB) 24 mal betrachtet
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:

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 SUB
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):
wVN_Beziehungen.JPG
wVN_Beziehungen.JPG (14.1 KiB) 24 mal betrachtet


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.



Antworten