Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2005.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Konsistente Dateneingabe in Unterformularen

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.

Beispielformular

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.

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

  • Klicken Sie auf der Registerseite Formular des Datenbankfensters auf den Eintrag Erstellt ein Formular unter Verwendung des Assistenten.
  • Wählen Sie die Tabelle Artikel aus und befördern Sie alle Felder mit der entsprechenden Schaltfläche in das rechte Listenfeld.
  • Gehen Sie genauso mit der Tabelle Kategorien vor und klicken Sie auf die Schaltfläche Weiter.
  • Beantworten Sie die Frage "Wie sollen Ihre Daten angezeigt werden?" mit "nach Kategorien". Wenn in der rechten Abbildung ein symbolisches Formular mit Unterformular erscheint und darunter die Option Formular mit Unterformular(en) aktiviert ist, können Sie bereits auf Fertig stellen klicken. (
  • Der Assistent legt nun ein Formular namens Kategorien mit einem Unterformular an, das er unter dem Namen Artikel Unterformular speichert und direkt anzeigt (s. Abb. 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.

    Hintergrund

    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:

  • Das Hauptformular zeigt die Daten der Mastertabelle und das Unterformular die Daten der Detailtabelle an.
  • Das Hauptformular zeigt die Daten der einen Seite einer m:n-Beziehung an und das Unterformular eine Abfrage mit den Daten der anderen Seite der Beziehung und den entsprechenden Datensätzen der Verknüpfungstabelle.
  • 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.

    Dateneingabe mit und ohne Probleme

    Gehen wir doch einmal die unterschiedlichen Konstellationen bei der Eingabe von Daten in einem Unterformular durch.

    Dabei werden drei Fälle unterschieden:

  • Das Hauptformular enthält einen Datensatz, dessen Primärschlüsselwert automatisch in neuen Datensätzen des Unterformulars als Fremdschlüsselwert eingetragen wird.
  • Das Hauptformular enthält keinen Datensatz und das verknüpfte Fremdschlüsselfeld des Unterformulars erlaubt Nullwerte.
  • Das Hauptformular enthält keinen Datensatz und das verknüpfte Fremdschlüsselfeld erlaubt keine Nullwerte.
  • 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!

    Abb. 2: Access aktualisiert das Fremdschlüsselfeld des Unterformulars automatisch.

    Abb. 3: Ein neuer Datensatz im Hauptformular

    Abb. 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 (s. Abb. 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 (s. Abb. 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 (s. Abb. 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.

    Abb. 5: Fehlermeldung bei nicht erlaubtem Nullwert

    Lösung 1: Kein Eintritt ohne Masterdatensatz

    Die Lösung des Problems ist verhältnismäßig einfach: Bringen Sie den Benutzer einfach dazu, zunächst einen Datensatz im Hauptformular anzulegen und sich erst dann dem Unterformular zuzuwenden.

    Dazu gibt es mehrere Möglichkeiten. In jedem Fall müssen Sie vor dem Anlegen von Daten im Unterformular prüfen, ob im Hauptformular bereits ein Datensatz und damit ein verwertbarer Primärschlüssel vorliegt.

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Formulare für die Dateneingabe

    Formularposition speichern und wiederherstellen

    Unterformulare: Daten anlegen und löschen

    Modale Dialoge mal anders

    Transparenz und andere Effekte in Formularen

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.