Filterkriterien für Formulare, Teil III: Kombinationsfelder

In den ersten beiden Teilen dieser Artikelreihe haben Sie erfahren, wie Sie Felder der verschiedenen Datentypen filtern. Nun geht es ans Eingemachte: Wir filtern nach dem Inhalt von Kombinationsfeldern. Eigentlich könnte dies ganz leicht sein: Der Benutzer wählt einfach eine Wert des Kombinationsfeldes aus und die Datenherkunft wird nach dem Wert im entsprechenden Feld gefiltert. Allerdings kann es ja auch geschehen, dass man nicht nach dem Wert des gebundenen Feldes im Kombinationsfeld, sondern nach dem angezeigten Wert filtern möchte. Wir schauen uns beide Fälle an.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1306_FilterkriterienFuerFormulare.mdb.

Beispielformular

Das Beispielformular sieht wie in Bild 1 aus. Es heißt frmFilternNachKombinationsfeld und enthält im Formularkopf ein Kombinationsfeld namens cboLieferantNachID und ein Textfeld namens txtLieferantNachName.

Formular zum Filtern nach Kombinationsfeldern und ihren Inhalten

Bild 1: Formular zum Filtern nach Kombinationsfeldern und ihren Inhalten

Im Detailbereich haben wir ein Unterformular namens frmFilternNachKombinationsfeld eingerichtet, das die Daten der Tabelle tblArtikel anzeigt.

Filtern nach der gebundenen Spalte

Das Kombinationsfeld cboLieferantNachID soll nach der Auswahl eines Eintrags direkt diejenigen Artikel im Unterformular anzeigen, die vom angegebenen Lieferanten geliefert werden. Dazu muss das Kombinationsfeld allerdings erst einmal alle Lieferanten anzeigen. Diese können Sie auf zwei Arten beziehen:

  • Erstens über die Tabelle tblLieferanten. Dies würde alle Lieferanten liefern, die überhaupt vorhanden sind.
  • Zweitens über eine Abfrage, welche die Tabellen tblArtikel und tblLieferanten verknüpft. Auf diese Weise würde das Kombinationsfeld nur diejenigen Lieferanten anzeigen, die aktuell einem Artikel zugeordnet sind.

Da beide Varianten interessant sind, schauen wir uns beide an. Im ersten Fall weisen Sie der Eigenschaft Datensatzherkunft des Kombinationfeldes die folgende SQL-Anweisung zu:

SELECT LieferantID, Firma 
FROM tblLieferanten ORDER BY Firma;

Die Datensätze der Tabelle tblLieferanten werden durch die Klausel ORDER BY Firma direkt nach dem Firmennamen des Lieferanten sortiert.

Damit das Kombinationsfeld nur die Werte des zweiten Feldes anzeigt, aber den Wert aus dem Feld LieferantID aus dem ersten Feld als gebundene Spalte verwendet, stellen Sie noch die beiden folgenden Eigenschaften ein:

  • Spaltenanzahl: 2
  • Spaltenbreiten: 0cm

Das Filtern selbst ist relativ leicht – Sie brauchen nur eine Ereignisprozedur für die Ereigniseigenschaft Nach Aktualisierung des Formulars zu hinterlegen, welche den Filterausdruck des Unterformulars einstellt. Diese Ereignisprozedur finden Sie in Listing 1.

Private Sub cboLieferantNachID_AfterUpdate()
     With Me!sfmFilternNachKombinationsfeld.Form
         .Filter = "LieferantID = " & Me!cboLieferantNachID
         .FilterOn = True
     End With
End Sub

Listing 1: Lieferanten nach ID filtern

Nach der Auswahl eines der Einträge aus dem Kombinationsfeld zeigt das Unterformular nun bereits alle verfügbaren Einträge an (siehe Bild 2).

Filtern von Datensätzen nach der gebundenen Spalte des Nachschlagefeldes

Bild 2: Filtern von Datensätzen nach der gebundenen Spalte des Nachschlagefeldes

Alle Artikel anzeigen

Was aber geschieht, wenn Sie wieder alle Datensätze anzeigen möchten Das Leeren des Kombinationsfeldes hilft an dieser Stelle nicht weiter. Genau genommen löst dies nach der Aktualisierung des Kombinationfeldes etwa durch Betätigen der Eingabetaste sogar einen Fehler aus – und zwar Fehler 3075, Syntaxfehler (fehlender Operator) in Abfrageausdruck ‘LieferantID = ‘. Da cboLieferantNachID leer ist, stellt die Prozedur also einen ungültigen Ausdruck zusammen. Dies können Sie mit einer einfachen Prüfung umgehen: Sie fragen einfach vor dem Setzen des Filters den Wert des Kombinationfseldes ab. Ist dieser Null, wird der Inhalt durch 0 ersetzt. In diesem Fall leert die neue Version der Prozedur aus Listing 2 den Filter und das Unterformular zeigt wieder alle Datensätze an. Anderenfalls führt das Formular den Filter wie gewohnt aus.

Private Sub cboLieferantNachID_AfterUpdate()
     With Me!sfmFilternNachKombinationsfeld.Form
         If Not Nz(Me!cboLieferantNachID, 0) = 0 Then
             .Filter = "LieferantID = " & Me!cboLieferantNachID
             .FilterOn = True
         Else
             .Filter = ""
         End If
     End With
End Sub

Listing 2: Berücksichtigung eines geleerten Kombinationsfeldes zur Auswahl der Artikel

Eine weitere Alternative ist ein spezieller Eintrag im Kombinationsfeld, der die Bezeichnung aufweist und ebenfalls zum Leeren des Filters führt.

Dieser Wert sollte außerdem als erster Eintrag des Kombinationsfeldes angezeigt werden. Dazu ist ein kleiner Trick nötig, der den Einsatz des UNION-Schlüsselworts erforderlich macht.

Solche Abfragen können Sie nicht über den Abfrageentwurf, sondern nur über die SQL-Ansicht eingeben. Also gehen Sie folgendermaßen vor (im Beispielformular unter cboLieferantNachIDUndAlle zu finden):

Schreibe einen Kommentar