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:
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:
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:
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:
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