Suche mit Liste

Wenn Sie Kundendaten in einem Formular anzeigen, nimmt dies eine Menge Platz ein. Für eine Übersichtsliste wird es in den meisten Fällen zu eng – daher kommt oft ein weiteres Formular als Werkzeug für die Auswahl des zu bearbeitenden Datensatzes hinzu. Mit ein paar Tricks packen Sie dennoch eine adäquate Funktion zum schnellen Auffinden bestimmter Kundendaten hinzu: zum Beispiel mit einem Textfeld zur Eingabe von Suchbegriffen, das seine Treffer in einem ansonsten verborgenen Listenfeld anzeigt und zur Auswahl anbietet.

Einen schönen Einsatzzweck für die Lösung aus diesem Beitrag finden Sie in einem weiteren Beitrag namens Formular für Liefer- und Rechnungsadressen (www.access-im-unternehmen.de/816). Das Formular zeigt jeweils genau einen Datensatz der Tabelle tblAdressen an. Eine gute Gelegenheit, eine platzsparende Möglichkeit zum Auswählen eines bestimmten Datensatzes einzubauen!

Was soll die Funktion bieten Grundsätzlich soll nur ein Textfeld zur Eingabe des Suchbegriffs sichtbar sein. Dieses soll bei Betätigung einer speziellen Tastenkombination, beispielsweise Strg + F, aktiviert werden und dem Benutzer die Möglichkeit zur Eingabe eines Suchbegriffs bieten. Dieser Suchbegriff soll nach noch festzulegenden Regeln den Datenbestand durchforsten und die Ergebnisse in einem Listenfeld anzeigen (s. Bild 1). Dieses Listenfeld soll jedoch nur sichtbar sein, wenn die Eingabe überhaupt Ergebnisse liefert! Enthält das Listenfeld einen passenden Eintrag, soll der Benutzer ganz einfach mit der Nach unten-Taste vom Textfeld zur Eingabe des Suchbegriffs zum Listenfeld gelangen, um einen der gefundenen Einträge auszuwählen. Hat er einen passenden Eintrag gefunden und ausgewählt, soll das Betätigen der Eingabetaste dazu führen, dass das Suchfeld geleert, das Listenfeld geschlossen und der betroffene Datensatz im Formular angezeigt wird.

pic005.png

Bild 1: Schnellsuche nach Kundendaten

Einfache Suche

Um die grundlegenden Techniken kennenzulernen und auszuprobieren, legen Sie zunächst ein Textfeld über den übrigen Steuerelementen an. Geben Sie dem Textfeld den Namen txtSuche. Fügen Sie außerdem ein Listenfeld hinzu, das genauso breit ist wie das Textfeld. Nennen Sie es lstSuchergebnis und stellen Sie seine Eigenschaft Sichtbar auf den Wert Nein ein, damit es beim Anzeigen des Formulars gar nicht erst erscheint.

Die Höhe können Sie indes gleich auf den gewünschten Wert einstellen – da das Listenfeld normalerweise unsichtbar ist, spielt der im Entwurf überdeckte Bereich keine Rolle (s. Bild 2).

pic001.png

Bild 2: Erster Entwurf des Suchfeldes und des Listenfeldes zur Anzeige der Suchergebnisse

Suche aktivieren per Strg + F

Die Suche soll mit der Tastenkombination Strg + F aktiviert werden. Dies erledigen Sie am besten mit dem Ereignis Bei Taste ab des Formulars. Damit dieses Ereignis funktioniert, stellen Sie außerdem die Eigenschaft Tastenvorschau auf Ja ein (s. Bild 3).

pic002.png

Bild 3: Aktivieren der Tastenkombination

Die Prozedur, die durch das Ereignis Bei Taste ab ausgelöst werden soll, sieht schließlich wie folgt aus:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyF
            If Shift = acCtrlMask Then
                Me!txtSuche.SetFocus
                KeyCode = 0
            End If
    End Select
End Sub

Die Prozedur prüft die beiden Parameter KeyCode und Shift. Hat KeyCode den Wert vbKeyF (für F) und Shift den Wert acCtrlMask (für die Strg-Taste), wollen die beiden Anweisungen in der If…Then-Bedingung ausgeführt werden.

Die erste verschiebt den Fokus auf das Steuerelement txtSuche, die zweite biegt den Wert des Parameters KeyCode auf 0 um, was dem Drücken keiner Taste entspricht.

Dies bewirkt, dass die gedrückte Taste nicht weiter ausgewertet wird. Würden Sie diese Einstellung nicht vornehmen, würde Strg + F von Access selbst ausgewertet, was die Anzeige des Access-eigenen Suchen-Dialogs nach sich ziehen würde.

Damit wäre die erste Teilaufgabe gelöst – der Benutzer gelangt mit der Tastenkombination Strg + F in das Suchfeld.

Suche nach Firmenname

Danach implementieren wir eine sehr einfache Suche, die nur den Firmennamen berücksichtigt. Die Suche soll nach Eingabe jedes einzelnen Zeichens ausgelöst werden, was den Einsatz der Ereigniseigenschaft Bei änderung voraussetzt.

Dieses Ereignis wird mit jeder änderung des angezeigten Textes des Suchfeldes ausgelöst. Fügen Sie den Wert [Ereignisprozedur] hinzu und klicken Sie auf die Schaltfläche mit den drei Punkten, um die nun im VBA-Editor erscheinende Ereignisprozedur wie in Listing 1 zu ergänzen.

Listing 1: Zusammenstellen und zuweisen eines Suchausdrucks, dessen Ergebnis im Listenfeld lstSuchergebnis angezeigt werden soll

Private Sub txtSuche_Change()
    Dim strSQL As String
    If Len(Me!txtSuche.Text) > 0 Then
        strSQL = "SELECT Firma_Lieferung FROM tblAdressen WHERE Firma_Lieferung LIKE ''" _
              & Me!txtSuche.Text & "*''"
        Me!lstSuchergebnis.RowSource = strSQL
        If Me!lstSuchergebnis.ListCount > 0 Then
            Me!lstSuchergebnis.Visible = True
        Else
            Me!lstSuchergebnis.Visible = False
        End If
    Else
        Me!lstSuchergebnis.RowSource = ""
        Me!lstSuchergebnis.Visible = False
    End If
End Sub

Die Prozedur stellt in der Variablen strSQL eine einfache SQL-Abfrage zusammen, die zunächst nur alle Firmennamen der Lieferanschrift zurückliefern soll, deren Name mit dem im Suchfeld eingetragenen Ausdruck beginnt.

Dies soll jedoch nur geschehen, wenn das Textfeld txtSuche überhaupt einen Ausdruck enthält, die Länge des Wertes der Eigenschaft Text des Textfeldes also größer 0 ist.

In diesem Fall setzt die Prozedur den SQL-Ausdruck zusammen, weist diesen der Eigenschaft RowSource des Listenfeldes zu und macht dieses schließlich sichtbar – allerdings nur, wenn dieses überhaupt mindestens einen Datensatz anzeigt.

Sollte das Textfeld txtSuche keinen Text enthalten, wird das Listenfeld schlicht unsichtbar gemacht.

Damit wäre bereits ein Dummy für den zweiten Schritt der Lösung erstellt: Das Listenfeld zeigt ein Suchergebnis an – wenn auch zugegebenermaßen nur ein einziges Feld bei Suche und Anzeige berücksichtigt wird (s. Bild 4).

pic003.png

Bild 4: Anzeigen der Suchergebnisse

Vom Suchfeld zur Ergebnisliste

Sobald die Suchliste mindestens ein Ergebnis anzeigt, soll der Benutzer mit einigen Tasten direkt über die Tastatur zum Listenfeld gelangen, um den gewünschten Eintrag auszuwählen (s. Bild 5).

pic004.png

Bild 5: Mit einem Tastendruck wird der erste Eintrag des Suchergebnisses markiert.

Welche Tasten sollen dies ermöglichen Am besten diejenigen, mit denen der Benutzer es auch sonst gewohnt ist, von Steuerelement zu Steuerelement zu springen. In diesem Fall wären dies die Nach rechts– und die Nach unten-Taste sowie die Tabulator-Taste. Das Betätigen dieser Tasten können Sie, während das Steuerelement txtSuche den Fokus hat, mit dessen Ereignisprozedur Bei Taste ab abfangen.

Diese Prozedur implementieren Sie wie in Listing 2. Die Prozedur prüft zunächst, ob das Listenfeld überhaupt sichtbar ist. Ist dies nicht der Fall, wird die Prozedur gleich verlassen und die gedrückte Taste hat die gleiche Wirkung, als ob diese Prozedur überhaupt nicht ausgelöst worden wäre. Wenn das Listenfeld jedoch mindestens einen Wert anzeigt und somit sichtbar ist, prüft die Prozedur den KeyCode der betätigten Taste. Lautet dieser vbKeyTab (Tabulator-Taste), vbKeyRight (Nach rechts-Taste) oder vbKeyDown (Nach unten-Taste), wird der Fokus auf das Listenfeld lstSuchergebnis verschoben. Außerdem wird gleich der erste Eintrag des Suchergebnisses markiert. Zusätzlich wird mit KeyCode = 0 sichergestellt, dass die Betätigung der Taste keine weiteren Aktionen auslöst.

Listing 2: Aktivieren des Listenfeldes und markieren des ersten Eintrags der Ergebnisliste

Private Sub txtSuche_KeyDown(KeyCode As Integer, Shift As Integer)
    If Me!lstSuchergebnis.Visible = False Then
        Exit Sub
    End If
    Select Case KeyCode
        Case vbKeyTab, vbKeyLeft, vbKeyDown
            Me!lstSuchergebnis.SetFocus
            Me!lstSuchergebnis = Me!lstSuchergebnis.ItemData(0)
            KeyCode = 0
        Case Else
            Debug.Print KeyCode
    End Select
End Sub

Von der Ergebnisliste zum Suchfeld

Wenn Sie die Einträge der Ergebnisliste durchgesehen haben (was ja durchaus per Scrolling erfolgen muss, wenn nicht alle Einträge direkt sichtbar sind), möchten Sie vielleicht wieder zum Suchfeld zurückgelangen, um den Suchbegriff genauer zu spezifizieren. Wenn dies auf einfache Weise geschehen soll, ist auch hier eine kleine Ereignisprozedur nötig, die diesmal durch das Ereignis Bei Taste ab des Listenfeldes lstSuchergebnis angestoßen wird. Diese Prozedur sieht wie in Listing 3 aus und prüft zunächst, welche Taste gedrückt wurde. Im Falle der Nach oben– und der Nach links-Taste wird die Variable bolZurueck ebenso auf True eingestellt wie bei der Tastenkombination Umschalttaste + Tabulator-Taste.

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