Primärschlüsselfelder mit Autowert-Funktion bieten eine komfortable Möglichkeit, für neue Datensätze automatisch einen neuen, eindeutigen Primärschlüsselwert zu vergeben. Wenn man zwischendurch keine Datensätze löscht, ist diese Nummerierung sogar lückenlos. Allerdings kann es sein, dass jemand versucht, gelöschte Datensätze mit den fehlenden Primärschlüsselwerten zu ersetzen. Zu welchen Problemen dies führt und wie Sie diese lösen, zeigt der vorliegende Beitrag.
Autowert-Primärschlüsselfelder
Fast alle Tabellen verwenden ein Primärschlüsselfeld, das über die Autowert-Funktion mit einem neuen, noch nicht vergebenen Wert gefüllt wird (s. Bild 1).
Bild 1: Entwurf einer Tabelle mit Autowert-Primärschlüsselfeld
Mit dem Felddatentyp Autowert legt man automatisch die Eigenschaft Neue Werte auf Inkrement fest, was bedeutet, dass als Primärschlüsselwert beim Neuanlegen von Datensätzen standardmäßig der Primärschlüsselwert des zuletzt angelegten Datensatzes herangezogen und um eins erhöht wird.
Damit ist eine kleine Stolperfalle verbunden, denn dies funktioniert nur, wenn Sie den neuen Datensatz über die Tabelle oder ein an die Tabelle gebundenes Formular eingeben oder dies per VBA erledigen, wobei hier der Primärschlüsselwert explizit nicht festgelegt werden darf, sondern vom System erzeugt werden muss.
Dies erreichen Sie beispielsweise durch folgende kleine Prozedur, die Sie in einem Standardmodul anlegen und per F5 ausführen:
Public Sub NeuerArtikelMitAutowert() Dim db As DAO.Database Set db = CurrentDb db.Execute "INSERT INTO tblArtikel(Artikelname) VALUES(''Beispielartikel'')", dbFailOnError End Sub
Der Autowert wird hier automatisch auf den zuletzt vergebenen Wert plus eins festgelegt.
Die folgende Variante (siehe Prozedur NeuerArtikel_MitVorgegebenemPK im Modul mdlBeispiele) verwendet die folgende INSERT INTO-Anweisung:
db.Execute "INSERT INTO tblArtikel(ArtikelID, Artikelname) VALUES(79, ''Beispielartikel'')", dbFailOnError
Diese legt ebenfalls einen neuen Datensatz an, weist dem Primärschlüsselfeld aber den Wert 79 zu. Sofern dieser bereits vergeben ist, löst dies den Fehler 3022 aus.
Wenn Sie einen Datensatz per DAO anlegen, sieht dies so aus:
Public Sub NeuerArtikel_DAO_MitAutowert() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("tblArtikel", dbOpenDynaset) rst.AddNew rst!Artikelname = "Beispielartikel" Debug.Print rst!ArtikelID rst.Update End Sub
Auch hier wird der Wert des Feldes ArtikelID nicht explizit zugewiesen, sondern in Abhängigkeit vom Autowert des zuletzt angelegten Datensatzes vergeben. Diesen gibt die Prozedur vor dem Speichern des Datensatzes im Direktfenster aus.
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