Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

4.5.11 m:n-Beziehungen per Listenfeld

4.5.12 Reflexive Beziehungen

Für die Darstellung der Daten aus reflexiven Beziehungen bietet sich das Treeview-Steuerelement an. Mit ein wenig Fantasie lassen sich hierarchische Daten zwar auch in Listenfeldern oder gar in Textfeldern anzeigen, aber ihre Anwendung macht nicht wirklich Spaß. Daher finden Sie nachfolgend eine Anleitung zum Erstellen eines Formulars mit einen Treeview-Steuerelement zur Darstellung der Hierarchie von Mitarbeitern und ihren Vorgesetzten.

Eine ausführliche Vorstellung der Funktionen und Möglichkeiten des Treeview-Steuerelements finden Sie in Kapitel 5, »Steuerelemente«.

Das Treeview-Steuerelement legen Sie über den Dialog ActiveX-Steuerelement einfügen an, den Sie mit dem Ribbon-Eintrag Entwurf|Steuerelemente|ActiveX-Steuerelement einfügen aufrufen (siehe Abbildung 4.54). Benennen Sie das neu hinzugefügte Steuerelement ctlTreeview. Anschließend können Sie direkt den für das Füllen des Treeview-Steuerelements benötigten Code schreiben.

Füllen des Treeview-Steuerelements

Zum Speisen des Treeview-Steuerelements mit Daten aus einer Tabelle mit einer reflexiven Beziehung benötigen Sie eine rekursive Prozedur. Das bedeutet, dass sich die Prozedur immer wieder selbst aufruft, solange die Datensatzquelle tiefer verschachtelte Elemente enthält, und erst dann die folgenden Elemente der übergeordneten Ebenen abarbeitet. Den Start macht allerdings eine herkömmliche Routine. Sie legt eine modulweit gültige Variable namens objTreeview mit einem Verweis auf das Steuerelement an.

Abbildung 4.54: Einfügen des Treeview-Steuerelements

Anschließend durchläuft die Routine alle Datensätze eines Recordsets mit allen Mitarbeitern, die keinen Vorgesetzten haben, und fügt je einen Knoten zum Treeview-Steuerelement hinzu. Dabei legt sie als Beschriftung den Nachnamen und den Vornamen des aktuellen Mitarbeiters an. Außerdem verwendet sie die Key-Eigenschaft des neuen Elements, um den Wert des Feldes MitarbeiterID des aktuellen Datensatzes hinzuzufügen. Da Werte der Eigenschaft Key mit einem Buchstaben beginnen müssen, stellt die Routine ein »x« voran. Nach dem Anlegen des Knotens ruft sie die Routine zum Anlegen der untergeordneten Mitarbeiter auf - dazu weiter unten mehr. Im Anschluss daran werden weitere Datensätze - soweit vorhanden - auf die gleiche Art abgearbeitet.

Dim objTreeview As TreeView
Dim db As DAO.Database
Private Sub Form_Load()
    Dim rst As DAO.Recordset
    Dim objNode As Node
    Dim objListItem As ListItem
    Set objTreeview = Me!ctlTreeview.Object
    objTreeview.Nodes.Clear
    Set db = CurrentDb
    Set rst = db.OpenRecordset( _
        "SELECT * FROM tblMitarbeiterMitVorgesetzten " _
        & "WHERE VorgesetzterID IS NULL", dbOpenDynaset)
    Do While Not rst.EOF
        Set objNode = objTreeview.Nodes.Add
        With objNode
            .Text = rst!Nachname & ", " & rst!Vorname
            .Key = "x" & rst!MitarbeiterID

        End With
        AddChilds rst!MitarbeiterID
        rst.MoveNext
    Loop
End Sub

Listing 4.24: Diese Routine fügt die Elemente der ersten Ebene in das Treeview-Steuerelement ein

Die Routine AddChilds erwartet die MitarbeiterID des übergeordneten Mitarbeiters als Parameter. Per OpenRecordset legt die Routine eine Datensatzgruppe an, die alle Mitarbeiter-Datensätze enthält, deren Vorgesetzter der Mitarbeiter mit der übergebenen MitarbeiterID ist.

Anschließend wird für jeden »Untergebenen« ein Element unterhalb des Vorgesetzten angelegt. Um das Element des Vorgesetzten zu ermitteln, setzt die Routine den Buchstaben »x« und die MitarbeiterID zu dem Wert zusammen, den die aufrufende Routine als Key für den übergeordneten Mitarbeiter angelegt hat, und findet so das passende Element.

Für jeden »Untergebenen« wird diese Routine rekursiv aufgerufen, um auch die »Untergebenen« der »Untergebenen« zu finden und entsprechende Elemente anzulegen.

Private Sub AddChilds(lngMitarbeiterID As Long)
    Dim rst As DAO.Recordset
    Dim objNode As Node
    Set rst = db.OpenRecordset( _
        "SELECT * FROM tblMitarbeiterMitVorgesetzten " _
        & "WHERE VorgesetzterID = " _
        & lngMitarbeiterID, dbOpenDynaset)
    Do While Not rst.EOF
        Set objNode = objTreeview.Nodes.Add(Relative:="x" _
            & lngMitarbeiterID, Relationship:=tvwChild)
        With objNode
            .Text = rst!Nachname & ", " & rst!Vorname
            .Key = "x" & rst!MitarbeiterID
        End With
        AddChilds rst!MitarbeiterID
        rst.MoveNext
    Loop
End Sub

Listing 4.25: Rekursiver Teil der Prozeduren zum Füllen des Treeview-Steuerelements

Auf diese Weise werden alle Datensätze durchlaufen und dem Treeview-Steuerelement hinzugefügt.

Anzeigen des Detailformulars zu einem Element

Natürlich sollen Sie auch etwas mit dem gefüllten Treeview anfangen können. Daher finden Sie nachfolgend eine kleine Routine, die nach einem Klick auf eine dafür vorgesehene Schaltfläche ein Detailformular mit den Daten des aktuell im Treeview-Steuerelement markierten Eintrags anzeigt:

Private Sub cmdDetails_Click()
    Dim lngMitarbeiterID As Long
    lngMitarbeiterID = CLng(Mid(objTreeview.SelectedItem.Key, 2))
    DoCmd.OpenForm "frmMitarbeiterDetail", _
        WhereCondition:="MitarbeiterID = " & lngMitarbeiterID
End Sub

Listing 4.26: Code zum Öffnen eines Detailformulars zum aktuellen Element des Treeview-Steuerelements

Das gefüllte Treeview-Steuerelement mit Detailformular für einen der Einträge sieht wie in Abbildung 4.55 aus.

Abbildung 4.55: Treeview-Steuerelement mit Detailformular (»frmMitarbeiterMitVorgesetzten«, »frmMitarbeiterDetail«)

Nächster Abschnitt:

4.6 Von Formular zu Formular

© 2006-2008 André Minhorst Alle Rechte vorbehalten.