Komfortabel filtern in Formularen

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Komfortabel filtern in Formularen

Im Beitrag »Filterbedingungen einfach zusammenstellen« erfahren Sie weiter hinten in dieser Ausgabe, wie Sie den fehleranfälligen Code für die Zusammenstellung von Filterausdrücken in eine Klasse auslagen und übersichtlicher gestalten. Der vorliegende Beitrag zeigt nun anhand eines Praxisbeispiels, wie Sie die gewonnenen Erkenntnisse und die verwendete Klasse in Access-Formularen zum Filtern der enthaltenen Daten einsetzen.

Praxisbeispiel

In der Suedsturm-Datenbank gibt es die Tabelle tblBestellungen. Die Daten aus dieser Tabelle sollen in einem Bestellübersichtsformular angezeigt und gefiltert werden. Filtern wollen wir nach Kundenname, Lieferadresse, Bestelldatum, Lieferdatum, Versanddatum, offene Lieferung und bestellte Artikel.

Für die Darstellung der Suchmaske und der Ergebnisliste wählen wir ein ungebundenes Hauptformular (frmBestell­uebersicht) mit ungebundenen Steuerelementen für die Filtereingabe. In das Hauptformular fügen wir ein Formular in Datenblattansicht (frmBestellUebersicht_SF_Bestellungen) als Unterformular ein.

Als Datenquelle für das Unterformular verwenden wir die Abfrage qryBestellListe. Für die Eingabe der Filterwerte fügen wir im Formularkopf des Hauptformulars entsprechende Steuerelemente ein. Eine Schaltfläche dient zum Anwenden der Filterwerte.

Als Alternative zur Schaltfläche fügen wir noch eine Checkbox ein, mit der wir eine automatische Filterung nach jeder Filterwert-Änderung aktivieren können. Zum Entfernen aller eingegeben Filterwerte dient eine weitere Schaltfläche. In Bild 1 sehen Sie das Filterformular direkt nach dem Öffnen. Damit im Unterformular direkt nach dem Öffnen keine Datensätze angezeigt werden, ist in der Formular-Eigenschaft Filter der Ausdruck 1=0 eingetragen.

Filterformular

Bild 1: Filterformular

Die Namen der Filtersteuerelemente beginnen alle mit dem Präfix fctl. Das erleichtert uns später im Code das Ansprechen der Steuerelemente in For Each-Schleifen.

Variante I: Filtern ohne Hilfsklasse

Erstellen wir als erste Variante den Code zum Filtern ohne Verwendung von Hilfsklassen. Wenn auf die Schaltfläche Filter anwenden geklickt wird, soll das Unterformular gefiltert werden.

Damit der Code im Formular übersichtlich bleibt, erstellen wir die Prozedur UseFilter zum Starten des Filtervorgangs und rufen diese in der Beim Klicken-Ereignisbehandlung der Schaltfläche auf.

In der UseFilter-Prozedur übergeben wir den über eine weitere Prozedur erzeugten Filterausdruck an das Unterformular.

Den vollständigen Inhalt der Prozedur CreateFilterString zur Filtertext-Erstellung werden wir später ergänzen. Zuerst geben wir zum Testen nur den Filterausdruck für den Filterwert in Firma zurück. Mit diesem Code können wir bereits einen ersten Test durchführen.

Dabei ruft die Ereignisprozedur, die durch das Ereignis Beim Klicken der Schaltfläche cmdUseFilter ausgelöst wird, eine weitere Routine namens UseFilter auf:

Private Sub cmdUseFilter_Click()
    UseFilter
End Sub

Diese startet eine weitere Prozedur namens SetSubFormFilter und übergibt als Parameter einen Wert, der von der Funktion CreateFilterString beigesteuert wird und wie folgt aussieht:

Private Sub UseFilter()
' Diese Prodedur startet die Filterung mit den Werten 
' in den Filter-Steuerelementen
    Call SetSubFormFilter(CreateFilterString)
End Sub

Diese sieht wie in Listing 1 aus.

Private Function CreateFilterString() As String
     'Diese Prozedur erzeugt den Filterausdruck 
     'aus den Filter-Steuerelementen
     With Me.fctlKundeFirma
         If Len(.Value) > 0 Then
             CreateFilterString = "Kunde_Firma LIKE '" _
                 & Replace(.Value, "'", "''") & "'"
         Else
             CreateFilterString = vbNullString
         End If
     End With
End Function 

Listing 1: Zusammensetzen des Filterausdrucks

Die Funktion prüft, ob das Filter-Textfeld fctlKundeFirma einen Wert enthält (Len(.Value) > 0). Falls ja, stellt sie einen Filterausdruck zusammen und gibt diesen als Funktionswert zurück.

Die Prozedur SetSubFormFilter nimmt diesen Filterstring entgegen und prüft, ob dieser bereits angewendet wurde. Dazu vergleicht sie den Wert der Eigenschaft Filter mit FilterString.

Nur wenn es sich um einen neuen Filter-Ausdruck handelt, wird FilterString der Eigenschaft Filter zugewiesen und der Filter mit der Eigenschaft FilterOn aktiviert oder deaktiviert – je nachdem, ob FilterString einen Ausdruck enthält oder nicht (s. Listing 2).

Private Sub SetSubFormFilter(ByVal FilterString As String)
     'Diese Prozedur kapselt die Datenfilterung im 
     'Unterformular
     'Vorteil: wenn man auf eine andere Variante filtern
     'will, muss man nur diese Prozedur ändern
     With Me.sfrBestellListe.Form
         If .Filter <> FilterString Then 
             'eine Änderung ist nur notwendig, 
             'wenn der Filtertext nicht gleich ist
             .Filter = FilterString
             .FilterOn = (Len(FilterString) > 0)
         End If
     End With
End Sub

Listing 2: Die Prozedur zum Setzen des Filters

Wenn Sie im Textfeld für den Firma-Filterwert einen Text eintragen, wird nach diesem Text gefiltert, sobald Sie auf die Schaltfläche Filter anwenden klicken. Sie können das Textfeld auch leer lassen und filtern. Dann werden alle Datensätze aus der Tabelle angezeigt.

Als Nächstes ergänzen wir den Code zum Leeren der Filtersteuerelemente. Da wir die Namen der Filtersteuerelemente mit dem Präfix fctl versehen haben, können wir die Formularsteuerelemente mittels For Each-Schleife durchlaufen und alle Filterfelder leeren.

Außerdem wollen wir nach dem Löschen der Filterwerte nicht alle Datensätze anzeigen, sondern im Unterformular keine Daten anzeigen, damit erkennbar ist, dass noch nicht gefiltert wurde.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.