Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Problem mit Textfeld beim Filtern

Begonnen von datekk, August 19, 2015, 17:54:13

⏪ vorheriges - nächstes ⏩

datekk

Hallo Leute,

ich habe gerade ein Problem mit einem Textfeld. Dieses ist in einem Formularkopf und soll bei Änderung eine Änderung des Filters bewirken.

Leider bewirkt folgender Code:


Private Sub txtSuche_Change()
Me.Filter = "Suche like '*" & Me.txtSuche & "*'"
Me.FilterOn
End Sub


... dass bei jedem eingegebenen Zeichen der Filter zwar reagiert, das Textfeld (Suchfeld txtSuche) den Fokus verliert, ihnt wieder neu erhält, das Zeichen darin markiert und bei weiterer Texteingabe somit überschreibt. Also man kann im Moment nicht nach mehr als einem Zeichen filtern.

Ich habe darauf hin gegoogelt und meinen Code wie folgt geändert (ich nutze zur Hilfe Zeilennummern für spätere Verweise):


1:   Private Sub txtSuche_Change()
2:   Dim strFilter As String
3:   Dim intStart As Integer
4:   intStart = Me!txtSuche.SelStart
5:   If Not Len(Me!txtSuche.Text) = 0 Then
6:   strFilter = "Suche like '*" & Me.txtSuche & "*'"
7:   Me.Filter = strFilter
8:   Me.FilterOn = True
9:   Me.txtSuche.SetFocus
10: Me!txtSuche.SelStart = intStart
11: Else
12: Me.Filter = ""
13: Me.FilterOn = False
14: Me!txtSuche.SetFocus
15: End If
16: End Sub


Jetzt bricht die Prozedur trotzdem ab und sagt mir: Laufzeitfehler 2185.. Eigenschaft nur möglich wenn Steuerelement den Fokus hat.

Beim Debuggen steht der Zeiger dann auf Zeile 5 oder manchmal sogar auf Zeile 10 obwohl ich in Zeile 9 dem Steuerelement den Fokus gegeben habe.

Wo ist denn da jetzt noch das Problem?  Und muss so ein "Textfeld-Live-Filter" (Eigenschaft = bei Änderung) so umständlich programmiert werden? :-[
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Wurliwurm

Das Ereignis Change() ist wohl der falsche Zeitpunkt. Hier den Fokus per Code zu setzen ist wahrscheinlich ein Fehler.

Ich hab kurz geschaut, wie ich so was früher gemacht habe. Das Ereignis KeyPress ist wahrscheinlich das richtige. Hier immer die Eigenschaft .text abfragen (was immer zum Fehler führt, wenn kein Fokus)

datekk

Hi. Danke. Das hab ich auch schon probiert. Im wesentlichen auch hier die gleichen Fehler.
Ich habe noch vergessen zu erwähnen, dass nach obigem zweiten Code die Suche schon teilweise funktioniert, aber nur solange, wie die Suchliste dann ein Ergebnis zeigen kann - tippt man hier ein Zeichen zuviel ein kommt wieder die Fehlermeldung wie oben geschrieben...

Oder wenn man sich verschreibt und das letzte Zeichen löschen will.. dann kommt auch sofort die Fehlermeldung.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Wurliwurm

Nimm mal das .selstart raus. Frag im KeyPress das .text ab in eine String variable, und wenn diese nicht leer ist, den Filter setzen, sonst Filter entfernen.

Me bezieht sich auf das Formular, wo das Textfeld ist. Evtl liegt hier ein Fehler. Es sollte kein Endlosformular sein.

MzKlMu

#4
Hallo,
das Ereignis txtSuche_Change() ist schon richtig, wenn das bei jedem Tastendruck reagieren soll. Allerding muss dann die Text Eigenschaft verwendet werden, da Value zu diesem Zeitpunkt nicht aktuell ist.
Ändere wie folgt:
strFilter = "Suche like '*" & Me.txtSuche.Text & "*'"
Der Code lässt sich auch noch eindampfen bzw. muss auch angepasst werden:
Private Sub txtSuche_Change()
Dim intStart As Integer
    intStart = Len(Me!txtSuche.Text)
    Me.Filter = "Suche like '*" & Me.txtSuche.Text & "*'"
    Me.FilterOn = True
    Me!txtSuche.SelStart = intStart + 1
End Sub
ungetestet

Heißt das Tabellen/Abfragefeld wirklich "Suche" ?
Gruß Klaus

datekk

Super MzKIMu..  ::) das klappt prima.

Das Abfragefeld heißt tatsächlich "Suche".. Es ist ein Feld, welches sich aus Firmenname, Anschrechpartner und sonstigem zusammensetzt und damit die Suche nicht nur auf ein Tabellenfeld bezieht.

Also vielen lieben Dank.
:)
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

Ich muss doch nochmal was nachfragen. Der Code verarbeitet keine Leerzeichen. Drücke ich Space, rückt der Cursor nicht nach vorn im Textfeld....
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Hi,
ZitatDrücke ich Space, rückt der Cursor nicht nach vorn im Textfeld....
was heißt "nach vorn" (=links)? Du meinst wohl, das abschließende (=rechte) Leerzeichen geht verloren.
Das passiert durch das mit dem Filtern verbundene Aktualisieren des Formulars.

So sollte es klappen:
Private Sub txtSuche_Change()
    Dim intLen As Integer
    intLen = Len(Me!txtSuche.Text)
    Me.txtFilter = "Suche Like '*" & Me.txtSuche.Text & "*'"
    Me.Filter = Me.txtFilter
    Me.FilterOn = True
    Me.txtSuche = Format(Me.txtSuche, String(intLen, "@") & "!")
    Me!txtSuche.SelStart = intLen + 1
End Sub
Freundliche Grüße
MaggieMay

datekk

Das funktioniert. Es war zwar ein kleiner Fehler drin, den konnte ich berichtigen. Hier der Code:



Private Sub txtSuche_Change()
On Error Resume Next
   
Dim intLen As Integer
intLen = Len(Me!txtSuche.Text)
Me.Filter = "Suche Like '*" & Me.txtSuche.Text & "*'"
Me.FilterOn = True
Me.txtSuche = Format(Me.txtSuche, String(intLen, "@") & "!")
Me!txtSuche.SelStart = intLen + 1

End Sub


Also vielen lieben Dank :)
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

Kannst Du mir noch sagen, was das "@" und das "!" im Code String(intLen, "@") & "!") bedeutet?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Das "@" steht für ein (Leer-)Zeichen, der Ausdruck
String(intLen, "@")
liefert eine Zeichenkette von so vielen @-Zeichen wie es der aktuellen Länge des Eingabefeldes entspricht.
Das ergäbe also bei einer Länge von 4 den folgenden Ausdruck
Format(Me.txtSuche, "@@@@")
Das Ausrufezeichen sorgt für linksbündige Ausrichtung.
Auf diese Weise werden also verloren gegangene abschließende Leerzeichen wieder hinzugefügt.

Zu finden in der Access-Hilfe bzgl. String- und Format-Funktion.
Freundliche Grüße
MaggieMay