ID des zuletzt hinzugefügten Autowertes ermittelnViele Anwendungsfälle verlangen danach, die ID eines gerade hinzugefügten Datensatzes zu ermitteln. Dies kann sowohl beim Hinzufügen per DAO (beziehungsweise ADO) also auch per SQL-INSERT INTO-Abfrage der Fall sein. Für beides gibt es Lösungen.
BeispieldatenbankEine Beispieldatenbank finden Sie unter folgendem Link:

ID unter DAO ermittelnUnter DAO legt man neue Datensätze mit der AddNew-Methode an und fügt dann den einzelnen Feldern die gewünschten Werte hinzu. Wenn man anschließend die ID des neu angelegten Datensatzes benötigt, braucht man diese nur auszulesen - sie ist beim Anlegen bereits vorhanden. Allerdings muss man dies vor dem Speichern des Datensatzes mit der Update-Methode erledigen, wie folgendes Beispiel zeigt:
Public Sub PrimaerschluesselwertPerDAO()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("tblBeispiel", dbOpenDynaset)
rst.AddNew
rst!Testfeld = "Test"
Debug.Print rst!ID
rst.Update
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub ID bei INSERT INTO ermittelnBei der Verwendung einer INSERT INTO-Abfrage verwenden Sie die SQL-Funktion @@IDENTITY. Das nachfolgende Beispiel zeigt, wie dies funktioniert: Nach dem Anlegen des Datensatzes mit der Execute-Methode von DAO prüft man zunächst mit der RecordsAffected-Eigenschaft, ob einer oder mehrere neue Datensätze angelegt wurden und öffnet dann eine Datensatzgruppe, die lediglich den Wert der @@IDENTITY-Funktion zurückliefert.
Deren Wert gibt dann das erste Feld der Datensatzgruppe (rst(0)) zurück.
Public Sub PrimaerschluesselwertDesNeuestenDatensatzes()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
'Fügt einen neuen Datensatz zu einer Tabelle hinzu
db.Execute ("INSERT INTO tblBeispiel(Testfeld) VALUES('Test')")
If db.RecordsAffected > 0 Then
'Öffnet eine Datensatzgruppe, die den Wert der Funktion @@IDENTITY zurückliefert
Set rst = db.OpenRecordset("SELECT @@IDENTITY")
'Gibt den Wert von @@IDENTITY aus
Debug.Print rst(0)
rst.Close
Set rst = Nothing
End If
Set db = Nothing
End Sub SitzungsabhängigDas schöne an @@IDENTITY ist, dass es sich jeweils auf die in der aktuellen Sitzung durchgeführten Datenänderungen bezieht - das heißt, dass gleichzeitige Änderungen durch andere Benutzer den zurückgegebenen Wert nicht beeinflussen.
Testen können Sie dies folgendermaßen: Öffnen Sie die Beispielanwendung zweimal, öffnen Sie jeweils den VBA-Editor, setzen Sie einen Haltepunkt auf die Zeile If db.RecordsAffected ... und starten Sie dann mit F5 erst die Prozedur in der ersten, dann in der zweiten Datenbank. Dies schreibt jeweils einen neuen Datensatz. Mit F5 lassen Sie nun die Routine in der ersten Datenbank weiterlaufen und stellen so fest, dass @@IDENTITY die richtige ID zurückliefert. |