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.
Möglicherweise rufen Sie jetzt: „Halt! Hier ist doch referentielle Integrität festgelegt, Access darf den Datensatz doch gar nicht speichern!“ Aber Access handelt richtig – zumindest was die Umsetzung der referentiellen Integrität betrifft. Diese besagt nämlich (und das steht in den wenigsten Fachbüchern), dass die Festlegung referentieller Integrität für eine Beziehung zwischen zwei Tabellen dafür sorgt, dass das Fremdschlüsselfeld der Detailtabelle entweder einen der in der Mastertabelle enthaltenen Primärschlüsselwerte oder – und das ist der springende Punkt – einen Nullwert enthalten darf. Access hält sich an diese Regel, was mit obigem Beispiel belegt wäre.
Nun ließe sich in diesem Beispiel die Kategorie über das entsprechende Feld des Unterformulars durchaus noch auswählen, aber das ist ja nicht der Sinn der Sache: Normalerweise sind die Fremdschlüsselfelder in Unterformularen gar nicht sichtbar, da ihr Inhalt ja bereits im Hauptformular angezeigt wird (hier hat der ansonsten tüchtige Assistent es ein wenig zu gut gemeint).
Noch größer wird das Dilemma, wenn Sie einige Daten im Unterformular eingegeben haben und dann zum Hauptformular wechseln, um die Daten des Masterdatensatzes nachzutragen.
Mit der Eingabe des ersten Zeichens legt Access nämlich den Datensatz des Hauptformulars temporär an und vergibt dafür einen Primärschlüsselwert – was sich auf die bereits eingegebenen Daten im Unterformular verheerend auswirkt:
Die verschwinden nämlich einfach, weil der im Hauptformular angezeigte Primärschlüsselwert ja nun einen bestimmten Wert angenommen hat, der nicht mehr mit dem Wert des Fremdschlüsselfeldes der Datenherkunft des Unterformulars vereinbar ist – nämlich dem Nullwert.
Die zuvor eingegebenen Daten des Unterformulars sind somit über das Formular nicht mehr erreichbar und können nur noch direkt in der Tabelle geändert werden.
Nullwerte verboten
Wem bekannt ist, dass referentielle Integrität auch Nullwerte als Fremdschlüssel zulässt, baut vor: Bereits im Tabellenentwurf lässt sich festlegen, dass für ein Feld in jedem Fall ein Wert eingegeben werden muss. Nur führt das im vorliegenden Fall ebenfalls zu einem Problem, denn beim Anlegen eines Datensatzes im Unterformular ohne vorhandenen Masterdatensatz erscheint eine für normale Anwender vermutlich nicht nachvollziehbare Fehlermeldung (siehe Bild 5). Das gilt insbesondere, da ja normalerweise – im Gegensatz zu unserem Beispielformular – die Fremdschlüsselfelder, die als Verknüpfung zum Hauptformular dienen, nicht angezeigt werden und der Benutzer gar keinen Zugriff auf diese hat.
Bild 5: Fehlermeldung bei nicht erlaubtem Nullwert
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo