Moin. Ich bin Sönke SchĂ€fer, der DatenschĂ€fer. Wenn Du Daten hast, die sich selbst referenzieren â also Kategorien, Unterkategorien, ĂŒbergeordnete Elemente â dann brauchst Du eine Strategie. Und die heiĂt in der Regel: Rekursion. Heute zeig ich Dir, wie Du das in VBA umsetzt. Trocken, aber grĂŒndlich.
Worum gehtâs hier eigentlich?
Ein typisches Beispiel: Du hast eine Tabelle tblKategorie.
- ID (PrimĂ€rschlĂŒssel)
- Bezeichnung
- ParentID (FremdschlĂŒssel auf ID)
Und nun willst Du die ganze Struktur durchlaufen. Zum Beispiel, um:
- eine Liste mit EinrĂŒckung zu erzeugen
- alle Unterknoten zu zÀhlen
- eine Navigation zu bauen
Das geht mit VBA â rekursiv, aber robust.
Das Grundprinzip: Funktion ruft sich selbst
Wir schreiben eine Funktion, die eine Kategorie-ID nimmt und alle Unterkategorien darunter durchlÀuft.
Variante: Hierarchie in die Immediate-Window schreiben
Sub ZeigeKategoriebaum(Optional parentID As Variant = Null, Optional einzug As String = "")
Dim rs As DAO.Recordset
Dim sql As String
If IsNull(parentID) Then
sql = "SELECT * FROM tblKategorie WHERE ParentID IS NULL"
Else
sql = "SELECT * FROM tblKategorie WHERE ParentID = " & parentID
End If
Set rs = CurrentDb.OpenRecordset(sql)
Do While Not rs.EOF
Debug.Print einzug & rs!Bezeichnung
ZeigeKategoriebaum rs!ID, einzug & " "
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Aufruf einfach mit:
Call ZeigeKategoriebaum
Du bekommst im Direktfenster die ganze Struktur, eingerĂŒckt nach Tiefe.
Was geht damit noch?
Du kannst mit dieser Logik auch:
- Dropdowns mit Unterstruktur aufbauen
- Kategoriepfade erzeugen (z.âŻB. „BĂŒro > Möbel > StĂŒhle“)
- EintrÀge sortiert ausgeben
Beispiel: Kategoriepfad ermitteln
Jetzt drehen wirâs um â von unten nach oben:
Function GetKategoriePfad(katID As Long) As String
Dim rs As DAO.Recordset
Dim pfad As String
Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblKategorie WHERE ID = " & katID)
If Not rs.EOF Then
If Not IsNull(rs!ParentID) Then
pfad = GetKategoriePfad(rs!ParentID) & " > "
End If
pfad = pfad & rs!Bezeichnung
End If
rs.Close
Set rs = Nothing
GetKategoriePfad = pfad
End Function
Einfach aufrufen mit:
Debug.Print GetKategoriePfad(42)
Ergebnis: âBĂŒro > Möbel > StĂŒhleâ
Stolperfallen
- Endlosschleifen bei zyklischen Daten (ID verweist auf sich selbst)
- Null-Handling nicht vergessen
- Sortierung immer mitdenken (z.âŻB. `ORDER BY`)
âRekursion ist wie Kaffee: Gut, aber zu viel davon macht nervös.â
Fazit vom DatenschÀfer
Wenn Du Hierarchiedaten in Access verarbeiten willst, brauchst Du rekursives Denken â und sauberen Code. Mit ein bisschen Planung kannst Du damit komplexe Navigationsstrukturen, Pfade, Berichte und UI-Elemente bauen. Wenn Du magst, unterstĂŒtz ich Dich gern dabei. Ich hab das schon oft fĂŒr KMU gebaut â ganz ohne Aufheben.
DatenschĂ€fer: Analyse, Auswertung und Automatisierung fĂŒr KMU im Norden đ
No responses yet