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.
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).
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).
Bild 3: Einfaches Formular mit einem Kombinationsfeld zur Eingabe oder Auswahl von Lookup-Werten
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