❤️ 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. 🤗
[Gelöst] 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):
Re: Datenbank für Genealogie
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:
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.
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 SUBRe: Datenbank für Genealogie
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:
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.
Man muss also zuerst 4 Kommastellen definieren. Es geht aber auch direkt mit / 150.0000 .
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.
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
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
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
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.
Re: Datenbank für Genealogie
Danke dir, Freischneider, für deine Korrektur. Das ist natürlich richtig.
Mein Eingabeformular läuft übrigens gut. Ich schließe deshalb diesen Beitrag.
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.