Treeview-Steuerelement mit Daten füllen

Zusammenfassung

Füllen Sie das Treeview-Steuerelement mit Daten aus einer oder mehreren Tabellen.

Techniken

Formulare, Treeview-Steuerelement, VBA

Voraussetzungen

Access 2002 und höher oder Access 97/2000 und Developer Edition oder Visual Studio 6.0

André Minhorst, Duisburg

Das Treeview-Steuerelement eignet sich wie kein anderes zur Anzeige von hierarchischen Daten. Dieser Beitrag zeigt Ihnen, wie Sie es mit Daten aus einer oder mehreren Tabellen füllen und wie Sie mit kleinen Tricks einiges an Performance herausholen können. Dabei kommen nicht nur Daten aus mehreren verknüpften Tabellen zum Zuge, sondern auch solche aus reflexiven Beziehungen.

Der Beitrag Das Treeview-Steuerelement (s. Shortlink 319) zeigt, wie Sie die Add-Methode der Nodes-Auslistung eines Treeview-Steuerelements verwenden, um Knoten an einen Baum anzufügen.

Das Ganze macht natürlich nur wenig Sinn, wenn Sie keine Daten haben, die Sie in das Treeview einpflegen können. Die bekannteste Anwendung des Treeview-Steuerelements ist wohl der Windows Explorer. Hier finden Sie auf der linken Seite das Treeview-Steuerelement zur Anzeige der Verzeichnisse und auf der rechten Seite das ListView-Steuerelement für die im aktuell markierten Verzeichnis enthaltenen Unterverzeichnisse und Dateien.

Vermutlich wollen Sie unter Access nicht gerade den Windows Explorer nachbauen, sondern die in Ihrer Datenbank enthaltenen Daten anzeigen.

Das macht nur Sinn, wenn der anzuzeigende Ausschnitt der Daten hierarchisch aufgebaut ist. Die Daten können dabei aus einer einzelnen oder auch aus mehreren Tabellen stammen.

Wenn die Daten mehrerer Tabellen angezeigt werden sollen, müssen diese per 1:n-Beziehung miteinander verknüpft sein.

Auf diese Weise können Sie dann beispielsweise Kunden, Bestellungen und bestellte Artikel abbilden.

Bei einer einzelnen Tabelle kann es sich beispielsweise um eine Mitarbeitertabelle handeln, die etwa über ein Feld namens VorgesetzterID mit sich selbst verknüpft ist und die Hierarchie der Mitarbeiter abbildet.

In dem Fall zeigt das Treeview-Steuerelement nur die Mitarbeiter an. Die Verknüpfung einer Tabelle mit sich selbst heißt reflexive Verknüpfung.

Beim Anzeigen von Daten aus verknüpften Tabellen werden die in den Tabellen enthaltenen Datensätze entsprechend der Abbildung im Treeview-Steuerelement durchlaufen.

Bei zwei Tabellen bedeutet dies, dass in einer äußeren Schleife die Datensätze der Haupttabelle und in einer inneren Schleife die Datensätze der untergeordneten Tabelle durchlaufen werden.

Beispiel: Kunden und Bestellungen

Am besten lässt sich das an einem Beispiel erklären. Dazu fügen Sie einem leeren Formular ein neues Treeview-Steuerelement hinzu und nennen es tvwTreeview.

Anschließend benötigen Sie nur noch eine Routine, die beim öffnen des Formulars ausgelöst wird und die Kunden- und Bestelldaten in das Treeview-Steuerelement schreibt. Diese Routine sieht wie in Quellcode 1 aus.

Die Routine deklariert und instanziert ein Database- und zwei Recordset-Objekte zum Referenzieren der beiden Tabellen Kunden und Bestellungen.

In der ersten Do While-Schleife werden die Kunden durchlaufen. Dabei wird für jeden Kunden ein Knoten im Treeview angelegt. Innerhalb dieser Schleife wird außerdem das Recordset-Objekt rstBestellungen mit den Bestellungen gefüllt, die zum aktuellen Kunden gehören. Diese werden in einer weiteren Do While-Schleife unterhalb des aktuellen Kunden in das Treeview-Steuerelement eingefügt.

Werte der Key-Eigenschaft

Zu beachten ist dabei die Benennung der Key-Eigenschaft eines jeden Knotens. Dieser muss aus einer Zeichenkette mit einem Buchstaben am Anfang bestehen und eindeutig sein. Außerdem sollte man aus dieser Eigenschaft möglichst den zugrunde liegenden Datensatz identifizieren können, also den Primärschlüssel oder einen anderen eindeutigen Wert in den Key-Wert integrieren.

Normalerweise könnte man einfach einen beliebigen Buchstaben (etwa “a”) verwenden und hinten den Wert des Primärschlüsselfeldes der Tabelle anhängen:

"a" & rst!ID

Wenn Sie es aber wie im vorliegenden Fall mit mehr als einer Tabelle zu tun haben, ist die Eindeutigkeit der Primärschlüsselfelder nicht mehr gewährleistet: Es kann ja durchaus in beiden Tabellen einen Primärschlüssel mit dem Wert 1 geben.

Also müssen Sie sich etwas anderes einfallen lassen. Die Lösung ist allerdings recht einfach: Da der Key-Wert eine beliebige Zeichenkette beinhalten darf, können Sie diesen einfach je Tabelle mit einem anderen Wert beginnen lassen. Im vorliegenden Fall beginnen die Key-Werte dementsprechend mit “Kunde” und “Bestellung”.

Das Ergebnis der Routine sieht wie in Bild 1 aus. Per Doppelklick auf einen der Kunden zeigen Sie die zu dem Kunden gehörenden Bestellungen an.

Bild 1: Einfache hierarchische Daten im Treeview-Steuerelement

Die Tabelle Personal der Nordwind-Datenbank liefert ein gutes Beispiel für eine reflexive Beziehung. Einige der Datensätze sind über das Feld Vorgesetzte(r) mit Feldern der gleichen Tabelle verknüpft und liefern damit Informationen über die Hierarchie der Mitarbeiter.

Diese lässt sich natürlich in einem Treeview-Steuerelement weitaus besser veranschaulichen als in einer Tabelle (siehe Bild 2).

Quellcode 1: Treeview-Steuerelement mit Daten aus zwei verknüpften Tabellen füllen

Dim objTreeview As MSComctlLib.Treeview
Private Sub Form_Open(Cancel As Integer)
    Dim db As DAO.Database
    Dim rstKunden As DAO.Recordset
    Dim rstBestellungen As DAO.Recordset
    Dim objNode As MSComctlLib.Node
    Set db = CurrentDb
    Set rstKunden = db.OpenRecordset("Kunden")
    Set objTreeview = Me.ctlTreeview.Object
    Do While Not rstKunden.EOF
        Set objNode = objTreeview.Nodes.Add(, , "Kunde" & rstKunden![Kunden-Code], _            rstKunden!Firma)
        Set rstBestellungen = db.OpenRecordset _            ("SELECT * FROM Bestellungen WHERE [Kunden-Code] = ''" & rstKunden![Kunden-Code] & "''")
        Do While Not rstBestellungen.EOF
            objTreeview.Nodes.Add "Kunde" & rstKunden![Kunden-Code], tvwChild, "Bestellung" _                & rstBestellungen![Bestell-Nr], rstBestellungen![Bestell-Nr] & "/" _                & rstBestellungen!Bestelldatum
            rstBestellungen.MoveNext
        Loop
        rstKunden.MoveNext
    Loop
    Set objNode = Nothing
    rst.Close
    Set rst = Nothing
    Set db = Nothing
End Sub

Bild 2: Mitarbeiter und ihre Untergebenen

Für das Füllen des Treeview-Steuerelements mit Daten aus einer reflexiven Beziehung ist im Prinzip Rekursion erforderlich, das heißt, dass eine Funktion sich entsprechend der Hierarchie immer wieder selbst aufruft und dabei untergeordnete Objekte abarbeitet, bis schließlich alle Daten berücksichtigt wurden.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar