Home > Artikel > Ausgabe 8/2011 > Datensätze in Unterformularen anlegen

Datensätze in Unterformularen anlegen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wie Sie Haupt- und Unterformulare zur Darstellung und Bearbeitung von Daten aus Tabellen mit 1:n-Beziehung erstellen, lesen Sie in jedem Grundlagenbuch und auf jeder halbwegs relevanten Internetseite zum Thema Access. Dass der Benutzer bei der Dateneingabe jedoch leicht auf die Nase fallen kann, lassen die meisten außer acht: Wer nämlich ohne Datensatz im Hauptformular Daten in das Unterformular eingibt, schickt seine Datensätze ins Beziehungsnirvana. Dieser Artikel zeigt, wie Sie dies verhindern.

Beispieldatenbank

Die Beispieldatenbank zu diesem Artikel heißt 11_08_DatensaetzeInUnterformularen.mdb.

Problem beim Eingeben von Daten in Unterformularen

Wenn Sie zwei Tabellen namens tblKunden und tblProjekte verwenden, bei der die Datensätze der Tabelle tblProjekte über das Fremdschlüsselfeld KundeID mit dem Primärschlüsselfeld der Tabelle tblKunden verknüpft sind, sieht die Vorgehensweise zum Anzeigen dieser Daten in zwei Formularen namens frmKunden und sfmProjekte so aus:

  • Sie legen ein Hauptformular namens frmKunden an, dass auf einer Tabelle wie tblKunden als Datenherkunft basiert und deren Felder anzeigt.
  • Sie erstellen ein Formular namens sfmProjekte, dass die Tabelle tblProjekte als Datenherkunft nutzt.
  • Sie fügen das Formular sfmProjekte als Unterformular in das Hauptforular frmKunden ein. Dabei stellt Access normalerweise direkt die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformularsteuerelements so ein, dass das Unterformular nur die Projekte zum jeweiligen Kunden des Hauptformulars anzeigt (siehe Bild 1). Beim Anlegen neuer Projekte im Unterformular wird das Fremdschlüsselfeld KundeID der Tabelle tblProjekte gleich mit dem Primärschlüsselwert des Datensatzes gefüllt, der im Hauptformular angezeigt wird.
  • Normalerweise zeigt das Unterformular die verknüpften Datensätze an.

    Bild 1: Normalerweise zeigt das Unterformular die verknüpften Datensätze an.

Dies reicht auch normalerweise völlig aus, um verknüpfte Daten per Haupt- und Unterformular einzugeben. Dummerweise aber kann es auch passieren, dass der Benutzer erst ein Projekt einträgt und erst dann die Kundendaten. Dazu springt er zunächst auf einen leeren Kundendatensatz (oder er arbeitet mit einer neuen, leeren Datenbank – dann gibt es ohnehin noch keinen Kundendatensatz). Er trägt im Unterformular das Projekt ein (siehe Bild 2), wechselt dann zum Hauptformular und legt einen Kunden an. Das sieht auf den ersten Blick sogar noch gut aus. Sobald Access jedoch merkt, dass da ein neuer Datensatz angelegt werden soll (in der Regel direkt nach der Eingabe des ersten Zeichens), verschwindet der Projektdatensatz aus dem Unterformular! Was geschieht hier? Nun: Durch das Einstellen der beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformular-Steuerelements legen Sie zwei Dinge fest:

Was aber, wenn man ein Projekt eingibt, ohne dass das Hauptformular einen Kunden anzeigt?

Bild 2: Was aber, wenn man ein Projekt eingibt, ohne dass das Hauptformular einen Kunden anzeigt?

  • Das Unterformular soll nur Datensätze anzeigen, die mit dem Datensatz des Hauptformulars verknüpft sind.
  • Beim Anlegen neuer Datensätze soll das Fremdschlüsselfeld im Unterformular automatisch mit dem aktuellen Primärschlüsselwert im Hauptformular gefüllt werden.

Gerade Letzteres führt dazu, dass neue Datensätze im Unterformular, hier also Projekte, gleich dem im Hauptformular angezeigten Kunden zugeordnet werden können. Wenn das Hauptformular jedoch keinen Datensatz anzeigt, lautet der Wert des Primärschlüsselfeldes NULL. Wenn Sie nun einen neuen Datensatz im Unterformular anlegen, stellt Access den Wert des für die Eigenschaft Verknüpfen von angegebenen Feldes automatisch ebenfalls auf diesen Wert ein.

Dies führt dann dazu, dass die Tabelle tblProjekte Datensätze enthält, deren Feld KundeID keinen Wert enthält, der Wert also NULL ist (siehe Bild 3). Wenn der Benutzer dann im Hauptformular zu einem anderen Kunden-Datensatz und wieder zurück zum neuen, leeren Datensatz wechselt, könnte das Unterformular theoretisch die noch nicht mit einem Datensatz der Tabelle tblKunden verknüpften Projektdatensätze anzeigen – dies gelingt jedoch nicht und würde auch keinen Sinn machen.

Projekte, die ohne Kunde angelegt wurden, enthalten im Feld KundeID den Wert NULL.

Bild 3: Projekte, die ohne Kunde angelegt wurden, enthalten im Feld KundeID den Wert NULL.

Unverknüpfte Datensätze verhindern I

Wenn Sie dies verhindern möchten, haben Sie eine einfache Möglichkeit: Sie brauchen nur den Wert der Eigenschaft Eingabe erforderlich des Fremdschlüsselfeldes Kunde­ID auf den Wert Ja einzustellen (siehe Bild 4 – die Beispielobjekte zu dieser Lösung heißen tblKunden, tblProjekte, frmKunden und sfmProjekte).

Durch Einstellung dieser Eigenschaft verhindern Sie, dass Datensätze ohne Fremdschlüsselwert angelegt werden.

Bild 4: Durch Einstellung dieser Eigenschaft verhindern Sie, dass Datensätze ohne Fremdschlüsselwert angelegt werden.

Danach tritt allerdings eine Fehlermeldung auf, sobald Sie einen Datensatz im Unterformular anlegen möchten, ohne dass das Hauptformular seinerseits bereits einen Datensatz anzeigt. Dazu reicht es, auch nur ein Zeichen in das Feld Projekt einzutippen (siehe Bild 5).

Diese Fehlermeldung erscheint, wenn Sie dennoch einen Datensatz ohne Fremdschlüsselfeldwert anlegen.

Bild 5: Diese Fehlermeldung erscheint, wenn Sie dennoch einen Datensatz ohne Fremdschlüsselfeldwert anlegen.

Mit dieser Meldung kann der Benutzer natürlich nicht viel anfangen. Genaugenommen ist das Feld KundeID der Tabelle tblProjekte, also das Fremdschlüsselfeld, ja noch nicht einmal im Unterformular enthalten.

Also verwenden wir die Möglichkeit, dem Formular eine Fehlerbehandlung zuzuweisen. Grundlegende Informationen hierzu finden Sie unter Fehlerbehandlung in Formularen. Im vorliegenden Fall soll das Formular den Fehler abfangen, der durch das Anlegen eines Datensatzes ohne vorherigens Füllen des Fremdschlüsselwertes im Unterformular ausgelöst wird. Dazu schließen Sie beide Formulare und öffnen das Unterformular (hier sfmProjekte) in der Entwurfsansicht. Dort tragen Sie für die Ereigniseigenschaft Bei Fehler den Wert [Ereignisprozedur] ein.

Ein Klick auf die Schaltfläche rechts neben der Eigenschaft öffnet nun den VBA-Editor mit dem Klassenmodul des Formulars sfmProjekte. Den Rumpf der Prozedur füllen Sie mit den folgenden Anweisungen:

Private Sub Form_Error(DataErr As Integer, _

         Response As Integer)

     Select Case DataErr

         Case Else

             MsgBox DataErr

     End Select

End Sub

Damit ermitteln Sie zunächst die Nummer des Fehlers, der beim Anlegen eines Datensatzes ohne Fremdschlüsselfeld ausgelöst wird. Schließen Sie das Formular nach dem Vervollständigen der Ereignisprozedur und öffnen Sie das Hauptformular erneut. Wechseln Sie zum neuen, leeren Datensatz im Hauptformular und legen Sie einen neuen Datensatz im Unterformular an – es scheint das gewünschte Meldungsfenster mit der Fehlernummer 3314 (Sie müssen einen Wert in das Feld '' eingeben.).

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!