Feldinhalt über alle Datensätze zu einem String verbinden

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

mgo
Beiträge: 9
Registriert: Mi, 31.10.2012 15:10

Feldinhalt über alle Datensätze zu einem String verbinden

Beitrag 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
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

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

Beitrag 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
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

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

Beitrag 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
Dateianhänge
Multi_Email_String.odb
(24.51 KiB) 89-mal heruntergeladen
mgo
Beiträge: 9
Registriert: Mi, 31.10.2012 15:10

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

Beitrag von mgo »

Hi,

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

@all: Danke für Eure Hilfe!

lg Michi
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag 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
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Rocko
*******
Beiträge: 1164
Registriert: Do, 11.10.2012 13:19

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

Beitrag 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.
Hast du schon mal einen Blick in die Writer-FAQ und in die Calc-FAQ des Forums geworfen?
Für jeden vor dem Beginn seiner Seminararbeit ein unbedingtes MUSS: http://openoffice-uni.org/
Antworten