Seite 1 von 1

Mehrere Spalten im Listenfeld

Verfasst: Do 21. Mär 2013, 12:47
von milka
Hallo,

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

Re: Mehrere Spalten im Listenfeld

Verfasst: Do 21. Mär 2013, 16:29
von RobertG
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

Re: Mehrere Spalten im Listenfeld

Verfasst: Do 21. Mär 2013, 16:46
von gogo
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...

Re: Mehrere Spalten im Listenfeld

Verfasst: Do 21. Mär 2013, 17:33
von gogo
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

Re: Mehrere Spalten im Listenfeld

Verfasst: Fr 22. Mär 2013, 16:35
von milka
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)

Re: Mehrere Spalten im Listenfeld

Verfasst: Fr 22. Mär 2013, 16:50
von RobertG
Hallo milka,

SELECT DISTINCT ...

schließt doppelte gleichlautende Datensätze aus. Obwohl ich nicht weiß, warum die bei Dir doppelt sind ...

Gruß

Robert