Filter speichern und wieder abrufen

Der Benutzer einer Access-Datenbank will sich nicht damit beschäftigen, Where-Ausdrücke zu definieren, mit denen er die Daten seiner Datenbank filtern kann. Er braucht aussagekräftige Bezeichnungen, mit denen er die gewünschten Daten erhält – am besten mit nicht viel mehr als einem Mausklick. Das ist eine schöne Aufgabe: Also statten wir unsere Anwendung mit einer solchen Möglichkeit aus, die der Benutzer sogar noch mit selbst angewendeten Filterkriterien anreichern kann. Und das, ohne auch nur einen Hauch von SQL zu beherrschen.

Ausgangsdatenbank

Die Beispieldatenbank enthält eine Tabelle tblKunden und eine Tabelle tblAnreden, wobei die Tabelle tblKunden über die Fremdschlüsselfelder LieferAnrede und RechnungAnrede mit der Tabelle tblAnreden verknüpft ist. Zusätzlich haben wir eine Abfrage namens qryKunden angelegt, welche die beiden Tabellen tblKunden und tblAnreden zusammenfasst. Dabei haben wir in dieser Abfrage die beiden Felder LieferAnredeID und RechnungAnredeID der Tabelle tblKunden weggelassen und dafür die Bezeichnung der Anreden aus der Tabelle tblAnreden hinzugefügt. Diese Abfrage dient als Datenherkunft eines Unterformulars namens sfmKundenfilter. Die Felder haben wir vollständig in den Detailbereich der Entwurfsansicht gezogen. Damit das Unterformular die Daten in der Datenblattansicht anzeigt, stellen Sie die Eigenschaft Standardansicht auf diesen Wert ein. Das Unterformular haben wir in ein Hauptformular namens frmKundenfilter gezogen, das neben diesem Unterformular natürlich noch die Steuer-elemente zum Anwenden der Filter enthalten soll. Dieser Aufbau sieht wie in Bild 1 aus.

Basisausstattung des Formulars frmKundenfilter samt Unterformular sfmKundenfilter

Bild 1: Basisausstattung des Formulars frmKundenfilter samt Unterformular sfmKundenfilter

Ziel der Lösung

Das Ziel ist nun, dem Hauptformular ein Kombinationsfeld hinzuzufügen, mit dem der Benutzer einen vordefinierten Filter auswählen kann. Hat er diesen ausgewählt, soll der Filter direkt auf die Daten im Unterformular angewendet werden. Das bedeutet, dass wir die Filter auch an irgendeiner Stelle vordefinieren und auch abrufbar machen müssen. Was bietet sich da besser an als eine Tabelle

Tabelle zum Speichern der Filter

Die Tabelle, in der wir die Filterkriterien speichern wollen, heißt tblFormularfilter und ist wie in der Entwurfsansicht aus Bild 2 aufgebaut. Neben dem Primärschlüsselfeld enthält die Tabelle drei Felder:

Tabelle zum Speichern der Filterkriterien

Bild 2: Tabelle zum Speichern der Filterkriterien

  • Bezeichnung: Bezeichnung des Filters, wie er auch im Kombinationsfeld des Formulars zur Auswahl angeboten werden soll
  • Filter: Filterkriterium im SQL-Format
  • Formularname: Name des Formulars, für das der Filter vorgesehen ist. Durch dieses Feld ermöglichen wir den Einsatz der Lösung in mehreren Formularen.

Da jede Bezeichnung nur einmal für jedes Formular verwendet werden soll, legen wir außerdem noch einen eindeutigen Index über die beiden Felder Bezeichnung und Formularname fest (s. Bild 3).

Eindeutiger Index über die beiden Felder Bezeichnung und Formularname

Bild 3: Eindeutiger Index über die beiden Felder Bezeichnung und Formularname

Um gleich mit dieser Tabelle arbeiten zu können, geben wir ein paar Beispiele für Filterkriterien in die Datenblattansicht der Tabelle ein (s. Bild 4).

Die Tabelle tblFormularfilter mit einigen Beispieldatensätzen

Bild 4: Die Tabelle tblFormularfilter mit einigen Beispieldatensätzen

Einbau des Filterkombinationsfeldes

Nun wollen wir das Kombinationsfeld zum Filtern der Daten des Unterformulars nach einem der vordefinierten Filter hinzufügen. Dazu legen Sie ein einfaches Kombinationsfeld im oberen Bereich des Formulars an und nennen es cboFormularfilter. Tragen Sie für die Eigenschaft Datensatzherkunft des Kombinationsfeldes die Abfrage tblFormularfilter ein. Stellen Sie für die Eigenschaft Spaltenanzahl den Wert 3 und für die Eigenschaft Spaltenbreiten den Wert 0cm;;0cm ein (s. Bild 5). Was bedeuten diese Werte Als Datensatzherkunft verwenden wir die Tabelle tblFormularfilter.

Hinzufügen des Kombinationsfeldes zur Auswahl des Filters

Bild 5: Hinzufügen des Kombinationsfeldes zur Auswahl des Filters

Wir benötigen das erste Feld als gebundene Spalte, das zweite als anzuzeigenden Wert und das dritte enthält das Filterkriterium, das wir auslesen wollen, wenn der Benutzer einen der Einträge ausgewählt hat. Also teilen wir dem Kombinationsfeld drei Spalten zu, von denen die erste und die dritte die Breite 0cm aufweisen sollen – also quasi ausgeblendet sind. Nur die mittlere Spalte soll erscheinen, und das in voller Breite. Daher finden Sie zwischen den beiden Semikola keine explizite Breitenangabe.

Nach Formular filtern

Nun haben wir allerdings in der Tabelle tblFormularfilter bereits ein Feld namens Formularname hinterlegt, mit dem wir festlegen wollen, für welches Formular der jeweilige Filter verwendet werden kann. Wir können ja durchaus ein Kundenformular, ein Artikelformular oder auch ein Lieferantenformular mit einem solchen Filter ausstatten.

Wie aber filtern wir die Datensatzherkunft eines Kombinationsfeldes nach dem Namen des Formulars, in dem es angezeigt wird Dies erledigen wir am einfachsten, indem wir die Datensatzherkunft beim Laden des Formulars einstellen. Die dazu notwendige Ereignisprozedur wird durch das Ereignis Beim Laden ausgelöst und sieht wie folgt aus:

Private Sub Form_Load()
     Me!cboFormularfilter.RowSource = _
         "SELECT * FROM tblFormularfilter  WHERE Formularname = ''" & Me.Name & "''"
End Sub

Danach finden wir im Kombinationsfeld bereits alle gewünschten Einträge vor (s. Bild 6).

Kombinationsfeldes zur Auswahl des Filters

Bild 6: Kombinationsfeldes zur Auswahl des Filters

Filterfunktion hinzufügen

Nun fehlt als Grundausstattung noch eine Funktion, die den in der Tabelle gespeicherten Filterausdruck nach der Auswahl eines der Einträge des Kombinationsfeldes auf die Daten des Unterformulars anwendet. Diese Prozedur erstellen wir für das Ereignis Nach Aktualisierung des Kombinationsfeldes. Sie sieht wie folgt aus:

Private Sub cboFormularfilter_AfterUpdate()
     Dim strFilter As String
     strFilter = Me!cboFormularfilter.Column(2)
     Me!sfmKundenfilter.Form.Filter = strFilter
     Me!sfmKundenfilter.Form.FilterOn = True
End Sub

Die Prozedur ermittelt mit der Eigenschaft Column(2) den Wert der dritten Spalte des ausgewählten Eintrags des Kombinationsfeldes und trägt diesen in die Variable strFilter ein (zur Erläuterung: der Index der Spalten im Kombinationsfeld startet mit 0). Dann weist sie diesen Ausdruck der Eigenschaft Filter des Form-Objekts des Unterformular-Steuerelements zu und stellt FilterOn auf den Wert True ein. Das Ergebnis sieht dann beispielsweise wie in Bild 7 aus.

Der Filter in Aktion

Bild 7: Der Filter in Aktion

Filter leeren

Nun fehlt noch eine einfache Funktion, mit welcher der Benutzer den Filter leeren und wieder alle Datensätze im Unterformular einblenden kann. Dazu haben wir zwei Möglichkeiten: Entweder wir fügen eine Schaltfläche hinzu, welche den Filter wieder entfernt, oder wir legen im Kombinationsfeld einen Eintrag an, der etwa den Text anzeigt. Hier entscheiden wir uns für den ersten Weg, was zwar bedeutet, dass wir ein zusätzliches Steuer-element anlegen müssen (s. Bild 8). Allerdings ist dies für den Benutzter offensichtlicher als ein Eintrag im Kombinationsfeld, der nicht direkt sichtbar ist.

Schaltfläche zum Deaktivieren des Filters

Bild 8: Schaltfläche zum Deaktivieren des Filters

Die Schaltfläche fügen Sie am besten direkt neben dem Kombinationsfeld ein und legen für das Ereignis Beim Klicken die folgende Ereignisprozedur an:

Private Sub cmdFilterLeeren_Click()
     Me!cboFormularfilter = Null
     Me!sfmKundenfilter.Form.Filter = ""
End Sub

Eigene Filter definieren

Nun kommt der interessante Teil: Sie wollen ja nicht immer, wenn der Benutzer ein neues Filterkriterium wünscht, zur Tastatur greifen und dem Benutzer anschließend eine neue Version der Datenbank zusenden. Es wäre doch toll, wenn der Benutzer selbst seine Filterkriterien zusammenstellen könnte. Den Grundstein dazu haben wir ja bereits gelegt, indem wir eine Tabelle zum Speichern der Filterkriterien angelegt haben – diese lädt natürlich dazu ein, weitere Kriterien hinzuzufügen.

Nun könnten Sie dem Benutzer grundlegende SQL-Kenntnisse vermitteln, damit er die Abfragekriterien selbst anhand der Felder und der gewünschten Vergleichswerte zusammenstellt. Ab einer gewissen Komplexität kommt der Benutzer auch sicher nicht um diesen Schritt herum. Aber für viele einfache Kriterien kann der Benutzer sich mit den Mitteln der Benutzeroberfläche behelfen: Dabei filtert er einfach selbst die Daten in dem Formular, indem er etwa auf den Pfeil nach unten im Spaltenkopf klickt, dann beispielsweise für ein Textfeld den Eintrag Textfilter|Enthält… auswählt und den gewünschten Vergleichswert in das nun erscheinende Feld eingibt (s. Bild 9).

Eingabe von Filterkriterien über die Benutzeroberfläche

Bild 9: Eingabe von Filterkriterien über die Benutzeroberfläche

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