DAO: Recordsets öffnen, lesen und bearbeiten

Die DAO-Bibliothek liefert alle für den Zugriff auf und die Manipulation von Daten in den Tabellen einer Access-Datenbank. Sie können damit Datensätze einer Tabelle oder Abfrage durchlaufen und dabei Informationen auslesen, Datensätze anlegen, bearbeiten oder löschen. Für all diese Aktionen benötigen Sie ein DAO-Recordset – ein Objekt, dass den Zugriff auf die benötigten Daten ermöglicht. Dieser Artikel stellt die Techniken vor, die zum öffnen und Durchlaufen von Datensatzgruppen mittels VBA nötig sind.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1111_DAO_Recordsets.mdb.

Es gibt diesmal ausschließlich Code-Beispiele. Wenn Sie diese ausprobieren möchten, legen Sie in einer Datenbank ein neues Standardmodul an, geben die Listings ein, platzieren die Einfügemarke irgendwo im Code der auszuführenden Routine und betätigen die Taste F5 (oder F8 für den Einzelschrittmodus).

Records und Recordsets

Ein Record entspricht einem Datensatz, ein Recordset einer Datensatzgruppe. Dabei kann eine Datensatzgruppe allerdings auch keinen oder auch nur einen Datensatz enthalten.

Unter VBA greifen Sie auf Datensätze zu, um diese zu zählen, neu zu erstellen, zu bearbeiten, zu löschen oder einfach um die enthaltenen Werte zu untersuchen.

Recordset öffnen

Das öffnen eines Recordsets erfordert das vorherige Deklarieren und Instanzieren eines Database-Objekt, das einen Verweis auf die Datenbank mit dem zu öffnenden Objekt enthält. Dies geht auf die Schnelle mit den folgenden beiden Zeilen:

Dim db As DAO.Database
Set db = CurrentDb

Weitere Informationen hierzu finden Sie im Artikel DAO: Datenbank im Griff mit dem Database-Objekt. Das auf diese Weise verfügbar gemacht Database-Objekt bietet die Funktion OpenRecordset an, mit der Sie die zu öffnende Datensatzgruppe definieren und die einen Verweis auf die zu erstellende Datensatzgruppe zurückliefert.

Für den besseren überblick steigen wir gleich mit einem größeren Beispiel ein:

Public Sub RecordsetOeffnen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset("tblArtikel", _
         dbOpenDynaset)
     Do While Not rst.EOF
         Debug.Print rst!ArtikelID, rst!Artikelname
         rst.MoveNext
     Loop
End Sub

Diese Prozedur deklariert neben dem Database– auch ein Recordset-Objekt namens rst, dass den Verweis auf die zu erstellende Datensatzgruppe aufnehmen soll. über diesen Verweis greifen Sie später auf die Daten der Datensatzgruppe zu. Dann erstellt die OpenRecordset-Methode ein Recordset, dass alle Felder und alle Datensätze der Tabelle tblArtikel enthält. Dazu brauchen Sie nur den Namen der betroffenen Tabelle als ersten Parameter anzugeben. Zur Bedeutung des zweiten Parameters kommen wir später; vorerst können Sie den Wert dbOpenDynaset als Standard verwenden.

Nach dem Ausführen dieser Anweisung macht rst prinzipiell den kompletten Inhalt der angegebenen Datenherkunft, hier der Tabelle tblArtikel verfügbar. Danach folgt ein Konstrukt, dass Sie noch ganz oft einsetzen werden: Das Durchlaufen der Datensätze einer Datensatzgruppe. Dies geschieht innerhalb einer Do While-Schleife. Diese prüft jeweils zu Beginn den Wert der Eigenschaft EOF der Recordset-Objekts rst.

Hierzu zur Erläuterung: Der Datensatzzeiger kann sich vor dem ersten Datensatz einer Datensatzgruppe befinden, aber auch hinter dem letzten Datensatz. Wenn EOF den Wert True zurückgibt, befindet sich der Datensatzzeiger hinter dem letzten Datensatz. In diesem Fall sollen die in der Do While-Schleife enthaltenen Anweisungen nicht mehr ausgeführt werden.

Dies wird jedoch zu Beginn nicht der Fall sein. Die Beispieltabelle enthält 77 Datensätze, die erst einmal durchlaufen werden wollen. Damit der Datensatzzeiger, der beim öffnen einer Datensatzgruppe standardmäßig auf den ersten Datensatz zeigt, sich zum nächsten Datensatz der Datensatzgruppe bewegt, rufen Sie die Methode MoveNext des Recordset-Objekts rst auf.

Vorher jedoch soll eine weitere Anweisung ein paar Daten des aktuellen Datensatzes im Direktfenster ausgeben, und zwar die Werte der Felder ArtikelID und Artikelname. Dies gelingt auch auf Anhieb, wie Bild 1 zeigt. Die Debug.Print-Anweisung gibt die beiden Werte eines Datensatzes jeweils in einer eigenen Zeile aus.

Ausgabe von Daten im Direktfenster

Bild 1: Ausgabe von Daten im Direktfenster

Auf Daten zugreifen

Im Beispiel haben Sie bereits eine Methode kennengelernt, auf die Feldinhalte des aktuellen Datensatzes zuzugreifen: die Ausrufezeichen-Syntax (rst!Artikelname). Insgesamt gibt es die folgendenMöglichkeiten, auf den Inhalt eines Feldes zuzugreifen:

rst.Fields("Artikelname").Value
rst.Fields("Artikelname")
rst.Fields(1).Value
rst.Fields(1)
rst(1).Value
rst(1)
rst("Artikelname").Value
rst("Artikelname")
rst!Artikelname.Value
rst!Artikelname

Die erste Variante verwendet explizit die Fields-Auflistung des Recordset-Objekts. Mit dieser können Sie auf alle Felder zugreifen, entweder über den Namen eines Feldes oder über den Index (0 für das erste Feld, 1 für das zweite Feld und so weiter).

Mit Value greifen Sie explizit auf den Wert zu, ohne Value wird der Wert der Standardeigenschaft des Field-Objekts ausgegeben – und diese lautet auch Value.

Fields ist wiederum die Standardauflistung des Recordset-Objekts, sodass Sie hier Fields(1) einfach durch (1) ersetzen können. Alternativ verwenden Sie auch hier den Feldnamen, also Fields(„Artikelname“) oder („Artikelname“). Schließlich gibt es die Ausrufezeichen-Syntax, wie Sie auch im ersten Beispiel zum Einsatz kam.

Recordset und Database schließen und leeren

Nach der Verwendung sollten Sie das Recordset-Objekt schließen und die Objektvariable leeren, die Database-Variable brauchen Sie nur zu leeren. Die drei notwendigen Anweisungen sehen wie folgt aus:

rst.Close
Set rst = Nothing
Set db = Nothing

Da diese immer gleich sind, führen wir sie in den folgenden Beispielen nicht explizit auf.

Vor und zurück

Eine der Methoden zum Bewegen des Datensatzzeigers haben Sie mit MoveNext bereits kennengelernt. Es gibt noch weitere ähnliche Methoden:

  • MovePrevious: Bewegt den Datensatzzeiger zum vorherigen Datensatz.
  • MoveFirst: Positioniert den Datensatzzeiger auf den ersten Datensatz.
  • MoveLast: Positioniert den Datensatzzeiger auf den letzten Datensatz.

Zu weit bewegt

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar