Rekursive Beziehungen mit Access

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Autor: André Minhorst, Duisburg

Neben den herkömmlichen 1:1-, 1:n- und m:n-Beziehungen gibt es noch eine weitere Beziehungsart, die von Access nicht unbedingt gefördert und daher größtenteils manuell nachzubilden ist: die rekursive Beziehung. Mit einer rekursiven Beziehung können Sie Verknüpfungen zwischen den Datensätzen einer einzigen Tabelle nachbilden. Dies ist z. B. gefragt, wenn Sie die Hierarchie der Mitarbeiter einer Firma nachbilden möchten. Im vorliegenden Beitrag erfahren Sie, wie eine rekursive Beziehung aufgebaut wird, was Sie bei der Datenpflege beachten müssen und wie Sie die gewünschten Daten anwendergerecht anzeigen können.

Es gibt eine Menge von Beispielen für rekursive Beziehungen – die bereits genannte Mitarbeiterhierarchie ist lediglich ein Paradebeispiel. Das Gleiche gilt für die Verwaltung von Stücklisten, für Familienstammbäume, Unternehmensstrukturen usw. Auch die Anzeige der Dateistruktur im Windows Explorer ist – im weitesten Sinne – ein Beispiel für eine rekursive Beziehung.

Als Beispiel soll die Beziehung zwischen Vorgesetzten und untergeordneten Mitarbeitern eines Unternehmens beschrieben werden. Dabei ist eigentlich nur eine kleine Regel zu beachten: Jeder Mitarbeiter darf nur einen Vorgesetzten haben. Dies ist schließlich auch leicht zu realisieren, indem dieser für jeden Datensatz per Nachschlagefeld ausgewählt wird.

Bild 1: Entwurfsansicht der Tabelle tblMitarbeiter

Um den Aufbau einer rekursiven Beziehung anhand eines Beispiels zu erläutern, bedarf es lediglich einer einzigen Beispieltabelle. Die Tabelle beinhaltet nur vier Felder: ein Primärindexfeld namens MitarbeiterNr, zwei Felder zur Umschreibung des Namens sowie ein Verknüpfungsfeld zur Auswahl des Vorgesetzten des Mitarbeiters (siehe Bild 1).

Um einige Daten in die Tabelle einzugeben, müssen Sie lediglich noch das Verknüpfungsfeld Vorgesetzter anpassen. Es soll zu Beispielzwecken als Nachschlagefeld ausgeführt werden.

Keine Unterstützung durch den Assistenten

Wenn Sie nun den Assistenten für die Erstellung des Nachschlagefeldes verwenden möchten, stellt sich schnell Ernüchterung ein.

Im zweiten Schritt des Dialoges erscheint nämlich die Meldung aus Bild 2.

Bild 2: Die Erstellung eines Nachschlagefeldes ist nicht möglich.

Bild 3: Datensatzherkunft des Nachschlagefeldes

Bild 4: Auswahl eines Vorgesetzten

Nachdem Access auf diese Weise zu erkennen gegeben hat, dass es die Erstellung rekursiver Beziehungen nicht unterstützt, müssen Sie das Nachschlagefeld von Hand erstellen. Gehen Sie dazu folgendermaßen vor:

  • öffnen Sie die Tabelle in der Entwurfsansicht.
  • Wählen Sie für die Eigenschaft Felddatentyp des Feldes Vorgesetzter den Eintrag Zahl aus.
  • Wechseln Sie im Register zur Anzeige der Feldeigenschaften auf das Registerblatt Nachschlagen.
  • ändern Sie die Eigenschaft Steuerelement anzeigen auf den Wert Kombinationsfeld.
  • Klicken Sie in das leere Feld neben der Eigenschaft Datensatzherkunft und betätigen Sie die nun erscheinende Schaltfläche mit den drei Punkten (…).
  • Klicken Sie im Dialog doppelt auf den Eintrag Tabelle anzeigen, um die Tabelle in den Abfrageentwurf zu bringen.
  • Passen Sie den Abfrageentwurf entsprechend Bild 3 an und schließen Sie ihn.
  • Setzen Sie noch die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreite auf den Wert 0cm.
  • Anschließend können Sie die Tabelle in der Datenblattansicht anzeigen. Während Sie einige Daten eingeben, werden Sie feststellen, dass für das Feld Vorgesetzter derzeit noch keine Daten ausgewählt werden können. Erst nachdem Sie die Tabelle geschlossen und wieder geöffnet haben, erscheinen die bisher eingegebenen Einträge zur Auswahl im Kombinationsfeld (siehe Bild 4).

    Es gibt natürlich auch noch einen komplizierten Weg, um eine Beziehung zwischen Vorgesetztem und unterstellten Mitarbeitern realisieren zu können. Dazu verwenden Sie eine m:n-Be-ziehung, mit der Sie zu jedem Vorgesetztem beliebig viele Unterstellte auswählen können. Dadurch können aber Inkonsistenzen auftreten, da Sie einen Mitarbeiter als Unterstellten mehrerer Vorgesetzter wählen können.

    Das soll nicht der Fall sein, denn jeder Mitarbeiter darf nur einem Vorgesetzten zugeordnet werden. Daher ist die rekursive Beziehung der konsequentere Ansatz.

    Aktuellen Mitarbeiter als Vorgesetztenausschließen

    In Bild 4 findet sich nun ein kleiner Schönheitsfehler: Das Kombinationsfeld zur Auswahl des Vorgesetzten zeigt auch den Mitarbeiter an, für den der Vorgesetzte ausgewählt werden soll. Neben diesem Effekt soll außerdem verhindert werden, dass unterstellte Mitarbeiter als Vorgesetzte zur Auswahl stehen.

    Die Möglichkeiten, dies im Nachschlagefeld einer Tabelle zu realisieren, sind aber begrenzt. Statt-dessen werden Sie die anzuzeigenden Mitarbeiter in den entsprechenden Formularen einschränken.

    Auswahl keines Vorgesetzten

    In der Hierarchie von Unternehmen gibt es immer eine höchste Ebene, deren Mitarbeiter keinen Vorgesetzten haben. Man kann auf unterschiedliche Weise keinen Vorgesetzten auswählen. In der Datenblattansicht der Tabelle können Sie beispielsweise einfach keinen Wert auswählen. Anwenderfreundlicher wäre allerdings, wenn Sie direkt einen Eintrag mit dem Text <Kein Vorgesetzter> o. ä. bereithielten.

    Dazu gibt es prinzipiell zwei Möglichkeiten:

    Entweder Sie fügen der Mitarbeitertabelle selbst einen solchen Eintrag hinzu. Dies würde allerdings nicht besonders sinnvoll sein, da die Tabelle ja lediglich Mitarbeiter enthalten soll.

    Daher erweitern Sie einfach die Datensatzherkunft des Nachschlagefeldes bzw. später im Formular die Datensatzherkunft des Kombinationsfeldes zur Auswahl des Vorgesetzten per Union-Abfrage um einen entsprechenden Eintrag.

    Zur komfortablen Verwaltung der Vorgesetzten und Mitarbeiter benötigen Sie ein entsprechendes Formular.

    Anlegen des Formulars

    Legen Sie also ein neues Formular namens frmMitarbeiter an und öffnen Sie es zunächst in der Entwurfsansicht. Gehen Sie dann folgendermaßen vor:

  • ändern Sie die Eigenschaften Bildlaufleisten, Datensatzmarkierer und Trennlinien auf den Wert Nein.
  • Stellen Sie die Eigenschaft Beschriftung des Formulars auf den Wert Vorgesetzte und Mitarbeiter ein.
  • Wählen Sie anschließend als Datenherkunft des Formulars die Tabelle tblMitarbeiter aus.
  • Aktivieren Sie die Feldliste und ziehen Sie die Felder MitarbeiterID, Nachname, Vorname und Vorgesetzter in den Detailbereich.
  • Stellen Sie für das Feld MitarbeiterID die Eigenschaft Aktiviert auf den Wert Nein und die Eigenschaft Gesperrt auf den Wert Ja ein.
  • Der Wert des Feldes MitarbeiterID ist ein Autowert und kann ohnehin nicht verändert werden. Daher sperren Sie das Feld direkt.

    Außerdem sollten Sie – aus rein optischen Gründen – das Feld den Bezeichnungsfeldern anpassen, damit der Anwender gar nicht auf die Idee kommt, den Wert des Feldes MitarbeiterID manuell zu verändern.

    Bild 5: Das Formular frmMitarbeiter in der Formularansicht

    Bild 6: Datensatzherkunft des Kombinationsfeldes cboVorgesetzte

    Dies geht am schnellsten, indem Sie eines der Bezeichnungsfelder markieren, die Schaltfläche Format übertragen in der Symbolleiste anklicken und anschließend auf das Feld MitarbeiterID klicken.

    Wenn Sie die genannten Schritte durchgeführt haben, sollte das Ergebnis wie in Bild 5 aussehen.

    Anpassen des Kombinationsfeldes zur Eingabe von Vorgesetzten

    Der nächste Schritt ist die Anpassung des Kombinationsfeldes zur Anzeige der möglichen Vorgesetzten. Dabei sollen drei Ziele erreicht werden:

  • Unterbinden der Anzeige des gleichen Mitarbeiters
  • Unterbinden der Anzeige unterstellter Mitarbeiter
  • Anzeige des Eintrags <Kein Vorgesetzter>
  • Anzeige des aktuellen Mitarbeiters verhindern

    Das Kombinationsfeld zeigt ausnahmslos alle Mitarbeiter an, die in der Tabelle tblMitarbeiter enthalten sind.

    Zumindest der Mitarbeiter, für den ein Vorgesetzter ausgewählt werden soll, ist aus dem Kombinationsfeld zu entfernen. Gehen Sie dazu folgendermaßen vor:

  • öffnen Sie das Formular in der Entwurfsansicht und markieren Sie das Kombinationsfeld Vorgesetzter.
  • Um Verwechslungen zwischen dem Steuerelement namens Vorgesetzter und dem gleichnamigen Feld der Datenherkunft des Formulars zu verhindern, ändern Sie den Namen des Kombinationsfeldes auf cboVorgesetzter ab.
  • Klicken Sie im Register Daten des Eigenschaftsfensters in das Feld für die Eigenschaft Datensatzherkunft.
  • öffnen Sie die Entwurfsansicht der zugrunde liegenden Abfrage durch einen Mausklick auf die nun erscheinende Schaltfläche mit den drei Punkten (…).
  • Es erscheint die Datensatzherkunft in der Entwurfsansicht. Passen Sie diese entsprechend Bild 6 an.
  • Die neue Variante der Abfrage enthält nun ein Kriterium, das nur noch diejenigen Datensätze anzeigt, deren MitarbeiterID nicht mit der MitarbeiterID des aktuell im Formular angezeigten Mitarbeiters übereinstimmt.

    Wenn Sie den Abfrageentwurf geschlossen haben und in die Formularansicht des Formulars wechseln, können Sie bereits alle Mitarbeiter außer dem aktuell angezeigten mit dem Kombinationsfeld auswählen.

    SELECT MitarbeiterID, [Nachname] & ", " & [Vorname] AS _     Mitarbeiter
    FROM tblMitarbeiter
    WHERE MitarbeiterID <>         [Forms]![frmMitarbeiter]![MitarbeiterID]
    UNION 
    SELECT 0 AS MitarbeiterID, "<Kein Vorgesetzter>" 
    AS Mitarbeiter 
    FROM tblMitarbeiter;

    Quellcode 1

    Bild 7: Die Union-Abfrage im Datenbankfenster

    Bild 8: Auswahl eines Mitarbeiters als Vorgesetzten

    Wenn ein Mitarbeiter keinen Vorgesetztenhat …

    Unter Umständen soll für einen Mitarbeiter kein Vorgesetzter ausgewählt werden – z. B. weil der Mitarbeiter aus der höchsten Ebene der Unternehmenshierarchie stammt.

    Für diesen Fall soll das Kombinationsfeld zum Anzeigen eines solchen Eintrags vorbereitet werden. Dazu müssen Sie lediglich die Datensatzherkunft des Kombinationsfeldes um einen Eintrag erweitern. Da dieser – wie bereits erwähnt – nicht in der Tabelle tblMitarbeiter enthalten ist, müssen Sie ihn der Datensatzherkunft per Union-Abfrage hinzufügen.

    Union-Abfragen werden in der Abfrage-Entwurfsansicht leider nicht unterstützt, sodass Sie die Erweiterung in der SQL-Ansicht vornehmen müssen.

    öffnen Sie die Abfrage dazu erneut in der Entwurfsansicht und wechseln Sie dann in die SQL-Ansicht. Geben Sie dort den Ausdruck aus Quellcode 1 ein bzw. ergänzen Sie den bestehenden Teil um den Abschnitt, der mit dem SQL-Schlüsselwort Union beginnt.

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

    Testzugang

    eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar