Neue Werte in Lookup-Feldern

Manchmal möchten Sie schnell mit ein paar Zeilen Code eine Funktion programmieren, mit der ein neuer Datensatz zu einer Tabelle mit einem eindeutigen Index hinzugefügt wird. Dies geschieht bevorzugt bei Lookup-Tabellen. Dort kommt es aber schnell dazu, dass der Benutzer einen neuen Datensatz hinzufügt, der bereits vorhanden ist. In diesem Beitrag zeigen wir, wie Sie solche Fälle umschiffen oder den Benutzer gegebenenfalls einen neuen Wert eingeben lassen.

Lookup-Tabellen

Warum benutzt man eigentlich Lookup-Tabellen Der wichtigste Grund ist wohl, dass man die möglichen Werte nur je einmal in eine separate Tabelle eingibt und von anderen Tabellen darauf verweisen kann, indem man diese über ein Fremdschlüsselfeld mit dem Primärschlüsselwert dieser Tabelle verknüpft.

Nun legt man nicht immer nur über die Benutzeroberfläche neue Datensätze an, bei denen man bequem etwa per Kombinationsfeld einen der vorhandenen verknüpften Datensätze auswählt – zum Beispiel eine Anrede oder eine Kategorie. Gelegentlich sollen auch neue Datensätze beim Anlegen über die Benutzeroberfläche hinzugefügt werden oder Sie wollen vielleicht Daten aus einer anderen Datenbank importieren, wo die Daten noch in einer Tabelle vorliegen.

Eindeutiger Schlüssel

Wenn Sie eine solche Lookup-Tabelle verwenden – wie etwa die Tabelle tblKategorien aus Bild 1 -, dann haben Sie verschiedene Möglichkeiten, um sicherzustellen, dass jede Kategorie nur einmal eingegeben wird. Die einfachste ist, einfach wie in der Abbildung einen eindeutigen Index für dieses Feld anzulegen. Dazu wählen Sie für die Eigenschaft Indiziert einfach den Wert Ja (Ohne Duplikate) aus.

Tabelle mit eindeutig indiziertem Feld

Bild 1: Tabelle mit eindeutig indiziertem Feld

Achtung: Dies ist für Tabellen mit bestehenden Daten etwas komplizierter. Es kann immerhin vorkommen, dass Benutzer es geschafft haben, den gleichen Datensatz mehrfach in einer Lookup-Tabelle einzugeben. Wenn dort also beispielsweise zwei Mal die gleiche Kategorie enthalten ist und Sie dann versuchen, für das Feld Kategorie einen eindeutigen Index zu definieren, erhalten Sie eine entsprechende Fehlermeldung (s. Bild 2).

Fehlermeldung beim Versuch, einen eindeutigen Index für ein Feld mit nicht eindeutigen Daten anzulegen

Bild 2: Fehlermeldung beim Versuch, einen eindeutigen Index für ein Feld mit nicht eindeutigen Daten anzulegen

In diesem Fall müssen Sie die Daten zuvor noch vereinheitlichen. Wie das gelingt, lesen Sie im Beitrag Lookup-Daten: Aus zwei mach eins (www.access-im-unternehmen.de/946).

Wenn die Daten jedoch keine Redundanzen aufweisen, können Sie den eindeutigen Index problemlos anlegen. Anschließend führt der Versuch, einen neuen Datensatz mit einem bereits vorhandenem Wert in dem eindeutig indizierten Feld anzulegen, wiederum zu einem Fehler. Interessanterweise erhalten wir hier genau die gleiche Fehlermeldung wie bei dem Versuch, einen eindeutigen Index für ein Feld mit nicht eindeutigen Werten anzulegen.

Nun wollen wir dem Benutzer sicher nicht diese Fehlermeldung präsentieren, sondern eine, mit der er etwas mehr anfangen kann.

Lookup-Werte per Formular eingeben

In Bild 3 haben wir die einfachste Konstellation für die Eingabe von Werten in eine Lookup-Tabelle geschaffen. Der Benutzer kann aus dem Kombinationsfeld eine Kategorie auswählen, aber auch neue Werte eingeben – zumindest scheinbar. Denn wenn er wirklich einen neuen Wert dort eingibt, der noch nicht in der Datensatzherkunft dieses Steuerelements vorhanden ist, erscheint wiederum eine Fehlermeldung (s. Bild 4).

Einfaches Formular mit einem Kombinationsfeld zur Eingabe oder Auswahl von Lookup-Werten

Bild 3: Einfaches Formular mit einem Kombinationsfeld zur Eingabe oder Auswahl von Lookup-Werten

Fehler beim Versuch, einen Wert in ein unvorbereitetes Lookup-Feld einzugeben

Bild 4: Fehler beim Versuch, einen Wert in ein unvorbereitetes Lookup-Feld einzugeben

Um dies zu verhindern und den neuen Wert gleich in die Tabelle tblKategorien zu schreiben, legen Sie eine Ereignisprozedur an, die durch das Ereignis Bei nicht in Liste des Kombinationsfeldes ausgelöst wird. Diese sieht wie in Listing 1 aus. Diese Ereignisprozedur liefert gleich zwei entsprechende Parameter, wobei der erste, NewData, den Wert des neuen Eintrags liefert und der zweite, Response, einen Wert erwartet, der die weitere Vorgehensweise festlegt. In diesem Fall legt die Prozedur gleich einen neuen Eintrag in der Tabelle tblKategorien mit dem mit NewData gelieferten Kategorienamen an. Dann stellt sie Response auf acDataErrAdded ein, was für den weiteren Verlauf festlegt, dass Access keine Fehlermeldung liefert, sondern direkt den neuen Wert im Kombinationsfeld auswählt. Die Datensatzherkunft wird auf diesem Wege gleich mit aktualisiert.

Private Sub KategorieID_NotInList(NewData As String, Response As Integer)
     Dim db As DAO.Database
     Set db = CurrentDb
     db.Execute "INSERT INTO tblKategorien(Kategorie) VALUES(''" & NewData & "'')", dbFailOnError
     Response = acDataErrAdded
     Set db = Nothing
End Sub

Listing 1: Hinzufügen eines neuen Datensatzes über die Eingabe in ein Kombinationsfeld

Hinzufügen mit Rückfrage

Gegebenenfalls möchten Sie den Benutzer dennoch darauf hinweisen, dass er gerade einen neuen Wert zur Liste hinzufügt. Zu Beispielzwecken kopieren wir das Kombinationsfeld cboKategorien in ein neues Steuerelement namens cboKategorien_II. Für dieses hinterlegen wir nun wiederum eine Ereignisprozedur für das Ereignis Bei Nicht in Liste. Diese sieht nun wie in Listing 2 aus.

Private Sub cboKategorien_II_NotInList(NewData As String, Response As Integer)
     Dim db As DAO.Database
     Dim bolHinzufuegen As Boolean
     bolHinzufuegen = MsgBox("Diesen Eintrag zur Liste hinzufügen", _
         vbYesNo + vbExclamation, "Neuer Eintrag") = vbYes
     If bolHinzufuegen = True Then
         Set db = CurrentDb
         db.Execute "INSERT INTO tblKategorien(Kategorie) VALUES(''" & NewData & "'')", dbFailOnError
         Response = acDataErrAdded
         Set db = Nothing
     Else
         Response = acDataErrContinue
     End If
End Sub

Listing 2: Hinzufügen eines neuen Datensatzes mit Rückfrage

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

Schreibe einen Kommentar