André Minhorst, Duisburg
Unterformulare werden meist in Zusammenhang mit der Darstellung von 1:n- oder m:n-Beziehungen verwendet. Dabei sind allzu schnell mit dem Unterformular Datensätze in die Detailtabelle geschrieben, obwohl es gar keinen Masterdatensatz gibt – und der Benutzer darf sich entweder mit den Access-Fehlermeldungen herumschlagen oder Inkonsistenzen in Kauf nehmen. Allein die Festlegung referentieller Integrität reicht hier nicht aus, um eine fehlerfreie Dateneingabe zu gewährleisten; dazu sind einige zusätzliche Handgriffe erforderlich.
Damit Sie die im folgenden Kapitel beschriebenen Hintergründe nachvollziehen können, legen Sie am besten zuvor das Beispielformular an – Sie müssen dazu nur zwei Tabellen der Nordwind-Datenbank importieren und mit einem Assistenten eine Kombination aus Haupt- und Unterformular erstellen.
Bild 1: Kategorien und Artikel in Haupt- und Unterformular
Das Beispielformular enthält die beiden Tabellen Artikel und Kategorien der Nordwind-Datenbank. Das Formular erstellen Sie ausnahmsweise mit dem Assistenten:
Der Assistent legt nun ein Formular namens Kategorien mit einem Unterformular an, das er unter dem Namen Artikel Unterformular speichert und direkt anzeigt (siehe Bild 1). Das Formular lässt sich optisch sicher noch verbessern, reicht aber für unseren Zweck völlig aus.
Dieses Formular verwenden Sie hier stellvertretend für alle Formulare, die dem Anzeigen und Bearbeiten von 1:n- oder m:n-Beziehungen dienen. Die nachfolgend beschriebenen Probleme treten in beiden Varianten auf.
Die Verwendung von Unterformularen als Steuerelement in Formularen dient in den meisten Fällen der Anzeige und Bearbeitung von Daten aus zwei miteinander verknüpften Tabellen. Dabei treten zwei Fälle auf:
In beiden Fällen sind einige Regeln für die Dateneingabe zu beachten. So ist es beispielsweise mit dem üblicherweise unter Access als Primärindex verwendeten Autowert nicht möglich, Daten in eine Detailtabelle einzutragen, wenn in der Mastertabelle kein entsprechender Datensatz vorliegt. Das funktioniert nur in dem Fall, dass für die Beziehung zwischen den beiden Tabellen keine referentielle Integrität festgelegt ist.
Der Verzicht auf Festlegung dieser Eigenschaft ist aber nur in wenigen Fällen akzeptabel, in allen anderen heißt es: Wo keine referentielle Integrität festgelegt ist, herrschen bald Redundanzen und Inkonsistenz.
Wenn Sie aber nun vernünftigerweise referentielle Integrität zwischen den betroffenen Tabellen festgelegt haben (außer natürlich, Sie haben einen guten Grund, davon abzusehen), können bei der Eingabe für den Benutzer unangenehme Probleme auftauchen – und zwar immer, wenn man Daten im Unterformular einträgt, ohne dass zuvor ein Datensatz im Hauptformular angelegt wurde. Einen Unterschied gibt es dabei in Abhängigkeit davon, ob Sie für das Fremdschlüsselfeld der Datenherkunft des Unterformulars Nullwerte zulassen oder nicht.
Gehen wir doch einmal die unterschiedlichen Konstellationen bei der Eingabe von Daten in einem Unterformular durch.
Dabei werden drei Fälle unterschieden:
Keine Probleme mit Datensatz im Hauptformular
Wenn Sie vor dem Anlegen von Datensätzen im Unterformular einen Datensatz im Hauptformular angelegt haben, können Sie anschließend beliebig viele Datensätze im Unterformular anlegen. Wenn die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformularsteuerelements die Namen des Primärschlüsselfelds der Datenherkunft des Hauptformulars und des Fremdschlüsselfelds des Unterformulars enthalten, ist dieser Wert im Haupt- und Unterformular bereits voreingestellt.
Wichtig: Verknüpfen von und Verknüpfen nach sind keine Eigenschaften des Formulars, das Sie als Unterformular verwenden, sondern des Steuerelements, in dem Sie es platzieren!
Bild 2: Access aktualisiert das Fremdschlüsselfeld des Unterformulars automatisch.
Bild 3: Ein neuer Datensatz im Hauptformular
Bild 4: Einfügen eines Detaildatensatzes ohne Bezug zur Mastertabelle
Dass die Voreinstellung funktioniert, können Sie schnell nachvollziehen: öffnen Sie einfach das Beispielformular und klicken Sie bei vorhandener Kategorie im Hauptformular auf die Schaltfläche für das Anlegen eines neuen Datensatzes im Unterformular. Sollte das Feld Kategorie des Unterformulars nicht direkt sichtbar sein, scrollen Sie einfach dorthin – das Feld enthält automatisch die im Hauptformular eingestellte Kategorie (siehe Bild 2).
Vorsicht: Nullwerte erlaubt!
Erst wenn Sie einen Datensatz im Unterformular anlegen, ohne dass das Hauptformular einen Masterdatensatz anzeigt, auf den sich der Datensatz im Unterformular bezieht, wird es kritisch:
Verwenden Sie einfach das Beispielformular, um diesen Fall nachzuvollziehen. Wechseln Sie im Hauptformular auf einen neuen Datensatz, aber geben Sie dort noch keine Daten ein – die Schaltfläche für das Springen zu einem neuen Datensatz ist nun deaktiviert (siehe Bild 3).
Wechseln Sie nun ins Unterformular und geben Sie dort Beispieldaten ein. Das funktioniert zunächst ohne sichtliche Probleme. Diese folgen aber schneller, als man denkt: Access speichert die eingegebenen Daten ohne Murren, ohne diese mit einem Datensatz des Hauptformulars zu verknüpfen. Abb. 4 veranschaulicht das: Der erste Datensatz im Unterformular enthält keine Kategorie und lässt sich dennoch speichern – anderenfalls hätte Access beim Wechsel zu einem neuen Datensatz eine Fehlermeldung angezeigt.