🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
milka
Beiträge: 4
Registriert: Mi 13. Mär 2013, 22:01

Mehrere Spalten im Listenfeld

Beitrag von milka » Do 21. Mär 2013, 12:47

Hallo,

ist es möglich, ein Listenfeld mit mehren Spalten aus verschiedenen Tabellen zu erzeugen? Und wenn ja, wie?

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Mehrere Spalten im Listenfeld

Beitrag von RobertG » Do 21. Mär 2013, 16:29

Hallo Milka,

einfaches Listenfeld - der Primärschlüssel steht an der 2. Position:

Code: Alles auswählen

SELECT "Feld", "ID" FROM "Tabelle"
Listenfeld sortiert:

Code: Alles auswählen

SELECT "Feld", "ID" FROM "Tabelle" ORDER BY "Feld" ASC
Zwei Inhalte dargestellt im Listenfeld:

Code: Alles auswählen

SELECT "Feld1"||"Feld2", "ID" FROM "Tabelle"
|| verbindet zwei oder mehrere Spalten miteinander.
Zwei Inhalte dargestellt im Listenfeld, aber mit einem Komma dazwischen:

Code: Alles auswählen

SELECT "Feld1"||', '||"Feld2", "ID" FROM "Tabelle"
Zwei Inhalte aus verschiedenen Tabellen dargestellt im Listenfeld:

Code: Alles auswählen

SELECT "Tabelle1"."Feld1"||"Tabelle2"."Feld2", "Tabelle1"."ID" FROM "Tabelle1", "Tabelle2" WHERE "Tabelle1"."ID" = "Tabelle2"."FremdID"
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:

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"
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

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Mehrere Spalten im Listenfeld

Beitrag von gogo » Do 21. Mär 2013, 16:46

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.
  • 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.
Beispiel: Soll in einem Listefeld Postleitzahl, Familienname, Vorname und Titel angeführt werden, überlege man sich für den String/Zeile:
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.]
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.:

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|@|
a()=split(.currentvalue,"|@|") liefert dann unter a(1) den gewünschten Wert...
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

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Mehrere Spalten im Listenfeld

Beitrag von gogo » Do 21. Mär 2013, 17:33

Oops - sry auch in der HSQL-DB kann man das verwirklichen...

|| 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
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
Dateianhänge
Listenfeld.odb.zip
(12.83 KiB) 249-mal heruntergeladen
LiFe.gif
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

milka
Beiträge: 4
Registriert: Mi 13. Mär 2013, 22:01

Re: Mehrere Spalten im Listenfeld

Beitrag von milka » Fr 22. Mär 2013, 16:35

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)

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Mehrere Spalten im Listenfeld

Beitrag von RobertG » Fr 22. Mär 2013, 16:50

Hallo milka,

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


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