Home > Artikel > Ausgabe 11/2011 > DAO: Recordsets öffnen, lesen und bearbeiten

DAO: Recordsets öffnen, lesen und bearbeiten

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

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?

Genauso wie die oben bereits vorgestellte Eigenschaft EOF die Position hinter dem letzten Datensatz markiert, können Sie mit der Eigenschaft BOF prüfen, ob der Datensatzzeiger sich vor dem ersten Datensatz befindet.

Dies ist wichtig, wenn Sie die Daten einer Datensatzgruppe mit den oben genannten Methoden durchlaufen. Sollte sich der Datensatzzeiger etwa bereits vor dem ersten Datensatz befinden, löst ein erneuter Aufruf der Methode MovePrevious einen Fehler aus – genau wie der Aufruf von MoveNext, wenn der Datensatzzeiger sich bereits hinter dem letzten Datensatz befindet (siehe Bild 2).

Fehler beim Bewegen des Datensatzzeigers

Bild 2: Fehler beim Bewegen des Datensatzzeigers

Position des Datensatzzeigers

Manchmal kann es hilfreich sein, die Position des Datensatzzeigers zu kennen. Das Recordset-Objekt bietet dazu zwei Möglichkeiten an:

  • AbsolutePosition: Liefert die genaue Position, wobei der Wert 0 dem ersten Datensatz entspricht.
  • PercentPosition: Liefert die prozentuale Position.

Die Position können Sie beispielsweise beim Durchlaufen der Datensatzgruppe ausgeben lassen – hier mit absoluter und prozentualer Position:

Do While Not rst.EOF

     Debug.Print rst!ArtikelID, _

         rst.AbsolutePosition, rst.PercentPosition

     rst.MoveNext

Loop

Die Ausgabe für dieses Beispiel finden Sie in Bild 3. Sie können den Datensatzzeiger mit diesen beiden Eigenschaften auch positionieren. Wenn Sie etwa Informationen zum 50. Datensatz einer Datensatzgruppe benötigen, verwenden Sie folgende Anweisungen.

Ausgabe der absoluten und relativen Position des Datensatzzeigers

Bild 3: Ausgabe der absoluten und relativen Position des Datensatzzeigers

Wichtig ist, dass Sie wie beim Zählen der Datensätze mit RecordCount zuerst einmal zum letzten Datensatz springen müssen, um alle Datensätze zu erfassen:

rst.MoveLast

rst.AbsolutePosition = 50

Debug.Print rst!ArtikelID, rst.AbsolutePosition, _

rst.PercentPosition

Punktlandung

Wer genau weiß, wieviele Datensätze er den Datensatzzeiger nach vorn oder hinten verschieben möchte, kann auch die Move-Methode einsetzen.

Diese erwartet zwei Parameter:

  • Anzahl der zu überspringenden Datensätze
  • Ausgangsdatensatz (wenn leer, wird die aktuelle Position verwendet)

Mit Kenntnis der AbsolutePosition-Eigenschaft lässt sich hier leicht experimentieren. Die folgende Prozedur springt zunächst 10 Sätze nach vorn, dann 5 zurück und schließlich 100 nach vorn.

Bei nur 77 Datensätzen in der betroffenen Tabelle gibt rst.AbsolutePosition den Wert -1 aus und die EOF-Eigenschaft ist True.

Public Sub Springen()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Set db = CurrentDb

     Set rst = db.OpenRecordset("tblArtikel", _

         dbOpenDynaset)

     rst.Move 10

     Debug.Print rst.AbsolutePosition

     rst.Move -5

     Debug.Print rst.AbsolutePosition

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!