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 2

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. Nachdem wir im ersten Teil Woche Grundlagen zu Recordsets und die Initialisierung erläutert haben, geht es nun darum, wie in Recordsets navigiert und gesucht wird.

Zunächst zur Navigation in Recordsets: Um sich durch Recordsets zu bewegen oder den Status von Recordsets abzufragen, werden sowohl mit DAO als auch mit ADO die folgenden Methoden und Eigenschaften verwendet:

  • rs.RecordCount: Anzahl Datensätze im Recordset ermitteln
  • rs.MoveFirst: Auf den ersten Datensatz springen
  • rs.MoveLast: Auf den letzten Datensatz springen
  • rs.MoveNext: Zum nächsten Datensatz gehen
  • rs.MovePrevious: Zum vorhergehenden Datensatz gehen

Das folgende DAO-Beispiel verdeutlicht dies:

Sub Test3()
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim Anz As Long, I As Long

  Set db = CurrentDb()
  Set rs = _
    db.OpenRecordset("SELECT * FROM Kunden " & _
                     "WHERE Land = 'Deutschland'")
  Anz = rs.RecordCount
  For I = 1 To Anz
    Debug.Print rs("Firma")
    rs.MoveNext
  Next
  rs.Close

  Set rs = Nothing
  Set db = Nothing

End Sub

Hier wird zunächst ein Recordset initialisiert, das aus der Tabelle "Kunden" der aktuellen Datenbank alle Datensätze selektiert, bei denen das Feld "Land" den Inhalt "Deutschland" hat. Es muss bei "OpenRecordset()" also nicht immer eine Tabelle oder eine Abfrage angegeben werden, eine SQL-Abfrage wie die oben gezeigte ist ebenfalls möglich. Über "RecordCount" wird dann die Anzahl der Datensätze im Recordset abgefragt und einer Variablen zugewiesen. Bei über ODBC verknüpften Tabellen liefert "RecordCount" manchmal falsche Ergebnisse. Nutzen Sie dann die folgende Konstruktion:

rs.MoveLast
Anz = rs.RecordCount
rs.MoveFirst

"MoveLast" positioniert explizit auf den letzten Datensatz, so dass über "RecordCount" zuverlässig die Anzahl der Datensätze im Recordset abgefragt werden kann. Anschließend wird per "MoveFirst" wieder auf den ersten Datensatz gesprungen.

In einer Schleife durchlaufen wir dann alle Datensätze und geben den Inhalt des Feldes "Firma" für jeden Datensatz im Direktfenster aus, wobei "MoveNext" auf den jeweils nächsten Datensatz positioniert.

Alternativ kann eine Schleife zum Durchlaufen aller Datensätze auch mit Hilfe der folgenden Eigenschaften aufgebaut werden:

  • rs.EOF: Letzter Datensatz erreicht?
  • rs.BOF: Erster Datensatz erreicht?

Mit ADO sieht das zum Beispiel so aus:

Sub Test4a()
  Dim conn As New ADODB.Connection
  Dim rs As New ADODB.Recordset

  Set conn = CurrentProject.Connection
  rs.Open "select * from Kunden " & _
           "where Land= 'Belgien'", _
           conn, _
           adOpenKeyset
  While Not rs.EOF
    Debug.Print rs("Firma")
    rs.MoveNext
  Wend
  rs.Close

  Set rs = Nothing
  Set conn = Nothing

End Sub

Anstelle einer "For-Next"-Schleife wird hier eine "While-Wend"-Schleife mit Kriterium "rs.EOF" verwendet. "rs.EOF" liefert solange "False", bis der letzte Datensatz erreicht ist, dann wechselt es auf "True", so dass die Schleife terminiert wird. Eine weitere Besonderheit: das Recordset wird mit einem zusätzlichen Parameter "adOpenKeyset" initialisiert, so dass er bei Bedarf auch rückwärts durchblättert werden kann:

Sub Test4b()
  Dim conn As New ADODB.Connection
  Dim rs As New ADODB.Recordset

  Set conn = CurrentProject.Connection
  rs.Open "select * from Kunden " & _
           "where Land= 'Belgien'", _
           conn, _
           adOpenKeyset
  rs.MoveLast
  While Not rs.BOF
    Debug.Print rs("Firma")
    rs.MovePrevious
  Wend
  rs.Close

  Set rs = Nothing
  Set conn = Nothing

End Sub

Kommen wir zum Suchen in Recordsets: Mit DAO können Sie die Methoden "FindFirst", "FindNext", "FindPrevious" und "FindLast" nutzen, um Datensätze mit bestimmten Inhalten zu suchen. Die Eigenschaft "NoMatch" gibt dabei Auskunft, ob ein passender Datensatz gefunden wurde oder nicht. Das folgende DAO-Beispiel durchsucht einen Recordset nach Kunden aus "Frankreich" und gibt den Firmenamen im Direktfenster aus:

Sub Test5a()
  Dim db As DAO.Database
  Dim rs As DAO.Recordset

  Set db = CurrentDb()
  Set rs = db.OpenRecordset("Kunden", dbOpenDynaset)
  rs.FindFirst "Land= 'Frankreich'"
  Do
    Debug.Print rs("Firma")
    rs.FindNext "Land= 'Frankreich'"
  Loop Until rs.NoMatch
  rs.Close

  Set rs = Nothing
  Set db = Nothing

End Sub

Die Besonderheit: Das Recordset wird mit dem zusätzlichen Parameter "dbOpenDynaset" initialisiert, so dass auch eine Suche rückwärts möglich wäre:

.....
  rs.FindLast "Land= 'Frankreich'"
  Do
    Debug.Print rs("Firma")
    rs.FindPrevious "Land= 'Frankreich'"
  Loop Until rs.NoMatch
  rs.Close
.....

ADO kennt demgegenüber nur eine Methode "Find", kein "FindFirst", "FindNext" etc. – die Art der Suche wird hier über einen zusätzlichen Parameter gesteuert:

.....
  rs.MoveFirst
  rs.Find "Land = 'Frankreich'", 0
  While Not rs.NoMatch
    Debug.Print rs.Fields("Ort").Value
    rs.Find "Land = 'Frankreich'", 1
  Wend
.....

Dieses Beispiel sucht ausgehend vom ersten Datensatz (rs.MoveFirst) Richtung Recordset-Ende und gibt bei Übereinstimmung den Ort im Direktfenster aus. Beim ersten "Find" steht der Parameter "0" für "FindFirst", in der Schleife steht der Parameter "1" für "FindNext". Um rückwärts zu suchen, kommt die folgende Routine zum Einsatz:

.....
  rs.MoveLast
  rs.Find "Land = 'Frankreich'", 0
  While Not rs.NoMatch
    Debug.Print rs.Fields("Ort").Value
    rs.Find "Land = 'Frankreich'", 1
  Wend
.....

Hier wird ausgehend vom letzten Datensatz (rs.MoveLast) Richtung Recordset-Anfang gesucht. Beim ersten "Find" steht der Parameter "0" für "FindLast", in der Schleife steht der Parameter "1" für "FindPrevious".

In der nächsten Ausgabe erläutern wir, wie über Recordsets Feldinhalte geändert und Datensätze hinzugefügt oder gelöscht werden können.