🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Mehrere Spalten im Listenfeld
Mehrere Spalten im Listenfeld
Hallo,
ist es möglich, ein Listenfeld mit mehren Spalten aus verschiedenen Tabellen zu erzeugen? Und wenn ja, wie?
ist es möglich, ein Listenfeld mit mehren Spalten aus verschiedenen Tabellen zu erzeugen? Und wenn ja, wie?
Re: Mehrere Spalten im Listenfeld
Hallo Milka,
einfaches Listenfeld - der Primärschlüssel steht an der 2. Position:
Listenfeld sortiert:
Zwei Inhalte dargestellt im Listenfeld:
|| verbindet zwei oder mehrere Spalten miteinander.
Zwei Inhalte dargestellt im Listenfeld, aber mit einem Komma dazwischen:
Zwei Inhalte aus verschiedenen Tabellen dargestellt im Listenfeld:
Und jetzt einmal für ein konkreteres Beispiel. Du bewahrst in einer Tabelle Postleitzahlen auf, in der zweiten Tabelle Orte. Die Tabellen sind so verbunden, dass die ID aus der Tabelle Ort als Fremdschlüssel in der Tabelle Postleitzahl steht. Die Postleitzahl-ID soll in dem Formular abgespeichert werden. Das sieht dann so aus:
Gruß
Robert
einfaches Listenfeld - der Primärschlüssel steht an der 2. Position:
Code: Alles auswählen
SELECT "Feld", "ID" FROM "Tabelle"
Code: Alles auswählen
SELECT "Feld", "ID" FROM "Tabelle" ORDER BY "Feld" ASC
Code: Alles auswählen
SELECT "Feld1"||"Feld2", "ID" FROM "Tabelle"
Zwei Inhalte dargestellt im Listenfeld, aber mit einem Komma dazwischen:
Code: Alles auswählen
SELECT "Feld1"||', '||"Feld2", "ID" FROM "Tabelle"
Code: Alles auswählen
SELECT "Tabelle1"."Feld1"||"Tabelle2"."Feld2", "Tabelle1"."ID" FROM "Tabelle1", "Tabelle2" WHERE "Tabelle1"."ID" = "Tabelle2"."FremdID"
Code: Alles auswählen
SELECT "Postleitzahl"."Postleitzahl"||' '||"Ort"."Ort", "Postleitzahl"."ID" FROM "Postleitzahl", "Ort" WHERE "Ort"."ID" = "Postleitzahl"."OrtID" ORDER BY "Postleitzahl"."Postleitzahl"||' '||"Ort"."Ort"
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: Mehrere Spalten im Listenfeld
Nur über einen Umweg und auch nicht besonders "einfach", bzw. wird's mit jedem Datanbankbackend ein bisschen anders zu realisieren sein, mit der eingebauten HSQL-DB (solange die Version <2.X ist) wird es nicht (bzw. nur per Makro) funktionieren, da die benötigte Funktion RPAD nicht vorhanden ist.
Postleitzahl: 7 Stellen ("D-12345")
Familienname+Vorname: 30 Stellen ("Musterfrau, Sabine ") wobei mindestens 5 Stellen für den Vornamen reserviert sind
Titel: (bis zu 10 Stellen) ("Dipl.Ing. ")
Trennzeichen: Postleitzahl | Familienname, Vorname [Titel]
Ergibt SQLmäßig:
CONCAT(RPAD(Postleitzahl,10 ' '), ' | ', RPAD(CONCAT(Familienname, ', ', Vorname), 30,' '), ' [', Titel, ']')
Also:
Um ganz sicherzugehen, dass die Formatierung nicht auseinanderfliegt muss man die Strings voher noch auf die gewünschte Länge kappen:
Postleitzahl: LEFT(Postleitzahl, 7)
Familienname: LEFT(Familienname,25)
Vorname: LEFT(Vorname, 30 - LENGHT(LEFT(Familienname, 25)))
Titel: LEFT(Titel,10)
.. habe ich aber oben wegen der Übersichtlichkeit nicht gemacht
Für alle HSQLDB-ler: Ein Makro kann das Listenfeld auch füllen, wobei das Problem besteht, dass es dann keinen referentiellen Wert in Spalte 2 gibt, dieser Wert muss also bei der Veränderung des Listfeld-Wertes (Ereignis: "Status geändert") aus dem .Currentvalue des Listenfeldes ausgelesen werden und in das entsprechende Feld der DB geschrieben werden - d.h. das Listenfeld wird am Besten als NICHT gebundenes Kontrollelement verwendet und sein Inhalt (ListSource(0)) per Makro wann auch immer gesetzt.
Strings fix ablängen kann man in Starbasic praktisch mit "LSet" (oder RSet). Das "Schlüsselfeld" inkludiert man dann am besten ganz rechts, und kennzeichnet es eindeutig mit Klammern und so weiter. Z.B.:
a()=split(.currentvalue,"|@|") liefert dann unter a(1) den gewünschten Wert...
- Prinzip:
- Der Inhald des Listenfeldes besteht aus einer Abfrage mit 2 Spalten,
wobei sich in der ersten Spalte die zu sehende Information befindet, in der 2.Spalte der Wert, der in der Datentabelle gespeichert werden soll (das ist ja nicht Neues)
- Der Inhalt der ersten Spalte muss, damit ihn der User gut interpretieren kann in seiner Länge genau definiert werden,
und wird aus mehreren Feldern und fixen Strings zusammengesetzt. Der Optische Trenner z.B. zwischen einer Postleitzahl und dem Familiennamen könnte ein | sein. Man benötigt dazu Grundkenntnisse für folgende SQL-Funktionen:- LEFT()
- RPAD()
- CONCAT (besser CONCAT_WS, falls vorhanden)
- Der Clou: Das Listenfeld wird dann mit einer MONOSPACE-Schrift formatiert -
da ist das "i" gleich breit wie das "M", ein Leerzeichen an Stelle 10 ist also in der ganzen Liste in einer senkrechten Linie zu sehen.
Postleitzahl: 7 Stellen ("D-12345")
Familienname+Vorname: 30 Stellen ("Musterfrau, Sabine ") wobei mindestens 5 Stellen für den Vornamen reserviert sind
Titel: (bis zu 10 Stellen) ("Dipl.Ing. ")
Trennzeichen: Postleitzahl | Familienname, Vorname [Titel]
Ergibt SQLmäßig:
CONCAT(RPAD(Postleitzahl,10 ' '), ' | ', RPAD(CONCAT(Familienname, ', ', Vorname), 30,' '), ' [', Titel, ']')
Also:
Code: Alles auswählen
D-12345 | Musterfrau, Sabine [Dipl.Ing.]
D-54321 | Mosermaier-Roncalli, Peter []
D-12345 | Musterfrau-Mosermaier-Ron, Eveli [Dr.]
Postleitzahl: LEFT(Postleitzahl, 7)
Familienname: LEFT(Familienname,25)
Vorname: LEFT(Vorname, 30 - LENGHT(LEFT(Familienname, 25)))
Titel: LEFT(Titel,10)
.. habe ich aber oben wegen der Übersichtlichkeit nicht gemacht
Für alle HSQLDB-ler: Ein Makro kann das Listenfeld auch füllen, wobei das Problem besteht, dass es dann keinen referentiellen Wert in Spalte 2 gibt, dieser Wert muss also bei der Veränderung des Listfeld-Wertes (Ereignis: "Status geändert") aus dem .Currentvalue des Listenfeldes ausgelesen werden und in das entsprechende Feld der DB geschrieben werden - d.h. das Listenfeld wird am Besten als NICHT gebundenes Kontrollelement verwendet und sein Inhalt (ListSource(0)) per Makro wann auch immer gesetzt.
Strings fix ablängen kann man in Starbasic praktisch mit "LSet" (oder RSet). Das "Schlüsselfeld" inkludiert man dann am besten ganz rechts, und kennzeichnet es eindeutig mit Klammern und so weiter. Z.B.:
Code: Alles auswählen
D-12345 | Musterfrau, Sabine [Dipl.Ing.] |@|1245|@|
D-54321 | Mosermaier-Roncalli, Peter [] |@|1246|@|
D-12345 | Musterfrau-Mosermaier-Ron, Eveli [Dr.] |@|1247|@|
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
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
Re: Mehrere Spalten im Listenfeld
Oops - sry auch in der HSQL-DB kann man das verwirklichen...
|| und die Funktion SPACE() machen es möglich.
z.B.:
Leidergottes braucht es dabei die umständliche Formulierung mit CASE..., denn wenn SPACE() mit einer negativen Zahl aufgerufen wird, dann ist der ganze String blank ... Beispieldatei im Anhang
|| und die Funktion SPACE() machen es möglich.
z.B.:
Code: Alles auswählen
SELECT
LEFT( "t_a"."NumA", 10 ) || SPACE( 10 - LENGTH( "t_a"."NumA" ) ) ||
( CASE WHEN LENGTH( "t_a"."TextA" ) >= 15
THEN LEFT( "t_a"."TextA", 15 )
ELSE "t_a"."TextA" || SPACE( 15 - LENGTH( "t_a"."TextA" ) )
END ) ||
' € ' || "t_a"."Preis"
AS "bez",
"NumA"
FROM "t_a"
ORDER BY "bez" ASC
- Dateianhänge
-
- Listenfeld.odb.zip
- (12.83 KiB) 249-mal heruntergeladen
-
- LiFe.gif (8.19 KiB) 5756 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
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
Re: Mehrere Spalten im Listenfeld
Vielen Dank für die Tipps!
ich habs nun hinbekommen mit ||´´||. Nun ist es aber so, dass manche Einträge mehrmals auftreten. Wie vermeide ich diese doppelten Einträge? (Die Daten stammen aus verschiedenen Tabellen)
ich habs nun hinbekommen mit ||´´||. Nun ist es aber so, dass manche Einträge mehrmals auftreten. Wie vermeide ich diese doppelten Einträge? (Die Daten stammen aus verschiedenen Tabellen)
Re: Mehrere Spalten im Listenfeld
Hallo milka,
SELECT DISTINCT ...
schließt doppelte gleichlautende Datensätze aus. Obwohl ich nicht weiß, warum die bei Dir doppelt sind ...
Gruß
Robert
SELECT DISTINCT ...
schließt doppelte gleichlautende Datensätze aus. Obwohl ich nicht weiß, warum die bei Dir doppelt sind ...
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
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.