Beitrag aus SmartTools Access Weekly
Die wichtigsten Grundlagen zum Einsatz von DAO-/ADO-Recordsets, Teil 3
Access 365 2024 2021 2019 2016 2013 2010
Um programmatisch auf die Inhalte von Tabellen zuzugreifen, werden "Recordsets" eingesetzt. Ein Recordset ist einfach ausgedrückt eine Sammlung von Datensätzen, die in Schleifen durchlaufen und auf verschiedener Art verarbeitet werden kann. Alle notwendigen Grundlagen dazu vermittelt Ihnen unser Tipp. In den ersten beiden Teilen dieses Tipps haben wir gezeigt, wie Recordsets initialisiert werden, wie man in Recordsets navigiert, in einer Schleife alle Datensätze durchläuft und wie man Recordsets durchsucht. Im Folgenden erläutern wir, wie Sie über Recordsets Feldinhalte ändern und Datensätze hinzufügen oder löschen können.
Um einen Feldinhalt mit DAO zu ändern, sind grundsätzlich folgende Schritte notwendig:
rs.Edit: Datensatz für Bearbeitung vorbereiten
rs("Feld")= "NeuerInhalt": Neuen Inhalt zuweisen
rs.Update: Datensatz speichern
An einem konkreten Beispiel:
Sub Test6a()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Anz As Long, I As Long
Set db = CurrentDb()
Set rs = _
db.OpenRecordset("Kunden", dbOpenDynaset)
rs.MoveLast
Anz = rs.RecordCount
rs.MoveFirst
For I = 1 To Anz
rs.Edit
rs("UmsatzAktJahr") = 0
rs.Update
rs.MoveNext
Next
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Diese Routine durchläuft alle Datensätze einer Tabelle "Kunden" und setzt das Feld für den kumulierten Jahresumsatz auf "0" zurück.
Die Umsetzung mit ADO weicht davon in einigen Punkten ab: Um Feldinhalte ändern zu können, müssen Sie bei DAO zunächst wie oben gezeigt ein "rs.Edit" ausführen. Das ist bei ADO nicht notwendig. Nach der Initialisierung eines Recordsets können Sie sofort zum Beispiel per
rs("UmsatzAktJahr") = 0
eine Änderung vornehmen. Wenn Sie bei DAO nach einer Änderung per "Edit" beispielsweise mit "rs.MoveNext" auf einen anderen Datensatz positionieren, werden die Änderungen stillschweigend verworfen und sind somit verloren. ADO führt in diesen Fällen automatisch ein "Update" aus! Um zu verhindern, dass Änderungen gespeichert werden, müssen Sie bei ADO explizit die Methode "CancelUpdate" aufrufen, bevor Sie zu einem anderen Datensatz wechseln!
Eine Aktualisierung wie oben für DAO gezeigt, sieht dann in ADO zum Beispiel so aus:
Sub Test6b()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = CurrentProject.Connection
rs.Open "Kunden", _
conn, _
adOpenKeyset, _
adLockOptimistic
While Not rs.EOF
rs("UmsatzAktJahr") = 0
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Hier kann man also auf "Edit" vor der Änderung und "Update" nach der Änderung verzichten, dafür muss aber bei "Open" ein vierter Parameter "adLockOptimistic" angegeben werden, damit das Recordset als änderbar angesehen wird.
Um neue Datensätze zu einem Recordset hinzuzufügen, verwenden Sie sowohl mit DAO als auch mit ADO die Methode "AddNew". Danach können die einzelnen Felder wie bei einer Änderung mit "rs(<Feldname>) = <NeuerInhalt>" gefüllt werden. Anschließend ist bei DAO ein "Update" notwendig, damit der neue Datensatz gespeichert wird. Hier zunächst ein DAO-Beispiel:
Sub Test7a()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim I As Long
Set db = CurrentDb()
Set rs = _
db.OpenRecordset("Kunden", dbOpenDynaset)
rs.AddNew
rs("Kunden-Code") = "ABCDE"
rs("Firma") = "Testfirma"
.....
rs("Telefon") = "030/123 456"
rs.Update
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Bei ADO können Sie genauso vorgehen, es gibt allerdings die Möglichkeit, bei "AddNew" mit Parametern zu arbeiten und so direkt neue Feldinhalte zu übergeben:
Sub Test7b()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = CurrentProject.Connection
rs.Open "Kunden", _
conn, _
adOpenKeyset, _
adLockOptimistic
rs.AddNew Array("Kunden-Code", "Firma"), _
Array("ABCDE", "Testfirma")
rs.Update
rs.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Als ersten Parameter übergeben Sie ein Array mit den Namen der Felder, deren Inhalte gesetzt werden sollen, der zweite Parameter ist ein Array der Werte, die in die betreffenden Felder zu schreiben sind.
Das Löschen eines Datensatzes erfolgt sowohl bei DAO als auch bei ADO mit der Methode "rs.Delete", hier an einem DAO-Beispiel demonstriert:
Sub Test8()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = _
db.OpenRecordset("Artikel")
While Not rs.EOF
If rs("Auslaufartikel") = -1 And _
rs("Lagerbestand") = 0 Then
If MsgBox("Artikel '" & _
rs("Artikelname") & _
"' löschen?", _
vbYesNo + vbQuestion) = vbYes Then
rs.Delete
End If
End If
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Es werden alle Datensätze einer Tabelle "Artikel" durchlaufen. Handelt es sich beim aktuellen Artikel um einen Auslaufartikel und ist dessen Lagerbestand "0", so wird der Datensatz nach einer Sicherheitsabfrage gelöscht.
Damit sind wir am Ende unseres Einstiegs in die Nutzung von Recordsets. Sie können nun Recordsets initialisieren, in deren Datensätzen navigieren und suchen sowie Feldinhalte ändern und Datensätze anlegen oder löschen. Spezielle Funktionen und Möglichkeiten von DAO- und ADO-Recordsets werden Inhalt zukünftiger Tipps sein.