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).
Bild 1 zeigt die Indizes der Tabelle Artikel. Sie erhalten diese Anzeige, wenn Sie in der Entwurfsansicht einer Tabelle den Menüeintrag Ansicht/Indizes auswählen.
Das Beispiel aus Quellcode 2 zeigt, wie Sie Datensätze mit Seek durchsuchen: Sie geben zunächst mit der Index-Eigenschaft des Recordset-Objekts an, welches Feld beziehungsweise welche Felder Sie durchsuchen möchte – zu Letzterem später mehr.
Die zwei Parameter der Seek-Methode selbst legen den Vergleichsoperator sowie den Vergleichswert fest. Seek ist relativ unflexibel: Es erlaubt lediglich die Vergleichsoperatoren gleich (=), größer gleich (>=), kleiner gleich (<=) und ungleich (<>).
Quellcode 2: Artikel suchen per Seek
Public Function SuchenPerSeek() ... Dim strOperator As String Dim strVergleichswert As String Set db = CurrentDb Set rst = db.OpenRecordset("Artikel", dbOpenTable) strOperator = "=" strVergleichswert = "Aniseed Syrup" rst.Index = "Artikelname" rst.Seek strOperator, strVergleichswert If Not rst.NoMatch Then Debug.Print rst!Artikelname End If ... End Function
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo