Home > Artikel > Ausgabe 1/2014 > Neue Autowerte ermitteln und RecordsAffected

Neue Autowerte ermitteln und RecordsAffected

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

Mit der Autowert-Funktion liefert Access eine einfache Möglichkeit, eindeutige Werte für Primärschlüsselfelder zu vergeben. Für manche Zwecke benötigt man aber gleich nach dem Anlegen eines Datensatzes seinen Autowert. Wie diesen erhalten, erfahren Sie im vorliegenden Artikel.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1401_Autowerte.mdb.

ID des zuletzt hinzugefügten Autowertes ermitteln

Viele 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, die wir in diesem Artikel vorstellen. Als Beispieltabelle verwenden wir die Tabelle tblAutowerte (siehe Bild 1), die neben dem Autowert-Feld AutowertID nur noch ein weiteres Feld namens WeiteresFeld enthält.

Beispieltabelle

Bild 1: Beispieltabelle

Neuen Autowert unter DAO ermitteln

Unter DAO legen Sie neue Datensätze mit der AddNew-Methode an und fügt dann den einzelnen Feldern die gewünschten Werte hinzu. Wenn Sie anschließend den Autowert des neu angelegten Datensatzes benötigen, brauchen Sie diesen nur auszulesen – er ist beim Anlegen bereits vorhanden. Allerdings muss man dies vor dem Speichern des Datensatzes mit der Update-Methode erledigen.

Listing 1 zeigt, wie dies funktioniert. Hier legen wir zunächst mit der AddNew-Funktion einen neuen Datensatz an und weisen dem einzigen Nicht-Primärschlüsselfeld des Recordsets einen Wert zu.

Public Sub AutowertMitAddNewUpdate()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Set db = CurrentDb

     Set rst = db.OpenRecordset("tblAutowerte", dbOpenDynaset)

     rst.AddNew

     rst!WeiteresFeld = "Test"

     MsgBox "Die neue ID lautet: " & rst!AutowertID

     rst.Update

     rst.Close

     Set rst = Nothing

     Set db = Nothing

End Sub

Listing 1: Autowert per DAO ermitteln

Den Wert des Autowert-Feldes können Sie bereits nach dem Ausführen der AddNew-Methode abfragen – dies ist der früheste Zeitpunkt. Der späteste Zeitpunkt ist kurz vor dem Speichern des Datensatzes in der zugrunde liegenden Tabelle, also vor dem Aufrufen der Update-Methode.

Hier nutzen wir in der Beispielprozedur eine MsgBox-Funktion auf, um den Autowert des neuen Datensatzes auszugeben. Nach dem Update können Sie nicht mehr auf den Autowert zugreifen, da dies den Datensatzzeiger direkt auf die folgende Position verschiebt. Genaugenommen liefert dies je nach der gewählten Datenherkunft unterschiedliche Werte.

Wir gehen also zunächst davon aus, dass wir den Autowert hinter dem Aufruf der Update-Methode abfragen – also etwa so:

rst.AddNew

rst!WeiteresFeld = "Test"

rst.Update

MsgBox "Die neue ID lautet: " _

& rst!AutowertId

Bei der ersten Variante verwenden wir ein Recordset, das alle Datensätze der zugrunde liegenden Tabelle enthält – also das aus dem bereits referenzierten Listing:

Set rst = db.OpenRecordset( "tblAutowerte", dbOpenDynaset)

Das Ergebnis im Meldungsfenster lautet in diesem Fall -3! Dies ist auf keinen Fall der korrekte Wert – so viel wissen wir. Aber warum liefert Access hier den Wert -3? Diese Frage lassen wir guten Gewissens offen, denn wir wissen ja, dass wir damit auf jeden Fall falsch liegen und den neuen Autowert vor dem Auslösen der Update-Methode ermitteln müssen.

Wenn wir als zweite Variante das Recordset so einschränken wollen, dass es keine Datensätze enthält, definieren wir die Datenherkunft in OpenRecordset so:

Set rst = db.OpenRecordset( "SELECT * FROM tblAutowerte WHERE 1 = 2", dbOpenDynaset)

Wenn wir nun die Update-Methode aufrufen und erst danach auf den neuen Autowert zugreifen wollen, liefert Access eine handfeste Fehlermeldung (siehe Bild 2). Diesen Fehler muss der Einsteiger allerdings erst noch interpretieren lernen: Dadurch, dass wir eine leere Datensatzgruppe mit einem Datensatz füllen und dann durch den Aufruf der Update-Methode zum folgenden Datensatz wechseln (der ja nicht vorhanden ist), landet der Datensatzzeiger hinter dem letzten Datensatz. Der Zugriff auf einen nicht vorhandenen Datensatz führt schließlich zum Fehler.

Fehler, der beim Abfragen eines Autowertes auftreten kann

Bild 2: Fehler, der beim Abfragen eines Autowertes auftreten kann

Datenbankunabhängigkeit

Diese Methode ist grundsätzlich unabhängig von eventuell in anderen Datenbankfrontends ausgeführten Anfügevorgängen von Datensätzen in die betroffene Tabelle. Der Datensatzzeiger verbleibt hier auf dem neuen Datensatz, während dessen Autowert ermittelt wird.

ID bei INSERT INTO ermitteln

Bei der Verwendung einer INSERT INTO-Abfrage verwenden Sie die SQL-Funktion ­@@IDENTITY. Das Beispiel aus Listing 2 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 (RecordsAffected liefert die Anzahl der durch die letzte Aktionsabfrage betroffenen Datensätze) und öffnet dann eine Datensatzgruppe, die lediglich den Wert der @@IDENTITY-Funktion zurückliefert.

Public Sub AutowertMitExecuteInsert()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Dim strSQL As String

     Set db = CurrentDb

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!