857 Aufrufe
Gefragt in Datenbanken von neki Einsteiger_in (19 Punkte)
Hallo,

ich habe schon wie verrückt gegoogelt, finde aber keine wirkliche Lösung und ich hoffe, ihr könnt mir helfen.

Folgende Ausgangssituation in einer Datenbank gibt es eine Tabelle, in der Mandantennamen gespeichert werden. Und dann gibt es beispielsweise eine Tabelle Artikel, die es für jeden Mandanten gibt - diese Tabellen heissen haben jeweils den Mandantennamen + $ vorangestellt.

Stark vereinfacht in etwa so:

Tabelle Mandant
- Name

Tabelle Mandant1$Artikel
- Artikelnr.
- Artikelbezeichnung

Tabelle Mandant2$Artikel
- Artikelnr.
- Artikelbezeichnung

Ziel wäre eine Abfrage über alle Artikeltabellen, z.B. um Preise aus allen Mandanten auszulesen o.ä.

Da es sich um mehrere Mandanten handelt und auch immer wieder welche hinzukommen, scheidet ein Query pro Mandant aus.

Meine Google-Suche hat mich irgendwie auf dynamisches SQL gebracht, aber der Lösung bin ich nicht wirklich nähergekommen.

Bin für jede Hilfe danke.

LG neki

P.S. Ja, ich weiss, dass die Struktur der Datenbank nicht optimal ist, die ist aber auch nicht beeinflussbar, da es sich um ein nicht mal so kleines Standardsystem handelt. :-(

1 Antwort

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo neki,

das geht nur mit ein wenig VBA (sorry, ich verwende DAO und ADODB - halt quick&dirty):.
Function mandantenartikel()

Dim db As Database
Dim rst As New ADODB.Recordset
Dim qry As dao.QueryDef
Dim sqlstr As String

On Error GoTo Proc_Err
'
' SQL für Abfrage erstellen
'
rst.Open "SELECT * FROM Mandant", CurrentProject.Connection, adOpenStatic, adLockReadOnly
sqlstr = ""
While Not rst.EOF
sqlstr = sqlstr & IIf(sqlstr = "", "", " UNION ALL ") & "SELECT * from [" & rst!Mandant & "$Artikel]"
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
'
' Abfrage erstellen
'
Set db = CurrentDb

On Error Resume Next
db.QueryDefs.Delete ("Artikel_all")
On Error GoTo Proc_Err

Set qry = db.CreateQueryDef("Artikel_all", sqlstr)
qry.ReturnsRecords = True
qry.Close

db.Close
Set db = Nothing

Proc_Exit:
Exit Function

Proc_Err:
MsgBox Err.Description
Resume Proc_Exit
End Function

Mit dieser Funktion erstelle ich eine Abfrage mit allen Artikel-Tabellen zu den Mandanten in der Mandantentabelle. In dieser Variante gehe ich davon aus, dass zu jedem Mandanten auch eine Artikeltabelle existiert, sonst kracht es bei der Ausführung der Abfrage. Willst du keine Abfrage sondern eine Tabelle, lässt sich das auch realisieren. Doppelte Artikeleinträgellassen sich vermeiden, nimmeinfach das Schlüsselwort "ALL" aus der UNION-Abfrage raus. Falls du noch weitere Tabellen mit anderen Inhalten zu Mandanten hast, lässt sich die Funktion dahingehend auch verallgemeinern. Hast du dir so was vorgestellt?

Gruß
Ralf
...