BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!
> 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. 🤗
Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Forum,
da mit Firebird die Funktion CONCAT nicht mehr zur Verfügung steht, stellt sich für mich folgende Herausforderung:
Ich habe drei Tabellen:
1. "t_name", mit den Feldern "id", "famname" "rufname"
2. "t_jtag" (Jahrestag) mit den Feldern "id", "jtagbez" (Jahrestagsbezeichnung, mit den Einträgen Namenstag, Geburtstag, Hochzeit etc.)
3. "t_n_zu_jtag", mit den Feldern "namen_id", "jtag_id", "datum", "MM", "YYYY", "TT".
Ich habe die Felder "datum" (Datumsfeld) und "MM", "TT" und "JJJJ" (Textfelder) beide enthalten wg. der im Moment scheinbar einfacheren Sortiermöglichkeit der Textfelder im Formular und weil das für mich als Grundsatzfrage noch nicht letztendlich geklärt ist, was die bessere Lösung ist. Aber zurück zur Herausforderung…
Alle drei Tabellen sind miteinander verbunden: "t_namen.id" mit "t_n_zu_jtag.namen_id" und "t_jtag.id" mit "t_n_zu_jtag.jtag_id".
Nun möchte ich im Formular den Partner eines Datensatzes ausgeben lassen, was über eine Abfrage "qt_partner" bezogen auf die Tabellen "t_namen", "t_jtag" und "t_n_zu_jtag" in der Form "Familienname, Rufname, Geburtstag" erfolgen soll.
Unter Zuhilfename von CONCAT war dies gut zu lösen, erscheint aber ohne CONCAT wesentlich komplizierter. Wer kann mir hier helfen? Die Datenbank liegt anbei…
Gruß Martin
da mit Firebird die Funktion CONCAT nicht mehr zur Verfügung steht, stellt sich für mich folgende Herausforderung:
Ich habe drei Tabellen:
1. "t_name", mit den Feldern "id", "famname" "rufname"
2. "t_jtag" (Jahrestag) mit den Feldern "id", "jtagbez" (Jahrestagsbezeichnung, mit den Einträgen Namenstag, Geburtstag, Hochzeit etc.)
3. "t_n_zu_jtag", mit den Feldern "namen_id", "jtag_id", "datum", "MM", "YYYY", "TT".
Ich habe die Felder "datum" (Datumsfeld) und "MM", "TT" und "JJJJ" (Textfelder) beide enthalten wg. der im Moment scheinbar einfacheren Sortiermöglichkeit der Textfelder im Formular und weil das für mich als Grundsatzfrage noch nicht letztendlich geklärt ist, was die bessere Lösung ist. Aber zurück zur Herausforderung…
Alle drei Tabellen sind miteinander verbunden: "t_namen.id" mit "t_n_zu_jtag.namen_id" und "t_jtag.id" mit "t_n_zu_jtag.jtag_id".
Nun möchte ich im Formular den Partner eines Datensatzes ausgeben lassen, was über eine Abfrage "qt_partner" bezogen auf die Tabellen "t_namen", "t_jtag" und "t_n_zu_jtag" in der Form "Familienname, Rufname, Geburtstag" erfolgen soll.
Unter Zuhilfename von CONCAT war dies gut zu lösen, erscheint aber ohne CONCAT wesentlich komplizierter. Wer kann mir hier helfen? Die Datenbank liegt anbei…
Gruß Martin
- Dateianhänge
-
- MGDB_220312_Firebird_Testadressen.zip
- (283.71 KiB) 81-mal heruntergeladen
Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Martin,
wenn Du eine Datenbank anhängst, die derart viele Formulare und Abfragen hat, dann schreibe doch bitte auf, an welcher Stelle etwas nicht klappt. Da müsste also ein Formular oder eine Abfrage sein, die zur Zeit nicht funktioniert.
Mit CONCAT kann das nichts zu tun haben. CONCAT verbindet in der HSQLDB genau 2 Ausdrücke miteinander. Das habe ich nur in den Anfängen meiner Datenbankversuche mit Base genutzt. Die Verbindung von beliebig vielen Ausdrücken über funktioniert bei beiden Systemen.
Gruß
Robert
wenn Du eine Datenbank anhängst, die derart viele Formulare und Abfragen hat, dann schreibe doch bitte auf, an welcher Stelle etwas nicht klappt. Da müsste also ein Formular oder eine Abfrage sein, die zur Zeit nicht funktioniert.
Mit CONCAT kann das nichts zu tun haben. CONCAT verbindet in der HSQLDB genau 2 Ausdrücke miteinander. Das habe ich nur in den Anfängen meiner Datenbankversuche mit Base genutzt. Die Verbindung von beliebig vielen Ausdrücken über
Code: Alles auswählen
||
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Robert,
ich war der Meinung, dass aus meiner Beschreibung hervorgeht, dass es um eine Abfrage "qt_partner" geht. Ich hab in der übersandten Datenbank rumprobiert. Daher sind darin mehrere Abfragen bei "qt_partner" enthalten, wie überhaupt die Entwicklungsschritte aus der Datenbank ersichtlich sind.
Ich hatte, wie oben bereits gesagt, die Abfrage unter HSQL mit CONCAT gelöst, was einwandfrei funktioniert hat:
Nun geht es mir um eine entsprechende Lösung ohne CONCAT für Firebird.
Gruß Martin.
ich war der Meinung, dass aus meiner Beschreibung hervorgeht, dass es um eine Abfrage "qt_partner" geht. Ich hab in der übersandten Datenbank rumprobiert. Daher sind darin mehrere Abfragen bei "qt_partner" enthalten, wie überhaupt die Entwicklungsschritte aus der Datenbank ersichtlich sind.
Ich hatte, wie oben bereits gesagt, die Abfrage unter HSQL mit CONCAT gelöst, was einwandfrei funktioniert hat:
Code: Alles auswählen
SELECT CONCAT( CONCAT( CONCAT( CONCAT( CONCAT( CONCAT( "af_partner"."nachname", ' ' ), "af_partner"."vornamen" ), ', geb. ' ), "af_partner"."gebname" ), ', geb. am: ' ), "af_partner"."gebdat" ) "Paperlapapp", "id" FROM "af_partner"
Gruß Martin.
Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Martin,
so sähe die Abfrage ohne CONCAT aus:
Nur finde ich kein "af_Partner" in der vorgegebenen Datenbank. Und mit 3 verschiedenen Tabellen hat das auch nichts zu tun.
Jetzt wäre es doch sinnvoll, die Abfragen zu zeigen, die Du unter HSQLDB formuliert hast. Was Du mit den anderen Abfragen "qt_partner" erreichen willst ist mir unklar. Die letzte der Abfragen krankt ja schon daran, dass da ein Feld drin ist, das in keiner der angegebenen Tabellen vorkommt und dass keine Beziehung zwischen den Tabellen formuliert ist.
Hier die fehlerhafte letzte Abfrage "qt_partner04" korrekt:
Gruß
Robert
so sähe die Abfrage ohne CONCAT aus:
Code: Alles auswählen
SELECT "af_partner"."nachname"|| ' ' || "af_partner"."vornamen" || ', geb. ' || "af_partner"."gebname" || ', geb. am: ' || "af_partner"."gebdat" AS "Paperlapapp", "id" FROM "af_partner"
Jetzt wäre es doch sinnvoll, die Abfragen zu zeigen, die Du unter HSQLDB formuliert hast. Was Du mit den anderen Abfragen "qt_partner" erreichen willst ist mir unklar. Die letzte der Abfragen krankt ja schon daran, dass da ein Feld drin ist, das in keiner der angegebenen Tabellen vorkommt und dass keine Beziehung zwischen den Tabellen formuliert ist.
Hier die fehlerhafte letzte Abfrage "qt_partner04" korrekt:
Code: Alles auswählen
SELECT "t_namen"."famname" || ', ' || "t_namen"."rufname" || ', ' || "t_jtag"."id" "Familienname, Rufname, geb."
FROM "t_n_zu_jtag", "t_jtag", "t_namen"
WHERE "t_n_zu_jtag"."jtag_id" = "t_jtag"."id" AND "t_namen"."id" = "t_n_zu_jtag"."namen_id"
ORDER BY "t_namen"."famname" ASC
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Robert,
vermutlich war das ein Mißverständnis. Die Abfrage mit CONCAT hatte ich in eine anderen ähnlichen Datenbank, die nichts mit dieser von mir jetzt zu erstellenden zu tun hat. Die Konstellation war damals, dass die Abfrage "af_partner" sich auf eine einzige Tabelle "t_namen" bezog, die alle diese Felder wie Name, Vorname und auch Geburtstag beinhaltete. Und da hatte ich dann mit CONCAT wie oben dargestellt gearbeitet.
Natürlich macht es einen großen Unterschied, ob die Geburtstagsdaten in der Namenstabelle enthalten sind oder im Rahmen einer n:m-Beziehung ausgelagert und durch eine Zwischentabelle mit der Tabelle "t_namen" verbunden sind, wie das in der jetzigen Datenbank der Fall ist. Deshalb bin ich ja auch nicht weitergekommen.
Vielen Dank für Deinen Abfrageentwurf. Er hat mich in jedem Fall weitergebracht, weil ich meine, jetzt auch verstanden zu haben, wie eine Abfrage bei einer m:n-Beziehung grundsätzlich vonstatten geht. Offensichtlich wird bei "WHERE" einfach die Verknüpfung beschrieben, wie sie auch unter "Extras" → "Beziehungen" bildlich dargestellt ist. Manchmal dauert es eben und plötzlich ist alles klar. Zumindest scheint es im Moment so...
Nochmal: Das Ziel war, eine Abfrage zu erhalten in der die Felder für "Familienname", "Rufname" und "Geburtsdatum", zusammen in einem Feld (wie in HSQL mit CONCAT) ausgegeben wird. Ich hab jetzt aufbauend auf Deinem Code noch eine entsprechende Ergänzung vorgenommen. Die Abfrage sieht nun folgendermaßen aus:
Und nun funktioniert sie auch. Diese Abfrage ist die Grundlage für mein Formular, in dem ich per Listenfeld dann in einem x-beliebigen Datensatz den Partner auswählen können möchte. Die entsprechende Verknüpfung ist aus der Datenbank ersichtlich.
Allerdings ergibt sich jetzt im Zusammenhang mit dieser Abfrage eine weitere grundsätzliche Frage, die nichts mit der Auswahl des Partners zu tun hat:
Die Tabelle "t_jtag" (Jahrestage) beinhaltet ja nicht nur Geburtstage, sondern auch andere Jahrestage. Wenn ich jetzt statt "Geburtsdatum" das Datum für den "Namenstag" oder den "Rentenbeginn" ausgegeben haben möchte, muss ich dies vermutlich irgendwie filtern, weiß aber nicht wo bzw. wie. Kannst Du mir hier auch noch einen Tip geben?
Gruß Martin
vermutlich war das ein Mißverständnis. Die Abfrage mit CONCAT hatte ich in eine anderen ähnlichen Datenbank, die nichts mit dieser von mir jetzt zu erstellenden zu tun hat. Die Konstellation war damals, dass die Abfrage "af_partner" sich auf eine einzige Tabelle "t_namen" bezog, die alle diese Felder wie Name, Vorname und auch Geburtstag beinhaltete. Und da hatte ich dann mit CONCAT wie oben dargestellt gearbeitet.
Natürlich macht es einen großen Unterschied, ob die Geburtstagsdaten in der Namenstabelle enthalten sind oder im Rahmen einer n:m-Beziehung ausgelagert und durch eine Zwischentabelle mit der Tabelle "t_namen" verbunden sind, wie das in der jetzigen Datenbank der Fall ist. Deshalb bin ich ja auch nicht weitergekommen.
Vielen Dank für Deinen Abfrageentwurf. Er hat mich in jedem Fall weitergebracht, weil ich meine, jetzt auch verstanden zu haben, wie eine Abfrage bei einer m:n-Beziehung grundsätzlich vonstatten geht. Offensichtlich wird bei "WHERE" einfach die Verknüpfung beschrieben, wie sie auch unter "Extras" → "Beziehungen" bildlich dargestellt ist. Manchmal dauert es eben und plötzlich ist alles klar. Zumindest scheint es im Moment so...
Nochmal: Das Ziel war, eine Abfrage zu erhalten in der die Felder für "Familienname", "Rufname" und "Geburtsdatum", zusammen in einem Feld (wie in HSQL mit CONCAT) ausgegeben wird. Ich hab jetzt aufbauend auf Deinem Code noch eine entsprechende Ergänzung vorgenommen. Die Abfrage sieht nun folgendermaßen aus:
Code: Alles auswählen
SELECT "t_namen"."famname" || ', ' || "t_namen"."rufname" || ', geb. am: ' || "t_n_zu_jtag"."TT" || '.' || "t_n_zu_jtag"."MM" || '.' || "t_n_zu_jtag"."YYYY" "Familienname, Rufname, geb."
FROM "t_jtag", "t_n_zu_jtag", "t_namen"
WHERE "t_jtag"."id" = "t_n_zu_jtag"."jtag_id" AND "t_n_zu_jtag"."namen_id" = "t_namen"."id"
ORDER BY "t_namen"."famname" ASC
Allerdings ergibt sich jetzt im Zusammenhang mit dieser Abfrage eine weitere grundsätzliche Frage, die nichts mit der Auswahl des Partners zu tun hat:
Die Tabelle "t_jtag" (Jahrestage) beinhaltet ja nicht nur Geburtstage, sondern auch andere Jahrestage. Wenn ich jetzt statt "Geburtsdatum" das Datum für den "Namenstag" oder den "Rentenbeginn" ausgegeben haben möchte, muss ich dies vermutlich irgendwie filtern, weiß aber nicht wo bzw. wie. Kannst Du mir hier auch noch einen Tip geben?
Gruß Martin
Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Hallo Martin,
nach Deiner Datenbank hat der Geburtstag in der t_jtag die id = 2
Also:
Ich würde so etwas in der Regel mit einer Filtertabelle lösen, in der dann eben diese ID über ein Formular geschrieben wird.
Gruß
Robert
nach Deiner Datenbank hat der Geburtstag in der t_jtag die id = 2
Also:
Code: Alles auswählen
…
WHERE "t_jtag"."id" = "t_n_zu_jtag"."jtag_id"
AND "t_n_zu_jtag"."namen_id" = "t_namen"."id"
AND "t_jtag"."id" = 2
…
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
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
[Gelöst] Re: Firebird – Ausgabe einer Abfrage bezogen auf eine n:m-Beziehung
Danke, Robert. Ich glaub, ich komm jetzt weiter...
Gruß Martin
Gruß Martin
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 ❤️