Dateneingabe in Haupt- und Unterformular

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.

Die Tabellen der Beispielanwendung

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.

Das Unterformular der Anwendung

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

Einbau des Unterformulars in das Hauptformular

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

Eingabe von Daten auf dem geplanten Weg

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

Ohne Kategorie wird auch das Fremdschlüsselfeld nicht vorbelegt

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

Nach dem Speichern im Hauptformular wird der Fremdschlüsselwert im Unterformular wieder auf den richtigen Wert eingestellt.

Bild 6: Nach dem Speichern im Hauptformular wird der Fremdschlüsselwert im Unterformular wieder auf den richtigen Wert eingestellt.

Nach dem Ergänzen der Kategorie verschwindet der Datensatz im Unterformular.

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

Der Produkt-Datensatz wurde angelegt - wenn auch ohne Kategorie.

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.

Verhindern von Datensätzen ohne Fremdschlüsselwert

Du hast das Ende des frei verfügbaren Textes erreicht. Möchtest Du ...

Oder bist Du bereits Abonnent und hast Zugangsdaten? Dann logge Dich gleich hier ein:
Die Zugangsdaten findest Du im aktuellen gedruckten Heft oder in der E-Mail, die Du als Abonnent mit jeder neuen Ausgabe erhältst.

Schreibe einen Kommentar