Home > Artikel > Ausgabe 7/2011 > Lookup-Daten per Formular verwalten

Lookup-Daten per Formular verwalten

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

Wenn Sie Daten wie Anreden, Funktionen, Abteilungen et cetera in Lookup-Tabellen speichern und diese Daten in weiteren Tabellen per Nachschlagefeld verfügbar machen, werden Sie in Formularen Kombinationsfelder zur Auswahl solcher Daten bereitstellen. Was aber, wenn der Benutzer von diesem Formular die Daten der Lookup-Tabelle bearbeiten möchte – etwa, um diese zu erweitern, zu ändern oder um nicht benötigte Einträge zu löschen? Dann stellen Sie ihm ein weiteres Formular bereit, das er über eine Schaltfläche direkt neben dem Kombinationsfeld öffnen kann. Wie das funktioniert, zeigt dieser Artikel.

Beispieldatenbank

Die Beispiele zu diesem Artikel finden Sie in der Datenbank 1107_Lookupformular.mdb.

Ausgangsformular

Im Artikel Werte zu Kombinationsfeldern hinzufügen haben wir gezeigt, wie Sie neue Daten für Lookup-Tabellen direkt in das Kombinationsfeld zu ihrer Auswahl eingeben können. Der vorliegende Artikel verwendet die gleiche Grundkonfiguration, das heißt: Das Formular frmArtikel basiert auf der Tabelle tblArtikel als Datenherkunft. Das Kombinationsfeld cboKategorien ist an das Feld KategorieID dieser Tabelle gebunden und zeigt seinerseits Daten aus der Tabelle tblKategorien an. Ausführlichere Informationen etwa zum Erstellen des Formulars finden Sie im oben genannten Artikel.

Formular zum Bearbeiten von Lookup-Daten

In diesem Beispiel sollen die Daten der Tabelle tblKategorien bearbeitet werden, und davon nur die beiden Felder KategorieID und Kategorie. Dazu erstellen Sie ein Formular namens frmKategorien, das als Hauptformular dient:

  • Das Formular soll ein Unterformular enthalten, das wir gleich im Anschluss erstellen.
  • Außerdem weisen Sie diesem eine Schaltfläche namens cmdOK mit der Beschriftung OK zu.
  • Da das Formular selbst keine Daten anzeigt, sondern diese im Unterformular dargestellt werden, legen Sie für die Eigenschaften Datensatzzeiger, Navigationsschaltflächen, Bildlaufleisten und Trennlinien den Wert Nein fest. Außerdem soll die Eigenschaft Automatisch zentrieren den Wert Ja erhalten.

Speichern Sie das Formular unter dem Namen frmKategorien und legen Sie ein weiteres Formular an, dass Sie unter dem Namen sfmKategorien speichern:

  • Weisen Sie der Eigenschaft Datenherkunft des Formulars den Wert tblKategorien zu.
  • Fügen Sie die beiden Felder KategorieID und Kategorie aus der Feldliste zum Formularentwurf hinzu.
  • Stellen außerdem die Eigenschaft Standardansicht auf Datenblatt ein. Die Steuerelemente brauchen Sie unter dieser Einstellung nicht mühevoll anzuordnen, in der Datenblattansicht geschieht dies automatisch.

Das Unterformular sfmKategorien sieht nun wie in Bild 1 aus. Damit die Schaltfläche cmdOK das Formular schließt, fügen Sie der Eigenschaft Beim Klicken der Schaltfläche den Wert [Ereignisprozedur] hinzu, klicken auf die Schaltfläche mit den drei Punkten (...) und ergänzen die nun im VBA-Editor angezeigte Ereignisprozedur wie folgt:

Das Unterformular zur Anzeige der Kategorien

Bild 1: Das Unterformular zur Anzeige der Kategorien

Private Sub cmdOK_Click()

     DoCmd.Close acForm, Me.Name

End Sub

Nun fügen Sie das Unterformular sfmKategorien zum Detailbereich des Hauptformulars frmKategorien hinzu – wie das am einfachsten gelingt, erfahren Sie in Unterformular zu Formular hinzufügen. Das Ergebnis sieht im Entwurf etwa wie in Bild 2 aus.

Haupt- und Unterfomular in vereinigter Form

Bild 2: Haupt- und Unterfomular in vereinigter Form

Kategorie-Aktionen

Es gibt mehrere Aktionen in Zusammenhang mit den Kategorien, die einem Artikel zugeordnet werden können:

  • Hinzufügen einer neuen Kategorie
  • Bearbeiten der Liste von Kategorien
  • Löschen von Kategorien
  • Zusammenführen von Kategorien

Hinzufügen einer neuen Kategorien

Dieses Thema ist bereits erledigt: Das Hinzufügen einer neuen Kategorie erfolgt schlicht durch das Eintragen des Kategorienamens und der Bestätigung der Rückfrage durch den Benutzer – genau so, wie wir es bereits in Werte zu Kombinationsfeldern hinzufügen beschrieben haben.

Bearbeiten und Löschen der Kategorien

Das Bearbeiten und Löschen der Kategorien kann nicht direkt im Artikel-Formular erfolgen. Wenn der Benutzer hier die Bezeichnung einer Kategorie ändert, erkennt die Prozedur, die durch das Ereignis Bei nicht in Liste ausgelöst wird, dass hier eine neue Kategorie vorliegt und fragt, ob diese in der Kategorientabelle angelegt werden soll – siehe Werte zu Kombinationsfeldern hinzufügen.

Zum Bearbeiten der Bezeichnungen von Kategorien soll vielmehr das Formular frmKategorien erscheinen und dem Benutzer die Eingabe der neuen Bezeichnung ermöglichen.

Wie aber öffnen wir das Formular und wie zeigen wir dem Benutzer, dass er überhaupt die Möglichkeit hat, die Bearbeitung der Kategorien direkt vom Artikel-Formular aus zu starten?

Hier gibt es wiederum zwei Möglichkeiten:

  • Sie fügen eine offensichtliche Methode hinzu, beispielsweise eine Schaltfläche rechts neben dem Kombinationsfeld. Als Beschriftung können Sie einfach drei Punkte (...) verwenden (siehe Bild 3).
  • Schaltfläche zum Öffnen des Formulars frmKategorien

    Bild 3: Schaltfläche zum Öffnen des Formulars frmKategorien

  • Oder Sie erlauben dem Benutzer, das Kategorien-Formular durch einen Doppelklick in das Kombinationsfeld cboKategorieID zu öffnen.

Zum Löschen von Kategorien sollten Sie ebenfalls das Detailformular heranziehen – mehr dazu weiter unten.

Kategorie-Formular öffnen

Zum Öffnen des Kategorie-Formulars fügen Sie also eine Schaltfläche namens cmdKategorienBearbeiten rechts nebem dem Kombinationsfeld cboKategorieID ein (siehe Bild 4). Weisen Sie der Eigenschaft Beim Klicken den Wert [Ereignisprozedur] zu und klicken Sie auf die daraufhin erscheinende Schaltfläche mit den drei Punkten (...) neben der Eigenschaft. Der VBA-Editor zeigt nun die durch das Ereignis Beim Klicken ausgelöste Prozedur an, die Sie wie folgt ergänzen:

Private Sub cmdKategorienBearbeiten_Click()

     DoCmd.OpenForm "frmKategorien", _

         WindowMode:=acDialog, DataMode:=acFormEdit

End Sub

Die Prozedur öffnet das Formular frmKategorien wie in Bild 4. Sie können hier bereits mit Bordmitteln Kategorien ändern (durch einfaches Bearbeiten), hinzufügen (durch Einfügen von Datensätzen) oder löschen (durch markieren und betätigen der Entf-Taste).

Öffnen der Kategorie-Übersicht per Schaltfläche

Bild 4: Öffnen der Kategorie-Übersicht per Schaltfläche

Das Löschen gelingt allerdings nur, wenn die Kategorie noch keinem Artikel-Datensatz zugewiesen ist. Dafür sorgt die für die Beziehung zwischen den Tabellen tblArtikel und tblKategorien festgelegte referentielle Integrität. Sollten Sie dennoch versuchen, einen bereits referenzierten Datensatz der Tabelle tblKategorien im Formular frmKategorien zu löschen, rufen Sie damit die Meldung aus Bild 5 hervor.

Diese Fehlermeldung erscheint, wenn Sie versuchen, einen verknüpften Datensatz der Tabelle tblKategorien zu löschen.

Bild 5: Diese Fehlermeldung erscheint, wenn Sie versuchen, einen verknüpften Datensatz der Tabelle tblKategorien zu löschen.

Außerdem kann es geschehen, dass Sie einer Kategorie einen Namen geben, der schon für eine andere Kategorie vergeben wurde. Auch dies löst einen Fehler aus, da das Feld Kategoriename der Tabelle tblKategorien mit einem eindeutigen Index versehen ist.

Sie sehen: Schon ein einfaches Formular zur Bearbeitung der Daten einer Lookup-Tabelle kann einige Probleme beziehungsweise Fehlermeldungen mit sich bringen. Wie Sie um die Anzeige dieser Meldungen herumkommen und stattdessen benutzerdefinierte Meldungen liefern, erfahren Sie im Artikel Fehlerbehandlung in Formularen.

Schließen und aktualisieren

Doch wir wollen uns noch um die eigentlichen Formularfunktionen kümmern. Eine davon ist das Aktualisieren des Kombinationsfeldes nach dem Schließen des Formulars zum Bearbeiten der Kategorien. Wenn der Benutzer beispielsweise den Namen der aktuell ausgewählten Kategorie ändert, soll dieser natürlich auch im Kombinationsfeld direkt entsprechend angezeigt werden. Dazu fügen Sie der Prozedur, welche das Kategorien-Formular öffnet, eine weitere Anweisung hinzu (hier fett gedruckt):

Private Sub cmdKategorienBearbeiten_Click()

     DoCmd.OpenForm "frmKategorien", _

         WindowMode:=acDialog, DataMode:=acFormEdit

     Me!cboKategorieID.Requery

End Sub

Diese Anweisung aktualisiert die Datensatzherkunft des Kombinationsfeldes, liest also den Inhalt der für die Eigenschaft Datensatzherkunft angegebenen Tabelle/Abfrage. Wie aber kann es sein, dass diese Anweisung nicht direkt nach dem Öffnen des Formulars frmKategorien ausgeführt wird, sondern erst nach dem Schließen dieses Formulars? Dies liegt am Parameter WindowMode der DoCmd.OpenForm-Methode zum Öffnen des Formulars, der hier auf acDialog eingestellt wird. Dies sorgt dafür, dass der Code der aufrufenden Prozedur erst fortgesetzt wird, wenn das geöffnete Formular entweder geschlossen oder zumindest unsichtbar gemacht wird.

Das Schließen des Formulars frmKategorien ruft also die Methode Requery des Kombinationsfeldes auf den Plan. Was bewirkt der zweite Parameter acFormEdit? Er sorgt schlicht dafür, dass die Datensätze beim Öffnen mit diesem Parameter bearbeitet oder neue Datensätze angelegt werden können.

Aktuelle Kategorie beim Öffnen anzeigen

Schauen wir uns noch eine mögliche Verbesserung an: Das Formular frmKategorien soll gleich beim Öffnen die im Kombinationsfeld cboKategorieID ausgewählte Kategorie anzeigen (siehe Bild 6).

Dieses Formular zeigt alle Kategorien der Lookup-Tabelle zum Bearbeiten an.

Bild 6: Dieses Formular zeigt alle Kategorien der Lookup-Tabelle zum Bearbeiten an.

Dazu müssen Sie zunächst die ID des aktuell mit dem Kombinationsfeld ausgewählten Datensatz an das zu öffnende Formular übergeben. Zu diesem Zweck bietet die DoCmd.OpenForm-Anweisung den Parameter OpenArgs, zu deutsch Öffnungsargumente, an.

Diesem Öffnungsargument weisen Sie mit dem Ausdruck Open­Args:=Me!cbo­Kate­gorieID den aktuell im Kombinationsfeld ausgewählten Wert zu. In der Prozedur, die beim Anklicken der Schaltfläche cmdKategorienBearbeiten ausgeführt wird, ändert sich dadurch wie folgt (Änderungen fett gedruckt):

Private Sub cmdKategorienBearbeiten_Click()

     DoCmd.OpenForm "frmKategorien", _

         WindowMode:=acDialog, _

         DataMode:=acFormEdit, _

         OpenArgs:=Me!cboKategorieID

     Me!cboKategorieID.Requery

End Sub

Nun muss diese Information noch im aufgerufenen Formular verwertet werden. Dort greifen Sie mit der Eigenschaft OpenArgs des Formulars (das mit Me referenziert wird) auf den mit diesem Parameter übergebenen Wert zu. Im Prinzip führt die folgende Prozedur einen Befehl aus, der in der Datensatzgruppe des Unterformulars nach einem Datensatz mit bestimmten Eigenschaften sucht.

Die Prozedur ruft dazu die FindFirst-Methode des Recordset-Objekts des im Unterformularsteuerelement sfmKategorien enthaltenen Form-Objekts des aktuellen Formulars auf und übergibt dieser den Ausdruck "KategorieID = " & Me.OpenArgs, wobei Me.OpenArgs durch den mit dem gleichnamigen Parameter übergebenen Wert ersetzt wird:

Private Sub Form_Load()

     Me!sfmKategorien.Form.Recordset.FindFirst _

         "KategorieID = " & Me.OpenArgs

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!