Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Wenn man Daten in die Tabellen einer 1:n-Beziehung eingeben möchte, nutzt man in der Regel ein Haupt- und ein Unterformular. Das Hauptformular nimmt die Daten der Mastertabelle auf, das Unterformular die Daten der Detailtabelle. Wenn man nun keine weiteren Vorsichtsmaßnahmen trifft, kann der Benutzer Daten in das Unterformular eingeben, ohne dass das Hauptformular einen Datensatz anzeigt. Damit erzeugt er Datensätze in der Detailtabelle, die mit keinem Datensatz der Mastertabelle verknüpft sind. Das ist aus mehreren Gründen schlecht – diese schauen wir uns an und zeigen, wie wir das Problem beheben können.
Beispieldatenbank
Wir wählen als einfaches Beispiel zwei Tabellen namens tblKategorien und tblProdukte. Die Tabelle tblProdukte ist über das als Nachschlagefeld ausgelegte Fremdschlüsselfeld KategorieID mit der Tabelle tblKategorien verknüpft, sodass wir für jedes Produkt eine Kategorie auswählen können. Im Datenmodell sehen die beiden Tabellen mit ihrer Verknüpfung wie in Bild 1 aus.
Bild 1: Die Tabellen der Beispielanwendung
Der Eigenschaft Datensatzquelle des Unterformulars sfmKategorienProdukte weisen wir die Tabelle tblProdukte hinzu. Aus der Feldliste ziehen wir alle Felder in den Detailbereich des Formularentwurfs und stellen die Eigenschaft Standardansicht auf Datenblatt ein (siehe Bild 2). Danach speichern und schließen wir dieses Formular.
Bild 2: Das Unterformular der Anwendung
Für das Hauptformular frmKategorienProdukte legen wir die Tabelle tblKategorien als Datensatzquelle fest. Auch hier ziehen wir alle Felder aus der Feldliste in den Detailbereich. Außerdem ziehen wir das Formular sfmKategorienProdukte aus dem Navigationsbereich in das Hauptformular frmKategorienProdukte und platzieren es unterhalb der hinzugefügten Felder. Access erkennt dabei automatisch die Beziehung zwischen den Tabellen, die als Datensatzquelle für die beiden Formulare dienen, und trägt die Verknüpfungsfelder, also das Fremdschlüsselfeld der Tabelle tblProdukte und das Primärschlüsselfeld der Tabelle tblKategorien, in die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformular-Steuerelements ein (siehe Bild 3).
Bild 3: Einbau des Unterformulars in das Hauptformular
Problem: Produkte ohne Kategorie
Geht man in diesem Formular den üblichen Weg und legt zunächst eine Kategorie an, bevor man ein Produkt hinzufügt, werden die Daten miteinander verknüpft und das Fremdschlüsselfeld KategorieID der Tabelle tblProdukte weist den gewünschten Wert der Tabelle tblKategorien auf. Das ist deswegen der Fall, weil das Fremdschlüsselfeld KategorieID im Unterformular automatisch mit dem Wert des Primärschlüsselfeldes im Hauptformular als Standardwert gefüllt wird (siehe Bild 4).
Bild 4: Eingabe von Daten auf dem geplanten Weg
Das ist insbesondere deshalb möglich, weil durch den Wechsel ins Unterformular der Datensatz im Hauptformular gespeichert wird und der Primärschlüsselwert der Kategorie bereits verfügbar ist.
Wir können in diesem Formular allerdings auch direkt einen Datensatz im Unterformular anlegen, ohne dass das Hauptformular einen Datensatz anzeigt – beziehungsweise während es einen neuen, leeren Datensatz anzeigt, für den es noch keinen automatisch vergebenen Primärschlüsselwert gibt. Wechseln wir ins Unterformular, ist das Fremdschlüsselfeld KategorieID noch nicht gefüllt (siehe Bild 5).
Bild 5: Ohne Kategorie wird auch das Fremdschlüsselfeld nicht vorbelegt
Wir können hier nun einen Datensatz anlegen, den wir Produkt 2 nennen. Fällt uns dann auf, dass wir noch die Kategorie anlegen wollten und wechseln wir dazu ins Hauptformular, ist der Datensatz im Unterformular noch sichtbar.
Sobald wir jedoch mit der Eingabe in die Felder des Hauptdatensatzes beginnen, wird das Primärschlüsselfeld gefüllt und somit passt der Datensatz im Unterformular nicht mehr zu diesem Datensatz – er hat den Wert Null im Fremdschlüsselfeld KategorieID, während das Primärschlüsselfeld KategorieID im Hauptformular nun den Wert 2 aufweist (siehe Bild 6). Speichern wir nun den Datensatz im Hauptformular, indem wir auf den Datensatzmarkierer klicken oder zum Unterformular wechseln, wird der Standardwert für das dortige Fremdschlüsselfeld KategorieID korrekt auf 2 eingestellt. Der dort angelegte Produkt-Datensatz bleibt jedoch verschwunden (siehe Bild 7).
Bild 6: Nach dem Speichern im Hauptformular wird der Fremdschlüsselwert im Unterformular wieder auf den richtigen Wert eingestellt.
Bild 7: Nach dem Ergänzen der Kategorie verschwindet der Datensatz im Unterformular.
Werfen wir einen Blick in die Tabelle tblProdukte, finden wir den verlorengeglaubten Datensatz allerdings wieder – er hat lediglich keinen Wert im Feld KategorieID, weshalb er im Formular nicht im Kontext einer Kategorie erscheint (siehe Bild 8).
Bild 8: Der Produkt-Datensatz wurde angelegt – wenn auch ohne Kategorie.
Der Datensatz erscheint erst wieder, wenn wir im Formular zu einer neuen, leeren Kategorie wechseln – dann passt der Fremdschlüsselwert Null wieder zu dem Primärschlüsselwert im Hauptformular, der für einen neuen, leeren Datensatz ebenfalls Null lautet. Den falsch erstellten Datensatz können wir nun löschen oder wir weisen ihm über das Nachschlagefeld in der Tabelle eine Kategorie zu.
Anlegen von Datensätzen im Unterformular ohne Datensatz im Hauptformular verhindern
Es gibt viele Wege, mit denen wir verhindern können, dass ein Datensatz im Unterformular angelegt wird, wenn das Hauptformular noch keinen Datensatz enthält.
Ein Weg ist, die Eigenschaft Eingabe erforderlich des Feldes KategorieID der Tabelle tblProdukte auf Ja einzustellen. Das erledigen wir wie in Bild 9 im Entwurf der Tabelle tblProdukte.
[
Bild 9: Verhindern von Datensätzen ohne Fremdschlüsselwert
Nun speichern und schließen wir die Tabelle und öffnen das Formular frmKategorienProdukte erneut. Hier wechseln wir nun wieder direkt ins Unterformular, während das Hauptformular einen neuen, leeren Datensatz anzeigt.
Sobald wir hier das erste Zeichen in eines der Felder eintippen und somit den Datensatz im Unterformular in den Bearbeitungszustand versetzen, erscheint die Meldung aus Bild 10.
Bild 10: Fehler beim Anlegen eines Produkt-Datensatzes ohne erforderlichen Wert im Feld KategorieID
Wir können dieser Meldung zwar nun folgen und einen Eintrag im Feld KategorieID auswählen. Aber erstens zeigen wir diese Feld hier nur an, um zu sehen, wann und ob die Beziehung über das Fremdschlüsselfeld hergestellt wird und zweitens wollen wir dem Benutzer nicht eine solche Meldung präsentieren.
Wir könnten an dieser Stelle noch weitergehen und diesen Fehler abfangen. Das ginge über das Ereignis Bei Fehler des Unterformulars, wo wir prüfen können, welcher Fehler aufgetreten ist und diesen Fehler entsprechend behandeln. Allerdings ist dieser Weg relativ aufwendig, daher schauen wir uns eine einfachere Alternative an.
Zugriff auf das Unterformular ohne Datensatz im Hauptformular verwehren
Dabei wollen wir verhindern, dass der Benutzer überhaupt auf das Unterformular zugreifen kann, wenn das Hauptformular noch keinen Datensatz aufweist. Das können wir mit einer sehr einfachen Maßnahme erreichen.
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