Home > Artikel > Ausgabe 6/2017 > Suche in Lookupfeldern

Suche in Lookupfeldern

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Die Suche nach Datensätzen mit bestimmten Werten in Text- oder Zahlenfeldern haben wir in Acces [basics] bereits bearbeitet. Aber was ist, wenn es um Kombinationsfelder geht, welche die Daten aus einer Lookup-Tabelle anzeigen? So wie im einfachsten Fall bei den Anreden einer Kundentabelle? Dann werden Sie in der Regel erstmal nicht an die Eingabe eines Suchetextes denken, sondern dem Benutzer die Möglichkeit geben wollen, den gesuchten Datensatz auch im Suchfeld per Kombinationsfeld auszuwählen. Dieser Artikel zeigt, wie das gelingt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1706_Lookupsuche.accdb.

Artikel nach Kategorie durchsuchen

Die Datenblattansicht von Access bietet seit einigen Access-Versionen die Möglichkeit, über den Pfeil nach unten ein Menü zu öffnen, mit dem Sie alle Einträge des aktuellen Feldes anhaken und damit die Suche nach Datensätzen mit diesem Inhalt im entsprechenden Feld starten können (siehe Bild 1).

Eingebaute Suche nach einem Eintrag

Bild 1: Eingebaute Suche nach einem Eintrag

Das Ergebnis entspricht dann wie in Bild 2 genau den Erwartungen. Was aber nun, wenn wir diese Suche nicht anbieten können oder wollen und eine eigene Suche implementieren müssen, die so ähnlich arbeitet – und in diesem Fall zumindest ein Kombinationsfeld anbieten soll, um die passenden Datensätze zu ermitteln?

Suchergebnis mit eingebauter Suche

Bild 2: Suchergebnis mit eingebauter Suche

Dann benötigen wir zunächst ein Formular, welches das Datenblatt mit den zu durchsuchenden Datensätzen in einem Unterformular anzeigt. Dazu erstellen Sie zunächst ein Unterformular namens sfmLookupsuche und weisen der Eigenschaft Datenherkunft die Tabelle tblArtikel zu.

Ziehen Sie dann alle Felder dieser Tabelle aus der Feldliste in den Detailbereich des Formularentwurfs und stellen Sie noch die Eigenschaft Standardansicht auf den Wert Datenblatt ein. Speichern und schließen Sie das Formular nun.

Legen Sie ein neues Formulars namens frmLookupsuche an, welches als Hauptformular dienen soll. Ziehen Sie das Unterformular sfmLookupsuche aus dem Navigationsbereich in den Detailbereich des neuen Formulars. Stellen Sie die Eigenschaften Navigationsschaltflächen, Datensatzmarkierer, Bildlaufleisten und Trennlinien des Hauptformulars auf Nein und die Eigenschaft Automatisch zentrieren auf Ja ein. Fügen Sie über dem Unterformular schließlich noch das Kombinationsfeld hinzu, mit dem wir die Suchbegriffe festlegen wollen (siehe Bild 3). Das Kombinationsfeld nennen wir cboSucheLieferant.

Suchformular mit Kombinationsfeld

Bild 3: Suchformular mit Kombinationsfeld

Filterausdruck ermitteln

Wenn Sie wissen wollen, welchen Filterausdruck Access automatisch einstellt, wenn Sie mit der eingebauten Filtermöglichkeit arbeiten wollen, welche wir eingangs vorgestellt haben, brauchen Sie nur das Formular zu öffnen und den Filter festzulegen.

Nun öffnen Sie den VBA-Editor und geben im Direktbereich einen Ausdruck ein, der den aktuellen Wert der Filter-Eigenschaft des Unterformulars ausgibt:

Forms(0).sfmLookupsuche.form.filter

Die Ausgabe lautet wie folgt:

([Lookup_LieferantID].[Firma]="Bigfoot Breweries")

Was ist nun [Lookup_LieferantID].[Firma] für ein Ausdruck? Wir konnten es nicht herausfinden. Selbst wenn wir den Code des Formulars mit der folgenden Methode in eine Textdatei exportiert haben, konnten wir diese Zeichenfolge nicht finden:

SaveAsText acForm, "sfmLookupsuche", CurrentProject.Path & "\form.txt"

Fest steht jedenfalls, dass Access wohl hier irgendwie auf ein Recordset zugreift, das sich hinter dem Kombinationsfeld zur Auswahl des Lieferanten verbirgt und diesen als Feld im Filterausdruck einsetzt.

Kombinationsfeld mit Daten füllen

Wie auch immer: Wir können uns nicht auf irgendwelche nirgends offensichtlich definierten Feldnamen beziehen, wenn wir programmieren, und füllen zunächst unser Kombinationsfeld mit den Daten, die wir zur Suche nach den Lieferanten auswählen wollen.

Dazu stellen wir die Eigenschaft Datensatzherkunft des Kombinationsfeldes auf die Abfrage aus Bild 4 ein. Damit es das Primärschlüsselfeld als gebundene Spalte verwendet und diese aber ausblendet, stellen sie die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein. Das Zwischenergebnis sieht dann wie in Bild 5 aus.

Das Kombinationsfeld im Einsatz

Bild 4: Das Kombinationsfeld im Einsatz

Abfrage als Datensatzherkunft für das Such-Kombinationsfeld

Bild 5: Abfrage als Datensatzherkunft für das Such-Kombinationsfeld

Nun müssen wir noch eine Ereignisprozedur hinzufügen, die nach der Auswahl eines der Einträge des Kombinationsfeldes ausgelöst wird und die Daten des Datenblatts entsprechend des Filterkriteriums filtert.

Dazu stellen Sie für die Eigenschaft Nach Aktualisierung des Kombinationsfeldes den Wert [Ereignisprozedur] ein und klicken auf die Schaltfläche mit den drei Punkten (...) neben der Eigenschaft.

Dies öffnet den VBA-Editor und zeigt gleich die neue, leere Prozedur cboSucheLieferanten_AfterUpdate an (siehe Bild 6). Diese füllen wir nun wie folgt:

Neue Ereignisprozedur im VBA-Editor

Bild 6: Neue Ereignisprozedur im VBA-Editor

Private Sub cboSucheLieferant_AfterUpdate()

Dim lngLieferantID As Long

Dim strSQL As String

lngLieferantID = Nz(Me!cboSucheLieferant, 0)

If Not lngLieferantID = 0 Then

strSQL = "LieferantID = " & lngLieferantID

Me!sfmLookupsuche.Form.Filter = strSQL

Me!sfmLookupsuche.Form.FilterOn = True

Else

Me!sfmLookupsuche.Form.Filter = ""

End If

End Sub

Diese Prozedur deklariert zunächst zwei Variablen namens lngLieferantID und strSQL. Die Variable lngLieferantID wird gleich mit dem aktuellen Wert des Feldes cboSuche gefüllt. Allerdings kann es vorkommen, dass der Benutzer das Kombinationsfeld geleert hat, und dann liefert dieses den Wert Null. Dieser kann nicht in einer Long-Variablen gespeichert werden, also sorgen wir mit der Nz-Funktion dafür, dass die in diesem Fall der Wert 0 zurückgegeben und in der Variablen lngLieferantID gespeichert wird.

Danach prüfen wir in einer If...Then-Bedingung, ob lngLieferantID einen Wert ungleich 0 enthält, was bedeuten würde, dass der Benutzer einen der vorhandenen Einträge ausgewählt hat.

In diesem Fall stellen wir in der Variablen strSQL einen SQL-Ausdruck zusammen, den wir später als Filterkriterium nutzen wollen. Der Ausdruck besteht aus dem Feldnamen LieferantID, dem Gleichheitszeichen sowie dem Vergleichswert aus der Variablen lngLieferantID.

Dieser wird als Wert der Eigenschaft Filter des Unterformulars eingestellt. Hier ist wichtig, dass Sie nicht das Unterformular-Steuerelement referenzieren (Me!sfmLookupsuche), sondern das darin enthaltene Formular, das wir mit der Form-Eigenschaft des Unterformular-Steuerelements referenzieren (Me!sfmLookupsuche.Form).

Damit der Filter aktiviert wird, müssen wir auch noch die Eigenschaft FilterOn auf den Wert True einstellen. Das Ergebnis sieht dann beispielsweise wie in Bild 7 aus.

Erfolgte Auswahl im Kombinationsfeld

Bild 7: Erfolgte Auswahl im Kombinationsfeld

Wenn der Benutzer das Kombinationsfeld geleert hat, dann soll das Unterformular wieder alle Datensätze anzeigen. Praktisch bedeutet dies, dass das Kombinationsfeld den Wert Null liefert, den wir als 0 in lngLieferantID speichern. Dies bewirkt die Ausführung des Else-Teils der If...Then-Bedingung. Die einzige Anweisung dort stellt die Eigenschaft Filter wieder auf eine leere Zeichenkette ein (""). Dadurch erscheinen alle Einträge wieder im Unterformular.

Nach mehreren Kombinationsfeldern filtern

Da wir schon eine Tabelle mit zwei Lookup-Feldern haben, fügen wir noch ein zweites Kombinationsfeld hinzu, mit dem wir nach einem zweiten Kriterium filtern können.

Dieses Steuer­element platzieren wir wie in Bild 8 und nennen es cboLookupKategorie. Als Datensatzherkunft stellen wir die folgende Abfrage ein:

Zweites Such-Kombinationsfeld

Bild 8: Zweites Such-Kombinationsfeld

SELECT tblKategorien.KategorieID,

tblKategorien.Kategoriename

FROM tblKategorien

ORDER BY tblKategorien.Kategoriename;

Für die beiden Eigenschaften Spaltenanzahl und Spaltenbreiten legen wir wieder die Werte 2 und 0cm fest.

Für dieses Kombinationsfeld können wir eine ähnliche Ereignisprozedur hinterlegen wir für das vorherige Steuerlement:

Private Sub cboSucheKategorie_AfterUpdate()

Dim lngKategorieID As Long

Dim strSQL As String

lngKategorieID = Nz(Me!cboSucheKategorie, 0)

If Not lngKategorieID = 0 Then

strSQL = "KategorieID = " & lngKategorieID

Me!sfmLookupsuche.Form.Filter = strSQL

Me!sfmLookupsuche.Form.FilterOn = True

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!