BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[Gelöst] Firebird - Abfrage von Partnern und Kindern

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
nehemia
Beiträge: 39
Registriert: Mo 29. Aug 2011, 08:41

[Gelöst] Firebird - Abfrage von Partnern und Kindern

Beitrag von nehemia » Fr 13. Mai 2022, 16:51

Hallo Forum,

ich habe eine Personen-Datenbank erstellt, bei der ich gleichzeitig Angehörige (Partner und Kinder) in einen Bezug setzen möchte, um sie im Formblatt darstellen zu können.

Dazu habe ich die Tabelle "Namen" folgendermaßen erstellt:

Tabelle "t_namen" mit den Feldern:
id, Schlüsselfeld, Integer, Autowert
Familienname, Textfeld
Vorname, Textfeld
partner_id, Schlüsselfeld, integer

Die Geburtsdaten habe ich über eine Tabelle "jtag" (Jahrestag), in der ich die Art der Jahrestage, also z.B. den Geburtstag und eine weitere zwischen den Tabellen "t_jtag" und "t_namen" zwischengeschaltete Tabelle "t_n_zu_jtag", in der dann das jeweilige Datum eingetragen ist, ausgelagert.

Tabelle "t_jtag" mit den Feldern:
id, Schlüsselfeld, Integer, Autowert
jtagbez, Textfeld

Tabelle "t_n_zu_jtag" mit den Feldern:
namen_id, Schlüsselfeld, Integer
jtag_id, Schlüsselfeld, Integer
TT, Textfeld
MM, Textfeld
YYYY, Textfeld

Nun möchte ich in der Tabelle "t_namen" einen Bezug setzen zwischen Feld partner_id und id (n:1-Verbindung). Weiter soll ein Bezug hergestellt werden zwischen den Tabellen "t_jtag" und "t_n_zu_jtag" und "t_namen". In HSQL konnte ich diese Beziehungen erstellen, in Firebird scheint das nicht zu klappen.

Wie kann ich das am besten lösen?

Vielen Dank für entsprechende Hinweise.

Gruß, Martin
Dateianhänge
AngehoerigeTest.zip
(13.72 KiB) 69-mal heruntergeladen
Zuletzt geändert von nehemia am Mi 24. Aug 2022, 12:48, insgesamt 1-mal geändert.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von RobertG » Fr 13. Mai 2022, 17:35

Nun möchte ich in der Tabelle "t_namen" einen Bezug setzen zwischen Feld partner_id und id (n:1-Verbindung). Weiter soll ein Bezug hergestellt werden zwischen den Tabellen "t_jtag" und "t_n_zu_jtag" und "t_namen". In HSQL konnte ich diese Beziehungen erstellen, in Firebird scheint das nicht zu klappen.
Ich habe mir die Datei runter geladen und die Verbindung von t_namen.id nach t_n_zu_jtag.namen_id gezogen. Das schien erst einmal zu klappen. Als ich die Beziehung genauer definieren wollte kam dann aber die Rückmeldung, dass zu einem Schlüsselwert der Gegenwert fehlte. In t_n_zu_jtag.namen_id steht einmal eine '9', in t_namen.id gibt es die '9' gar nicht.

Lösche ich den falschen Datensatz, dann klappt es (nach der Aktualisierung der Tabellen) auch mit den Beziehungen.

Gruß

Robert
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

nehemia
Beiträge: 39
Registriert: Mo 29. Aug 2011, 08:41

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von nehemia » Mo 22. Aug 2022, 14:56

Hallo Robert,
ich muss nochmal die Frage aufmachen. Ich habe in einer neuen Datenbank versucht, das Ganze nochmal von Grund auf aufzubauen. Ich bin in der Sache immer noch nicht durch und komme irgendwie nicht weiter!

Im Formular ist es mir zwar möglich, den Partner in einer Liste zu sehen und auszuwählen, aber ich kann ihn leider nicht dauerhaft einem bestimmten Datensatz zuordnen. Ich bekomme immer eine Fehlermeldung, die sich auf die Datei "t_namen" bezieht. Wo ist mein Fehler?

Die neue Datei füge ich unten an.

Gruß
Martin
Dateianhänge
DBMG220822Fire.zip
(14.37 KiB) 51-mal heruntergeladen

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von Freischreiber » Mo 22. Aug 2022, 16:11

Hallo nehemia,

ich kann mir nicht vorstellen, daß diese Konstruktion unter HSQL sinnvolle Ergebnisse geliefert hat.

Du willst Einträge ein und derselben Tabelle in Beziehung zueinander setzen, um Familienbeziehungen abzubilden. Das sieht nach einem Zirkelschluß aus, der so nicht funktionieren wird. Ich kann leider nicht richtig begründen, warum nicht. :?

Und eine partner_id würde wohl auch nicht reichen, sondern dann brauchst du wohl auch noch (wieviele?) kind_ids...

Um Familienbeziehungen abzubilden, brauchst du wohl eine zusätzliche Tabelle "familien", wo jede Familie eine Nummer hat als Primärschlüssel, und dann alle Familienmitglieder diese Familien-ID in ihrem Eintrag haben* (und wenn gewünscht, zusätzlich eine Rollen-ID für Vater, Mutter, Kind usw.), die aus einer Rollen-Tabelle stammt.

Meine Meinung.

Viele Grüße
Freischreiber

*Edit: Oder du siehst in der Familientabelle neben "Familienname" Spalten für Vater, Mutter, Kind vor, wo du dann die Personen-IDs einträgst. Ich weiß nicht, was besser ist.
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

nehemia
Beiträge: 39
Registriert: Mo 29. Aug 2011, 08:41

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von nehemia » Mo 22. Aug 2022, 19:23

Hallo Freischreiber,

doch allerdings, es hat unter HSQL funktioniert. Ich hab die Datei noch irgendwo... Es ist wohl kein Zirkelschluss.

Nun ist die Datei aber unter Firebird erstellt und soll dort natürlich genauso funktionieren.

Du hast Recht, ich habe jetzt nur den Partner erstellt. Ich gehe davon aus, wenn das funktioniert, wird es für die Kinder auch funktionieren. Es müssten dann natürlich ähnliche Beziehungen auch für Kinder erstellt werden. Ich könnte mir vorstellen, dass 6 Kinder vorerst reichen. Aber natürlich wäre das ausbaufähig. ;) :D

Ich will eigentlich keine Familientabellen haben, sondern nur den Partner zu einer bestimmten Person aus einer Liste auswählbar haben. Ich würde die Personen ja sonst nur doppelt erfassen Und warum soll ich eine neue Tabelle erstellen, wenn ich doch alle Personen bereits in einer verfügbar habe. Es ist doch besser Redundanzen zu vermeiden, oder?!

Aber vielleicht gibt es ja eine bessere Lösung, als die meine. Selbstverständlich bin ich offen für eine gute Lösung.

Das Anliegen ist u.a. möglichst ohne Makro und nur mit Bordmitteln von LibreOffice auszukommen. Sollte es hierbei nicht mehr möglich sein?

Gruß
Martin

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von RobertG » Mo 22. Aug 2022, 20:38

Hallo Martin,

öffne einmal das Listenfeld in Deinem Formular. Öffne es richtig zum Bearbeiten in der AbfrageGUI und starte die Abfrage. Dein Listenfeld hat keine "t_namen"."id". Das zweite Feld für die Übergabe des Fremdschlüsselwertes fehlt.

Wenn Du das einfügst wird der Wert auch korrekt abgespeichert. Nur hat Deine Konstruktion einen Haken: Die eine Person kann einen Partner haben, die andere dann den nächsten Partner usw. Das macht das Tor auf für Fehlzuweisungen.

Warum hast Du in der Tabelle für die Datumseingaben eigentlich die Tage, Monate und Jahre gesondert noch einmal aufgeführt? Die stecken doch in der Datumsangabe. Da können die nächsten Fehler unterlaufen: Das Datum stimmt, aber bei der zusätzlichen Eingabe ist dann z.B. Tag und Monat vertauscht. Diese Zusatzangaben werden ggf. über eine Abfrage ermittelt.

Gruß

Robert
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

nehemia
Beiträge: 39
Registriert: Mo 29. Aug 2011, 08:41

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von nehemia » Di 23. Aug 2022, 10:51

Hallo Robert,
danke für den Tip. Ich hoffe, dass ich es richtig verstanden habe. Ich nehme an, dass Du folgende Abfrage meinst:
Formularnavigator "partner_id" markieren -> Eingenschaften -> Eigenschaften Listenfeld unter dem Reiter Daten "Listeninhalt".

Die Abfrage lautete bisher:
SELECT "t_namen"."famname" || ', ' || "t_namen"."rufname" || ', geb. am: ' || '' || "t_n_zu_jt"."TT" || '.' || "t_n_zu_jt"."MM" || '.' || "t_n_zu_jt"."JJJJ" FROM "t_jtag", "t_n_zu_jt", "t_namen"
WHERE "t_jtag"."id" = "t_n_zu_jt"."jt_id"
AND "t_n_zu_jt"."n_id" = "t_namen"."id"
AND "t_jtag"."id" = 1
ORDER BY "t_namen"."famname" ASC, "t_namen"."rufname" ASC

Du hast recht gehabt, den Bezug innerhalb der Datei "t_namen" hatte ich nicht gesetzt. Ich habe ihn daher ergänzt. Es sieht dann jetzt so aus:

SELECT "t_namen"."famname" || ', ' || "t_namen"."rufname" || ', geb. am: ' || '' || "t_n_zu_jt"."TT" || '.' || "t_n_zu_jt"."MM" || '.' || "t_n_zu_jt"."JJJJ" FROM "t_jtag", "t_n_zu_jt", "t_namen"
WHERE "t_namen"."partner_id" = "t_namen"."id"
AND "t_jtag"."id" = "t_n_zu_jt"."jt_id"
AND "t_n_zu_jt"."n_id" = "t_namen"."id"
AND "t_jtag"."id" = 1 ORDER BY "t_namen"."famname" ASC, "t_namen"."rufname" ASC

Ich bekomme jetzt zwar keine Fehlermeldung mehr, aber im Listenfeld erscheint jetzt auch keinerlei Datensatz mehr. Irgendwie haut das noch nicht hin.
Warum hast Du in der Tabelle für die Datumseingaben eigentlich die Tage, Monate und Jahre gesondert noch einmal aufgeführt? Die stecken doch in der Datumsangabe.
Da hab ich was probiert zu sortieren. Mit dem Datum in einem Feld war das schwieriger als mit dem nach TT, MM, JJJJ aufgeteilten Datum! Ist aber ein gesondertes Problem...

Gruß
Martin
Zuletzt geändert von nehemia am Di 23. Aug 2022, 11:45, insgesamt 1-mal geändert.

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von gogo » Di 23. Aug 2022, 11:02

Dein Problem liegt wohl daran, dass in diesem Fall 2 Primary Keys relational verbunden werden sollen, was logisch gesehen einer 1:1 Verbindung entspricht. Da Deine Tabellen schon Daten enthalten, geht das wegen fehlender Schlüssel nicht.
Die Verbindung zwischen "t_n_zu_jtag" und "t_namen" kannst Du jedenfalls erstellen, sofern Du alle Daten aus den Tabellen löscht, oder nur die jeweils überzähligen Schlüssel oder indem Du die Pendants zu den überzähligen Schlüsseln in der Partnertabelle ergänzt ... ist aber für Deine Zwecke nicht sinnvoll. (siehe angehängtes Bild)

Du hast auch noch eine weitere interne 1:1 Verbindung in Deiner DB, die zwar keine Probleme schafft, aber alles ein bisschen unnötig kompliziert. Die Tabelle t_jtag kannst Du daher ohne weiteres löschen, und stattdessen den Klarnamen des Jahrestages in die t_n_zu_jtag schreiben. Das ist dann einfach neben Tag, Monat und Jahr ein weiteres Merkmal des Jahrestags-Ereignisses. ... in Summe bleibt dann logisch gesehen EINE Tabelle übrig ;)

... oder Du pimpst die t_jtag auf und verwendest die t_n_zu_jtag so wie sie vermutlich gedacht war ... ist vermutlich die bessere Lösung:
VS.png
VS.png (10.78 KiB) 1040 mal betrachtet
Beachte: jtgbez, Datum ... sind Eigenschaften des Jahrestages, deswegen in der t_jtag abspeichern, "Rolle" ... und weiteres ist eine Eigenschaft des "Teilnehmers beim Jahrestag", daher in der Verbindungstabelle abspeichern. Für jeden Teilnehmer einen (oder mehrere, falls unterschiedliche "Rollen" ... gleichzeitig) Sätze in der t_n_zu_jtag erstellen, dann wirst Du auch die richtigen Einträge vollständig wiederfinden.

Die 1:n Beziehung in der t_namen ist kein logisches Problem, aber überflüssig. Ein "Partner" ist ja einfach ein weiteres Ereignis in der t_jtag. Also "Ehe" oder "Angestellter" ... was auch immer. In der t_jtag solltest Du aber auch (je nach Ereignisart) bedenken, dass ein Ereignis zwar in der Regel an einem Tag stattfindet, aber auch ein Start und ein Enddatum haben kann ...
Mit "Startdatum" und "Enddatum" ind der t_jtag könntest Du daher noch mehr Infos vernetzen
Dateianhänge
RL.png
RL.png (40.73 KiB) 1040 mal betrachtet
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von Wanderer » Mi 24. Aug 2022, 09:03

Ich bekomme jetzt zwar keine Fehlermeldung mehr, aber im Listenfeld erscheint jetzt auch keinerlei Datensatz mehr.
Ich würde erstmal prüfen, ob eines der via || verketteten Felder NULL sein kann, dann wird nämlich die ganze Verkettung NULL.
.
Ich nutze meist IFNULL um eine leere Zeichenkette '' (zwei einzelne ', kein ") oder einen Marker wie '-' ersatzweise zu verketten.
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

Freischreiber
Beiträge: 755
Registriert: Fr 28. Mär 2014, 10:41

Re: Firebird - Abfrage von Partnern und Kindern

Beitrag von Freischreiber » Mi 24. Aug 2022, 09:26

Also, hier hat jemand sowas versucht. Zum Abfragen muß die Tabelle - auch - mit einem Alias (AS) angesprochen werden.
https://www.inf-schule.de/datenbanksyst ... ellenalias

Aber schön ist das nicht. Und strukturiert schon gar nicht. Was soll passieren, wenn ein Familienmitglied gelöscht wird? Sollen dann die anderen auch aus der Tabelle fliegen oder sollen deren Einträge ungültig werden? (Stichwort Beziehungsentwurf - Löschoptionen)

Saubere Lösung wäre eine weitere Tabelle. Einspaltig (Familiennummer) würde völlig genügen, und die einzelnen Mitglieder tragen dann die Familiennummer in ihrem Eintrag.
Freischreiber nutzt seit 6/2023 LibreOffice Version: 7.2.7.2 (x64) unter Windows 10 und SplitDB mit HSQL 2.7.2.

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten