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-Key: 329523

Url: https://administrator.de/contentid/329523

Printed on: April 23, 2024 at 15:04 o'clock

Member: Kraemer
Kraemer Feb 15, 2017 at 18:20:53 (UTC)
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
Member: em-pie
Solution em-pie Feb 15, 2017 updated at 20:24:06 (UTC)
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
Member: Dr.Cornwallis
Solution Dr.Cornwallis Mar 08, 2017 at 20:16:05 (UTC)
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.