Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2002.

Diesen Artikel jetzt als PDF plus Beispieldatenbank herunterladen?

Wenn Sie sich jetzt für den Newsletter anmelden, erhalten Sie in Kürze eine E-Mail mit dem Artikel im PDF-Format plus Beispieldatenbank.

Hier anmelden:973518

E-Mail:

Anrede:

Vorname:

Nachname:

Rekursive Beziehungen mit Access

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.

Abb. 1: Entwurfsansicht der Tabelle tblMitarbeiter

Aufbau einer rekursiven
Beziehung

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 (s. Abb. 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 Abb. 2.

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

Abb. 3: Datensatzherkunft des Nachschlagefeldes

Abb. 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 Abb. 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 (s. Abb. 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 Vorgesetzten
    ausschließen

    In Abb. 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.

    Formular zur Darstellung einer rekursiven Beziehung

    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.

    Abb. 5: Das Formular frmMitarbeiter in der Formularansicht

    Abb. 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 Abb. 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 Abb. 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

    Abb. 7: Die Union-Abfrage im Datenbankfenster

    Abb. 8: Auswahl eines Mitarbeiters als Vorgesetzten

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Diesen Artikel jetzt als PDF plus Beispieldatenbank herunterladen?

    Wenn Sie sich jetzt für den Newsletter anmelden, erhalten Sie in Kürze eine E-Mail mit dem Artikel im PDF-Format plus Beispieldatenbank.

    Hier anmelden:

    E-Mail:

    Anrede:

    Vorname:

    Nachname:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.