DAO: Suchen, filtern und sortieren

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):

  • Recordsets auf Basis von Abfragen (Kapitel 3.3)
  • Recordsets mit dynamischen Parametern (Kapitel 3.4)
  • 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

    Schreibe einen Kommentar