MS Access: Mehrere Zeilen in einer Zelle zusammenfassen
Hallo!
Wir haben drei Tabellen
KUNDEN
KundenID (P) | Name | Anschrift
1 | Müller, Max | ....
2 | Huber, Anton | ....
3 | Wernicke, Jenny | ....
SOFTWARE
SoftwareID (P) | Name | Lizenzanmerkung
1 | ProgrammA | ....
2 | ProgrammB | ...
3 | ProgrammC | ...
ZUORDNUNG_SOFTWARE
KundenID | SoftwareID
1 | 1
1 | 3
2 | 1
3 | 2
3 | 3
Ich benötige nun eine Liste mit den Spalten
Kunden.Name | Software
Dabei sollen in der Spalte "Software" die von den Kunden lizenzierten Programme durch Kommata getrennt aufgeführt werden. Also wie folgt:
Müller, Max | ProgrammA, ProgrammB
Huber, Anton | ProgrammA
Wernicke, Jenny | ProgrammB, ProgrammC
Die Internetrecherche ergab, dass MS Access keinen SQL-Befehl dafür kennt, sondern dass man eine VBS-Funktion einbauen muss. Gefunden habe ich:
Das kann man in eine SQL-Abfrage dann wie folgt einfügen:
Allerdings will ich ja nicht die KundenID und die SoftwareID, sondern den Kundennamen und den Programmnamen. Ich bekomme das aber nicht hin. Sobald ich die SQL-Abfrage in der VBS-Funktion umbauen will, kommen Fehlermeldungen. Hat jemand eine Idee, wie mein Problem gelöst werden kann?
Wir haben drei Tabellen
KUNDEN
KundenID (P) | Name | Anschrift
1 | Müller, Max | ....
2 | Huber, Anton | ....
3 | Wernicke, Jenny | ....
SOFTWARE
SoftwareID (P) | Name | Lizenzanmerkung
1 | ProgrammA | ....
2 | ProgrammB | ...
3 | ProgrammC | ...
ZUORDNUNG_SOFTWARE
KundenID | SoftwareID
1 | 1
1 | 3
2 | 1
3 | 2
3 | 3
Ich benötige nun eine Liste mit den Spalten
Kunden.Name | Software
Dabei sollen in der Spalte "Software" die von den Kunden lizenzierten Programme durch Kommata getrennt aufgeführt werden. Also wie folgt:
Müller, Max | ProgrammA, ProgrammB
Huber, Anton | ProgrammA
Wernicke, Jenny | ProgrammB, ProgrammC
Die Internetrecherche ergab, dass MS Access keinen SQL-Befehl dafür kennt, sondern dass man eine VBS-Funktion einbauen muss. Gefunden habe ich:
Option Compare Database
Public Function SZZZ(Feld As String) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT SoftwareID FROM Zuordnung_Software WHERE KundenID ='" & Feld & "'"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZZZ = SZZZ & " " & rs!SoftwareID
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Function
Das kann man in eine SQL-Abfrage dann wie folgt einfügen:
SELECT KundenID, SZZZ([KundenID]) AS Software
FROM Zuordnung_Software
GROUP BY KundenID;
Allerdings will ich ja nicht die KundenID und die SoftwareID, sondern den Kundennamen und den Programmnamen. Ich bekomme das aber nicht hin. Sobald ich die SQL-Abfrage in der VBS-Funktion umbauen will, kommen Fehlermeldungen. Hat jemand eine Idee, wie mein Problem gelöst werden kann?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 329523
Url: https://administrator.de/contentid/329523
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
3 Kommentare
Neuester Kommentar
Moin,
Gruß Krämer
Zitat von @User1000:
Allerdings will ich ja nicht die KundenID und die SoftwareID, sondern den Kundennamen und den Programmnamen. Ich bekomme das aber nicht hin. Sobald ich die SQL-Abfrage in der VBS-Funktion umbauen will, kommen Fehlermeldungen. Hat jemand eine Idee, wie mein Problem gelöst werden kann?
Ja, die Fehlermeldungen habe eine Idee, wie man das Problem lösen könnte...Allerdings will ich ja nicht die KundenID und die SoftwareID, sondern den Kundennamen und den Programmnamen. Ich bekomme das aber nicht hin. Sobald ich die SQL-Abfrage in der VBS-Funktion umbauen will, kommen Fehlermeldungen. Hat jemand eine Idee, wie mein Problem gelöst werden kann?
Gruß Krämer
Moin,
zunächst mal nur als Hilfestellungen:
schaue dir mal dden Link hier an:
http://stackoverflow.com/questions/21380730/ms-access-equivalent-of-for ...
Um das dann auf deine Tabellen anzuwenden:
Aus deiner rein numerischen Tabelle ZUORDNUNG_SOFTWARE machst du eine "halbnumerische" (Stichwort Inner Join):
Diese verwendest du für den obigen Link um dann eine Tabelle ala
zu erhalten
Und die wiederum lässt du gegen deine erste Tabelle laufen.
Getestet oder emals benutzt habe ich das nicht, aber das wären erstmal nur Ansätze.
Fummeln müsstest du dann mal
Gruß
em-pie
zunächst mal nur als Hilfestellungen:
schaue dir mal dden Link hier an:
http://stackoverflow.com/questions/21380730/ms-access-equivalent-of-for ...
Um das dann auf deine Tabellen anzuwenden:
Aus deiner rein numerischen Tabelle ZUORDNUNG_SOFTWARE machst du eine "halbnumerische" (Stichwort Inner Join):
KundenID | Software
1 | ProgrammA
1 | ProgrammB
2 | ProgrammA
3 | ProgrammB
3 | ProgrammC
Diese verwendest du für den obigen Link um dann eine Tabelle ala
KundenID | Software
1 | ProgrammA, ProgrammB
2 | ProgrammA
3 | ProgrammA, ProgrammB, ProgrammC
Und die wiederum lässt du gegen deine erste Tabelle laufen.
Getestet oder emals benutzt habe ich das nicht, aber das wären erstmal nur Ansätze.
Fummeln müsstest du dann mal
Gruß
em-pie
Moin,
ich würde die Felder in der Zuordnungstabelle(Kunden_Zuordnung) wie folgt umbauen:
Feld KundenID: Auf Kombifeld umstellen, dann als Datensatzherkunft folgenden SQL String:
Dann:
Spaltenanzahl: 2
Spaltenbreite: 0cm;2,5cm
Feld SoftwareID: auch auf Kombifeld umstellen, SQL String:
Spalten und Breiten wieder wie oben einstellen.
Vorteil: Die DB arbeitet weiter mit den ID's(Zahlen), zeigt aber die Namen an.
Du kannst die Kombifelder natürlich beliebig erweitern(zB. Anschrift und co.).
Tipp: benutze auch bei dem Zuordnungstable eine eigene ID, dann kann man die DB leichter erweitern.
ZuordnungsID, KundenID, SoftwareID
Gruß
Dr.
ich würde die Felder in der Zuordnungstabelle(Kunden_Zuordnung) wie folgt umbauen:
Feld KundenID: Auf Kombifeld umstellen, dann als Datensatzherkunft folgenden SQL String:
SELECT Kunden.KundenID, Kunden.Name FROM Kunden
Spaltenanzahl: 2
Spaltenbreite: 0cm;2,5cm
Feld SoftwareID: auch auf Kombifeld umstellen, SQL String:
SELECT Software.SoftwareID, Software.Name FROM Software
Vorteil: Die DB arbeitet weiter mit den ID's(Zahlen), zeigt aber die Namen an.
Du kannst die Kombifelder natürlich beliebig erweitern(zB. Anschrift und co.).
Tipp: benutze auch bei dem Zuordnungstable eine eigene ID, dann kann man die DB leichter erweitern.
ZuordnungsID, KundenID, SoftwareID
Gruß
Dr.