Unsere Webseiten benötigen JavaScript. Dies scheint in Ihrem Browser jedoch deaktiviert zu sein.

News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

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.