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 ermittelnrs.MoveFirst
: Auf den ersten Datensatz springenrs.MoveLast
: Auf den letzten Datensatz springenrs.MoveNext
: Zum nächsten Datensatz gehenrs.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.