Zusammenfassung
Suchen, filtern und sortieren Sie mit DAO.
Techniken
VBA, DAO, Datenmodellierung
Voraussetzungen
Access 97 und höher
Beispieldatenbank
DAO97.mdb, DAO00.mdb
André Minhorst, Duisburg
Wer DAO verwendet, um per VBA Datensätze mit Datensätzen zu arbeiten, kann diese auch durchsuchen, filtern und sortieren. Der vorliegende Beitrag zeigt, welche Möglichkeiten es dazu gibt.
Wer in DAO mit Datensätzen arbeitet, um diese auszugeben, zu ändern oder zu löschen, will nicht unbedingt alle in der Datenherkunft enthaltenen Datensätze verwenden.
Um die gewünschten Datensätze zu finden, gibt es mehrere Möglichkeiten: Man schränkt die Datensatzgruppe schon beim öffnen ein oder man sucht nach dem öffnen nach den passenden Datensätzen. In letzterem Fall gibt es wiederum einige Möglichkeiten, die Sie in den folgenden Abschnitten kennen lernen werden.
Suchen beim Erzeugen des Recordsets
Wenn möglich, sollten Sie Such- und Filtervorgänge bereits beim Erzeugen des Recordset-Objekts durchführen. Reichlich Möglichkeiten dazu finden Sie im ersten Teil dieser Beitragsreihe (DAO, Teil 1: Database- und Recordsetobjekt, Shortlink 354):
Der Vorteil dieser Methoden ist, dass direkt nur die benötigten Datensätze in das Recordset geschrieben werden. Das ist wesentlich performance-schonender, als wenn man zunächst ein Recordset mit allen zu Grunde liegenden Daten füllt und dann mit den passenden DAO-Methoden nach den gewünschten Daten sucht.
Suche per Find…-Methode
Diese Möglichkeit geht davon aus, dass die Datensatzgruppe mehr als nur die gesuchten Datensätze enthält.
Um in einer Datensatzgruppe Datensätze mit bestimmten Eigenschaften zu suchen, verwendet man die FindFirst-, FindNext-, FindLast- oder FindPrevious-Methode. Diese erwartet jeweils einen Kriterienausdruck, der dem WHERE-Teil einer SQL-Abfrage entspricht. Voraussetzung für den Einsatz dieser Methoden ist, dass das Recordset mit dem Wert acOpenDynaset oder acOpenSnapshot für den Parameter Type geöffnet wurde.
Die Eigenschaft NoMatch prüft nach dem Durchführen einer dieser Methoden, ob die Suche ein Ergebnis ergeben hat. Die Routine aus Quellcode 1 zeigt die Anwendung der FindFirst- und der FindNext-Methode, wobei alle Datensätze ermittelt werden sollen, deren Artikelname mit dem Buchstaben A beginnt.
Quellcode 1: Datensätze suchen mit der Find-Methode
Public Function SuchenPerFind() ... Dim strKriterium As String Set db = CurrentDb Set rst = db.OpenRecordset("Artikel", dbOpenDynaset) strKriterium = "Artikelname LIKE ''A*''" rst.FindFirst strKriterium Do While Not rst.NoMatch ''...etwas mit den Datensätzen tun Debug.Print rst!Artikelname rst.FindNext strKriterium Loop ... End Function
Bild 1: Verwalten von Indizes
Die FindFirst-Methode versucht, den ersten Datensatz mit dem angegebenen Kriterium zu finden, die NoMatch-Eigenschaft prüft, ob dies erfolgreich war. Falls ja, gibt die Routine den Artikelnamen aus und versucht mit FindNext, den nächsten passenden Datensatz zu finden.
Die FindPrevious- und die FindLast-Methode funktionieren ähnlich, damit können Sie etwa eine Datensatzgruppe von hinten nach vorne durchsuchen.
Suchen in indizierten Feldern mit Seek
Im Gegensatz zu den Find-Methoden können Sie die Seek-Methode nur zusammen mit Datensatzgruppen des Typs dbOpenTable einsetzen. Außerdem muss das Feld, das durchsucht werden soll, indiziert sein.
Ein weiterer Unterschied zu den Find-Methoden ist, dass man nur ein Feld einer Datensatzgruppe gleichzeitig als Kriterium verwenden kann.
Index festlegen
Indizes sorgen neben dem Sichern der Eindeutigkeit der in Feldern enthaltenen Daten auch dafür, dass Access interne Tabellen anlegt, die das schnelle Auffinden von Datensätzen mit bestimmten Werten erlauben (siehe auch Indizierung mit Access, Shortlink 308).