❤️ 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. 🤗


[Gelöst] Datenbank für Genealogie

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
GenOtto
Beiträge: 14
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: 2909
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: 14
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: 14
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: 14
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) 971 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) 971 mal betrachtet

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

Re: Datenbank für Genealogie

Beitrag von GenOtto » Di 11. Nov 2025, 22:51

Mein Eingabeformular soll noch eine letzte Verbesserung erhalten, indem beim Start direkt eine neue Zeile angewählt wird. Zusätzlich soll dort der Fokus in einem bestimmten Feld liegen.

Der Makro-Befehl „MoveToInsertRow“ scheitert allerdings am 41. Datensatz. Weil die Datensätze blockweise geladen werden, jeweils 41, bleibt das Makro im ersten Block hängen. Das Makro bekommt deshalb zuerst den Befehl „Last“, um mit einem großen Sprung in die letzte Zeile zu gelangen, bevor eine neue Zeile aufgerufen werden kann:

Code: Alles auswählen

SUB MainformGridNeuerDatensatz (oEvent AS OBJECT)
REM Wird aktiviert "Beim Laden" des Hauptformulars "Mainform"
	oForm = oEvent.Source
	oForm.Last
	oForm.MoveToInsertRow()
	
	DIM oGrid AS OBJECT
	DIM oController AS OBJECT
	oGrid = oForm.getByName("xxxGrid")
	oController = thisComponent.CurrentController.GetControl(oGrid)
	oController.SetFocus
	oController.SetCurrentColumnPosition(2)
END SUB
Das Makro hängt an den "Formular-Eigenschaften: Ereignisse – Beim Laden“, weil ich das Formular öfter im Entwurfsmodus starte und danach erst in den Eingabemodus wechsle. So wird das Makro auch bei einem solchen Wechsel ausgeführt. Würde ich „Extras – Anpassen – Ereignisse – Dokument öffnen“ verwenden, würde das Makro nur beim Starten des Formulars ablaufen.

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

Re: Datenbank für Genealogie

Beitrag von GenOtto » Do 13. Nov 2025, 20:43

Mit den Informationen der Datenbank lässt sich auch eine Liste der beliebtesten Babynamen in einem Ort erstellen, allerdings im 17. Jahrhundert. Die Rangliste soll eine Prozentangabe mit 2 Kommastellen enthalten. In der Liste der Kinder stehen bisher 150 Mädchen. Die Prozentrechnung aus der Schule hat hier leider total versagt, wie man sieht:

MädchenVornamenInProzent.JPG
MädchenVornamenInProzent.JPG (40.93 KiB) 842 mal betrachtet

37 / 150 ist weniger als 0,5 und wird abgerundet auf 0. Und 0 * 100 ist 0,00 % . Nach längerem Herumprobieren fand sich dann doch noch die Lösung. Vielleicht ist der Hinweis ja mal nützlich und für einen Profi was zum Schmunzeln.

MädchenVornamenIn%.JPG
MädchenVornamenIn%.JPG (51.6 KiB) 842 mal betrachtet
Man muss also zuerst 4 Kommastellen definieren. Es geht aber auch direkt mit / 150.0000 .

Freischreiber
* LO-Experte *
Beiträge: 847
Registriert: Fr 28. Mär 2014, 10:41

Re: Datenbank für Genealogie

Beitrag von Freischreiber » Fr 14. Nov 2025, 10:41

Hallo GenOtto,

ich lese deine hier teilweise einsamen Ausführungen mit großem Interesse, aber die letzte habe ich nicht verstanden:

1. Das "Rundungs"-Problem beruht auf der Anpassung des Ergebnisses an die Zahlentypen der Berechnung. RobertG hat das hier schon einmal erklärt: https://ask.libreoffice.org/t/kommastel ... en/41978/4

2. Dein letzter Screenshot zeigt eine Abfrage, die eigentlich nicht das Richtige liefern kann: * 1.000 / 150 bedeutet doch eigentlich nur: statt Integerzahlen reelle Zahlen mit drei Nachkommastellen. Aber keine Multiplikation mit 100, sondern nur mit 1. Es sollte für korrekte Prozentwerte doch eigentlich heißen: *100.000 / 150, oder?

Gruß
Freischreiber

:idea: Achte auf die dritte Ziffer: Libre Office 25.2.0.3 = Ärger ist vorprogrammiert.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de
Freischreiber nutzt seit 1/2025 LibreOffice 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.

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

Re: Datenbank für Genealogie

Beitrag von GenOtto » Fr 14. Nov 2025, 12:15

Danke dir, Freischneider, für deine Korrektur. Das ist natürlich richtig.

Mein Eingabeformular läuft übrigens gut. Ich schließe deshalb diesen Beitrag.


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