Home > Artikel > Ausgabe 12/2011 > DAO: Recordsets filtern, durchsuchen und sortieren

DAO: Recordsets filtern, durchsuchen und sortieren

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 Recordsets können Sie die Daten aus Tabellen und Abfragen für die Bearbeitung und Betrachtung unter VBA verfügbar machen. Dieser Artikel zeigt, wie Sie ein Recordset gezielt mit den benötigten Daten füllen, wie Sie diesen Datenbestand durchsuchen und wie Sie die Daten sortieren und filtern.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1112_DAO_Recordsets_Suchen.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).

Recordset gezielt füllen

Bereits mit der Angabe der Datenherkunft eines Recordsets beim Öffnen mit der OpenRecordset-Funktion können Sie die benötigten Daten nach Belieben einschränken. Dabei gelten die gleichen Regeln, die auch für Abfragen gelten: Sie können sowohl gezielt eines oder mehrere Felder als auch einen oder mehrere Datensätze in das Recordset-Objekt einlesen. Dabei verwenden Sie natürlich eine oder mehrere Tabellen als Datenherkunft, die typischerweise miteinander verknüpft sind.

Zur Festlegung der Datenherkunft haben Sie die folgenden drei Möglichkeiten:

  • Sie geben einfach den Namen einer Tabelle an. Das Recordset enthält alle Datensätze mit allen Feldern der angegebenen Tabelle.
  • Sie definieren die Daten für das Recordset mithilfe einer Abfrage, in der Sie die Tabellen, die Felder und die Kriterien für die aufzunehmenden Daten festlegen.
  • Sie legen einen SQL-Ausdruck fest, der angibt, welche Daten aus welchen Tabellen und Feldern angezeigt werden sollen – und dort legen Sie ebenfalls die Kriterien fest.

Später lernen Sie, dass man Recordsets auch auf Basis anderer Recordsets öffnen kann.

Tabellen und Felder vorauswählen

Wenn Sie nicht alle Felder aller Datensätze einer Tabelle im Recordset verfügbar möchten, verwenden Sie am einfachsten eine Abfrage, die nur die benötigten Felder zurückliefert. In dieser Abfrage können Sie auch mehrere, normalerweise miteinander verknüpfte Tabellen kombinieren und Felder aus mehreren Tabellen zusammenführen.

Wenn Sie in einem Recordset beispielsweise auf eine Liste von Personen samt Anrede zugreifen möchten, wobei die Anreden sich in einer Lookup-Tabelle befinden, mit der die Personen-Tabelle per Fremdschlüsselfeld verknüpft ist, legen Sie zuerst eine Abfrage wie in Bild 1 an.

Zusammenführen von Personen und Anreden für ein Recordset

Bild 1: Zusammenführen von Personen und Anreden für ein Recordset

Wenn Sie diese Daten nun ausgeben möchten, verwenden Sie eine Prozedur wie die folgende:

Public Sub PersonenUndAnreden()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Set db = CurrentDb

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

         dbOpenDynaset)

     Do While Not rst.EOF

         Debug.Print rst!Anrede, rst!Vorname, _

             rst!Nachname

         rst.MoveNext

     Loop

     rst.Close

     Set rst = Nothing

     Set db = Nothing

End Sub

Sie sehen: Das Ausgeben der Daten erfolgt genauso, als ob diese sich in einer einzigen Tabelle befinden würden.

Filtern und Sortieren beim Öffnen des Recordsets

Wenn Sie nicht alle Datensätze einer Tabelle in ein Recordset aufnehmen möchten, können Sie diese ebenfalls mithifle einer Abfrage filtern. Dazu legen Sie einfach ein entsprechendes Kriterium für die betroffenen Felder fest. Wie dies gelingt, erfahren Sie beispielsweise im Artikel SQL: SELECT-Abfragen.

Nachträgliches Filtern eines Recordsets

Wenn Sie ein Recordset bereits geöffnet haben und die enthaltenen Datensätze auf Basis eines bestimmten Kriteriums weiter filtern möchten, können Sie die Filter-Eigenschaft einsetzen.

Die Filter-Eigenschaft erwartet eine gültige SQL-Bedingung als Ausdruck, also beispielsweise Anrede = 'Frau'. Nachdem sie die Filter-Eigenschaft gesetzt hat, öffnet die folgende Prozedur ein zweites Recordset-Objekt namens rstNurFrauen auf Basis des ersten Recordsets rstAlle und wendet den Filter darauf an:

Public Sub PersonenNachAnrede()

     Dim db As DAO.Database

     Dim rstAlle As DAO.Recordset

     Dim rstNurFrauen As DAO.Recordset

     Set db = CurrentDb

     Set rstAlle = db.OpenRecordset("qryPersonen", _

         dbOpenDynaset)

     rstAlle.Filter = "Anrede = 'Frau'"

     Set rstNurFrauen = rstAlle.OpenRecordset

     Do While Not rstNurFrauen.EOF

         Debug.Print rstNurFrauen!Anrede, _

             rstNurFrauen!Nachname

         rstNurFrauen.MoveNext

     Loop

     rstNurFrauen.Close

     Set rstNurFrauen = Nothing

     rstAlle.Close

     Set rstAlle = Nothing

     Set db = Nothing

End Sub

Es ist kein guter Programmierstil, aber Sie kommen bei dieser Technik auch mit einer einzigen Recordset-Variablen aus:

Public Sub PersonenNachAnrede_II()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Set db = CurrentDb

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

         dbOpenDynaset)

     rst.Filter = "Anrede = 'Frau'"

     Set rst = rst.OpenRecordset

     Do While Not rst.EOF

         Debug.Print rst!Anrede, rst!nachname

         rst.MoveNext

     Loop

     rst.Close

     Set rst = Nothing

     Set db = Nothing

End Sub

Nachträgliches Sortieren eines Recordsets

Mit der gleichen Vorgehensweise können Sie ein Recordset auf nachträglich sortieren. Dazu stellen Sie mit der Sort-Eigenschaft des ersten Recordsets die Sortierung ein.

Dazu verwenden Sie den Namen des Feldes und eines der Schlüsselwörter ASC oder DESC die Reihenfolge der Sortierung. Wenn gleich nach mehreren Feldern sortieren möchten, verwenden Sie mehrerer solcher Ausdrücke und trennen diese durch Kommata.

Nach dem Festlegen der Sort-Eigenschaft erstellen Sie wiederum ein neues Recordset-Objekt auf Basis des ersten Recordsets. In diesem Fall speichern wir den Verweis darauf direkt in der gleichen Recordset-Variablen:

Public Sub PersonenSortiert()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Set db = CurrentDb

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

         dbOpenDynaset)

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!