Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2017.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Schnellsuche mit Verzögerung

Eine Schnellsuche ist eine tolle Sache: Sie geben Buchstabe für Buchstabe ein und erhalten direkt nach der Eingabe das passende Suchergebnis. Dummerweise kann es je nach Datenherkunft und Backend auch einmal etwas länger dauern beziehungsweise performancemindernd sein, wenn Sie allzu oft neue Abfragen absenden. Doch es gibt einen feinen Kompromiss: Eine Schnellsuche, die nicht direkt nach der Eingabe eines Buchstabens das neue Suchergebnis präsentiert, sondern die erst nach einem gewissen Zeitraum ohne neue Eingabe neue Daten lädt.

Beispieldatenbank

Unser Versuchsaufbau für diese kleine Lösung sieht im Entwurf wie in Bild 1 aus. Wir haben dort zwei Textfelder angelegt, von denen das eine txtSchnellsuche heißt und die übliche Schnellsuche abbilden soll. Darunter finden Sie das Textfeld txtSchnellsucheMitVerzoegerung, das unsere angepasste Variante liefert.

Formular mit Textfeldern für die Schnellsuche und die Schnellsuche mit Verzögerung

Bild 1: Formular mit Textfeldern für die Schnellsuche und die Schnellsuche mit Verzögerung

Das Listenfeld lstKunden darunter verwendet als Datensatzherkunft die folgende Abfrage:

SELECT tblKunden.KundeID, tblKunden.Firma 
FROM tblKunden 
ORDER BY tblKunden.Firma;

Die Eigenschaft Spaltenanzahl stellen wir auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein, damit nur die Spalte mit dem Feld Firma angezeigt wird.

Herkömmliche Schnellsuche

Die einfache Schnellsuche, bei der das Suchergebnis mit der Eingabe jedes einzelnen Zeichens aktualisiert wird, sieht in der Formularansicht etwa wie in Bild 2 aus.

Einfache Schnellsuche im Einsatz

Bild 2: Einfache Schnellsuche im Einsatz

Um dies zu realisieren, hinterlegen Sie für die Ereigniseigenschaft Bei Änderung des Textfeldes txtSuchbegriff die Prozedur aus Listing 1.

Private Sub txtSchnellsuche_Change()
     Dim strSuchbegriff As String
     strSuchbegriff = Me!txtSchnellsuche.Text
     Me!lstKunden.RowSource = "SELECT tblKunden.KundeID, tblKunden.Firma FROM tblKunden WHERE Firma LIKE '*" _
         & strSuchbegriff & "*' ORDER BY tblKunden.Firma"
End Sub

Listing 1: Einfache Schnellsuche

Die Prozedur speichert den aktuellen Inhalt des Textfeldes txtSuchbegriff in der Variablen strSuchbegriff und verwendet diesen dann um ihn per Textverkettung als WHERE-Bedingung in die SELECT-Abfrage einzubinden, die dann der Eigenschaft RowSource des Listenfeldes zugewiesen wird. Dadurch werden die Einträge des Listenfeldes dann bei jeder Änderung angepasst. Leeren Sie das Textfeld wieder, kehren logischerweise auch alle Einträge wieder zurück.

Verzögerte Variante

Um eine Variante mit Verzögerung zu programmieren, bauen wir auf der vorherigen Variante auf. Nun wollen wir dafür sorgen, dass die Funktion die Datensatzherkunft des Listenfeldes nur dann aktualisiert, wenn eine bestimmte Zeit ohne Eingabe des Benutzers vergangen ist. Wie aber wollen wir das nachhalten?

Formulare bieten ja mit dem Ereignis Bei Zeitgeber und der Eigenschaft Zeitgeberintervall eine Kombination, um regelmäßig Ereignisse auszulösen. Diese wollen wir nun für unser Vorhaben einsetzen. In der Prozedur, die durch das Ereignis Bei Änderung des Textfeldes txtSchnellsucheMitVerzoegerung ausgelöst wird, aktivieren wir die Sanduhr (damit wir einen optischen Effekt haben – den können Sie auch weglassen) und stellen TimerInterval auf 1000, damit die Ereignisprozedur, die durch das Ereignis Bei Zeitgeber ausgelöst wird, nun alle 1.000 Millisekunden feuert:

Private Sub txtSchnellsucheMitVerzoegerung_Change()
     DoCmd.Hourglass True
     Me.TimerInterval = 1000
End Sub

Das Ereignis Bei Zeitgeber implementieren Sie so wie in Listing 2. Es enthält zu Beginn genau die gleichen Zeilen wie die Variante der einfachen Schnellsuche. Danach allerdings stellen wir TimerInterval wieder auf 0, damit das Ereignis nicht automatisch nochmal ausgelöst wird (außer, wenn der Benutzer das nächste Zeichen eingibt und wieder eine Sekunde wartet). Danach blenden wir die Sanduhr wieder aus.

Private Sub Form_Timer()
     Dim strSuchbegriff As String
     strSuchbegriff = Me!txtSchnellsucheMitVerzoegerung.Text
     Me!lstKunden.RowSource = "SELECT tblKunden.KundeID, tblKunden.Firma FROM tblKunden WHERE Firma LIKE '*" _
         & strSuchbegriff & "*' ORDER BY tblKunden.Firma"
     Me.TimerInterval = 0
     DoCmd.Hourglass False
End Sub

Listing 2: Verzögerte Schnellsuche

Durch Variation des Wertes für TimerInterval können Sie beeinflussen, wie schnell die Suche nach Unterbrechung der Eingabe in das Suchfeld die aktuellen Suchergebnisse hervorbringt.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

SchnellsucheMitVerzoegerung.accdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.