user1000
Goto Top

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

Content-ID: 329523

Url: https://administrator.de/forum/ms-access-mehrere-zeilen-in-einer-zelle-zusammenfassen-329523.html

Ausgedruckt am: 23.12.2024 um 03:12 Uhr

Kraemer
Kraemer 15.02.2017 um 19:20:53 Uhr
Goto Top
Moin,
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...

Gruß Krämer
em-pie
Lösung em-pie 15.02.2017 aktualisiert um 21:24:06 Uhr
Goto Top
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):

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

Gruß
em-pie
Dr.Cornwallis
Lösung Dr.Cornwallis 08.03.2017 um 21:16:05 Uhr
Goto Top
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:
SELECT Kunden.KundenID, Kunden.Name FROM Kunden
Dann:
Spaltenanzahl: 2
Spaltenbreite: 0cm;2,5cm

Feld SoftwareID: auch auf Kombifeld umstellen, SQL String:
SELECT Software.SoftwareID, Software.Name FROM Software
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.