Seite 1 von 1

Feldinhalt über alle Datensätze zu einem String verbinden

Verfasst: Mo, 05.11.2012 21:05
von mgo
Hi,

ich habe eine Tabelle, in der unter anderem die email-Adresse verwaltet ist. Jetzt würde ich gerne alle email Adressen so zu einem einzigen String verbinden, dass ich ihn direkt in das Adressfeld des email-Programms kopieren kann.
Es sollte also aus

a@x.com
b@y.com
c@z.com

a@x.com; b@y.com; c@z.com

werden.Ich hätte gesagt, man löst das über einen Bericht, es gelingt mir aber nicht die einzelnen Felder miteinander zu verknüpfen....

Habt ihr eine Idee dazu?

lg Michi

Re: Feldinhalt über alle Datensätze zu einem String verbinde

Verfasst: Mo, 05.11.2012 21:41
von RobertG
Hallo Michi,

Du kannst aus verschiedenen Datensätzen der gleichen Tabelle nur begrenzt komplette Felder in einem Datensatz generieren. Das normale Verfahren dazu besteht in der Durchnummerierung der einen Tabelle zu einem View und der anschließenden Erstellung einer Abfrage mit lauter Subselects. Für Deine Tabelle würde das so aussehen:
View -

Code: Alles auswählen

SELECT "a"."EMail", (SELECT COUNT("ID") WHERE "ID" <= "a"."ID") AS "Nr" FROM "Tabelle" AS "a"
Jetzt hast Du eine Ansicht (View) mit durchnummerierten Datensätzen ab 1 aufwärts - ID sollte vorher der Primärschlüssel sein.
Abfrage -

Code: Alles auswählen

SELECT "EMail"||IFNULL(';'||(SELECT "EMail" FROM "Ansicht" WHERE "Nr"=2),'')||IFNULL(';'||(SELECT "EMail" FROM "Ansicht" WHERE "Nr"=3),'') .... FROM "Ansicht" WHERE "Nr" =1
Du müsstest hier aber genau wissen, wie viele Datensätze denn mindestens vorhanden sind. Geht einmal zu konstruieren z.B. für einen Mailverteiler "Vorstand eines Vereins" - nicht aber "Mitglieder eines Vereins", es sei denn, das sind nicht allzu viele.

Für eine allgemeine Lösung müsstest Du das Ganze über ein Makro bestücken, d.h. jeden Wert aus der Tabelle auslesen und anschließend zu einem gemeinschaftlichen Wert verknüpfen und wieder in eine Tabelle eintragen.
Ansätze dazu sind z.B. im Base-Handbuch von LO zu finden (Verknüpfung zu Datenbanken, Daten aus Tabellen auslesen, neues Verknüpfen, Daten in eine Tabelle einfügen). Das Handbuch findest Du hier:
http://de.libreoffice.org/hilfe-kontakt/handbuecher/ - für das Base-Handbuch etwas nach unten scrollen.

Gruß

Robert

Re: Feldinhalt über alle Datensätze zu einem String verbinde

Verfasst: Mo, 05.11.2012 22:48
von F3K Total
Moin,
anbei ein kleines Beispiel mit einem Makro.
Öffne das Formular Kontakte, markiere gewünschte Einträge in der Spalte export, drücke "Auswahl speichern" dann "EMails verbinden".
Der gewünschte Text erscheint im Textfeld und kann mit strg + C in die Zwischenablage kopiert werden.

Das verwendete Makro sieht so aus:

Code: Alles auswählen

Sub S_Join_Email_Adresses
    oform = Thiscomponent.drawpage.forms.MainForm
    oform.first
    oresult = oform.createresultset
    nemailcolumn = oresult.findcolumn("email")'Spaltennummer email auslesen
    nexportcolumn = oresult.findcolumn("export")'Spaltennummer export auslesen
    dim sEmails(0) as string
    i = 0
    do
         if oresult.getboolean(nexportcolumn) = true then 'Wenn export angehakt
             redim preserve sEmails(i)
             sEmails(i) = oresult.getstring(nemailcolumn) '...Adresse auslesen
             i = i+1
         endif
    loop while oresult.next
    salleEmail = join(sEmails,"; ")'verbinden
    otxtEmails = oform.txtEmails
    otxtEmails.string = salleEmail
end sub
Dies funktioniert so nur, wenn die Namen der Kontrollelemente und Tabellenspalten dazu passen:

Auf dem Formular:
MainForm
txtEmails

In der Tabelle Kontakte die Spalten
email
export


Viel Erfolg beim Nachvollziehen

Gruß R

Re: Feldinhalt über alle Datensätze zu einem String verbinde

Verfasst: Mo, 05.11.2012 23:25
von mgo
Hi,

@ R: perfekt, genau das habe ich gesucht! Habs angepasst und es funktioniert super!

@all: Danke für Eure Hilfe!

lg Michi

Re: Feldinhalt über alle Datensätze zu einem String verbinde

Verfasst: Di, 06.11.2012 02:10
von komma4
...und jetzt ich noch mit einer Lösung 8)

Ausführen eines SQL-Befehls über Extras>SQL..., bei der eingebauten HSQLDB bspw.

Code: Alles auswählen

SELECT "spaltenname"  INTO TEXT "meineSpalteAlsText" FROM "tabellenname" 
[erstellt im Verzeichnis der Datenbank-Datei (*.odb) eine Datei meineSpalteAlsText.csv]

und dann ersetzen des Zeilenumbruchs pro Zeile durch Semikolon (unter Linux)

Code: Alles auswählen

cat meineSpalteAlsText.csv | tr '\n' ';' > meineSpalteAlsTextHintereinander
Kein Makro, keine umständlichen SQL-Befehle

Re: Feldinhalt über alle Datensätze zu einem String verbinde

Verfasst: Di, 06.11.2012 10:42
von Rocko
Zu guter Letzt (?) eine ganz einfache Lösung mit der Serienbrieffunktion ...

Erstelle ein leeres Writerdokument und öffne mit F4 die Datenbank mit deinen Emails. Dann ziehst du mit der Maus den Spaltenkopf der Mails ins Dokument, fügst danach einen Feldbefehl "Nächster Datensatz" mit Semikolon und Leerzeichen ein. Markiere die Eingabe und kopiere sie sooft, wie du sie brauchst. (Lässt sich auch gruppenweise kopieren.)

Wenn dich die Feldbefehle dann stören sollten: Einfach markieren, ausschneiden und als unformatierten Text an derselben Stelle wieder einfügen.