Listenfeld nach Tastendruck aktualisieren (Access 97, 2000)
Veröffentlicht am 30.12.2003
Frage:
Ich habe ein Formular mit einem Textfeld und einem Listenfeld. Die Datensatzherkunft des Listenfeldes ist eine Abfrage mit den Feldern Name und TelefonNr. Als Bedingung vom Name-Feld habe ich
Wie[Formulare]![TelnrSuchen]![txtName] & "*"
eingegeben. Wenn ich nun im Name-Feld den ersten Buchstaben des Namens eingebe, werden im Listenfeld nur die Namen angezeigt, dessen erster Buchstabe mit der Eingabe übereinstimmt. Als Ereigniseigenschaft des Textfeldes BeiTasteAuf habe ich
Forms![TelnrSuchen]![lstNamesliste].Requery
eingegeben damit nach Eingabe jedes weiteren Buchstaben das Listenfeld aktualisiert wird. Diese Aktualisierung funktioniert aber nur, wenn ich kurz in die Entwurfsansicht und wieder in die Formularansicht wechsle.
Wie kann das Listenfeld nach Eingabe jedes Buchstaben aktualisiert werden? Die Einfügemarke sollte dabei das Textfeld nicht verlassen.
Antwort:
Access-97-Datenbank mit Demo-Datenbank
Das Problem mit der Lösung mit BeiTasteAuf ist, dass der Wert des Textfeldes nicht nach jedem Tastendruck aktualisiert wird, obwohl Sie die eingebenden Buchstaben im Feld sehen. Das Feld wird erst dann aktualisiert, wenn Sie das Feld verlassen.
Auch das BeiÄnderung-Ereignis nutzt uns nichts, weil die Listenfeld-Abfrage keinen aktuellen Textfeldwert erhält. Sie müssten also die NachAktualisierung-Ereignisprozedur implementieren, die das Listenfeld nach dem vollständigen Eingabewert filtert und aktualisiert.
Um das Listenfeld wirklich nach jedem Tastendruck zu aktualisieren, verwenden Sie eine statische Variable innerhalb der BeiTasteAuf-Prozedur. Dieser Variable wird jedem eingegebenen Buchstaben hinzugefügt. Die Variable behält auch ihren aktuellen Wert bei jedem Aufruf der Prozedur:
Static strLikeText As String
Je nach Buchstaben können Sie die neuen Zeichen in der BeiTasteAuf-Prozedur hinzufügen bzw. löschen:
Select Case KeyCode
Case vbKeyBack ' Ein Zeichen löschen
If Len(strLikeText) > 0 Then
strLikeText = Left$(strLikeText, Len(strLikeText) - 1)
End If
Case vbKeyEscape ' Auswahl löschen
strLikeText = ""
Case 65 To 90 ' Das Zeichen (A-Z) hinzufügen
strLikeText = strLikeText & Chr$(KeyCode)
End Select
Diese Variable können Sie dann als Where-Klausel für die Listenfeld-Abfrage verwenden:
Me!lstFirmen.RowSource = "SELECT Firma, Telefon FROM Kunden
WHERE Firma Like '" & strLikeText _ & "*';"