Juni 24, 2021, 21:35:30

Neuigkeiten:

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


Listenfeldanzeige dynamisch anzeigen -> langsam

Begonnen von Xoar, Mai 18, 2021, 18:12:01

⏪ vorheriges - nächstes ⏩

Xoar

Moin Profi´s

ich habe ein Textfeld (txtSuche), in dem ich das Ereignis "BeiÄnderung" folgenden Code hinzugefügt habe.
Dim Suchwert As String

    Suchwert = " SELECT MitarbeiterID, Vorname, Nachname, Geschlecht " _
    & " FROM tblMitarbeiter" _
    & " WHERE Vorname like '*" & Me!TXTSuche.Text & "*' " _
    & " OR Nachname like '*" & Me!TXTSuche.Text & "*' " _
    & " ORDER BY Nachname"
    Me!ListFeldSuche.RowSource = Suchwert
   
    If Me!ListFeldSuche.Visible = False Then Me!ListFeldSuche.Visible = True
Exit Sub

dieser Code setzt die RowSouce von dem Listenfeld "ListfeldSuche" nach jeder Zeicheneingabe von "txtSuche" neu.

Funktionieren tut das technisch einwandfrei, aber es ist super langsam. Zwischen jeder Zeicheneingabe liegt bestimmt ca. 0,2-0,4 Sekunden.
Ich habe die Felder Vorname, Nachname nicht indiziert! Es sind ca. 600 Datensätze.

Gibt es ne schnellere andere Möglichkeit?

Die Datenbank ist in FE und BE geteilt und das BE liegt auf einem Netzlaufwerk (700mBit/s Verbindung).

Grüße :)

PhilS

Zitat von: Xoar am Mai 18, 2021, 18:12:01Funktionieren tut das technisch einwandfrei, aber es ist super langsam. Zwischen jeder Zeicheneingabe liegt bestimmt ca. 0,2-0,4 Sekunden.
"Super langsam" :-)
0,2-0,4 Sekunden sind normalerweise kaum wahrnehmbar, es sei denn es wird eine erwartete Reaktion (das Tippen) blockiert.

Zwei Lösungsansätze:

1.) Wenn es nicht wesentlich mehr als die 600 Datensätze werden, könntest du beim Öffnen des Forms alle Datensätze in ein ADO.Recordset in den Speicher laden und dann deine Filter auf das Recordset anwenden und die Ergebnisse dessen an die Listbox binden. - Habe ich selbst schon so implementiert, damit sollte die Zeitverzögerung nicht mehr relevant sein.

2.) Generell ist es sinnlos nach jedem Tastendruck die Suche auszuführen. I.d.R. tippt der Benutzer eine Suchzeichenfolge, die er im Sinn hat ein und er tippt sie unabhängig von Ergebnissen, die bereits vorher auftauchen. Also wäre es sinnvoller nicht direkt mit Tastendruck die Suche auszulösen, sondern einen Timer laufen zu lassen, der erst dann sucht, wenn sich die Sucheingabe für 0,x Sekunden nicht mehr geändert hat. - Habe ich selbst noch nicht umgesetzt, daher fehlen mir Erfahrungswerte für die Verzögerung der Suche (0,x Sekunden).
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Xoar

Alles klar, ich werd es mal testen 👍🏻

ebs17

Kleine Ergänzung: Den Filter nach jedem einzelnen eingegebenen Zeichen  ist eine große Freude meist für Neulinge, weil sich da etwas zum eigenen Wohlgefallen bewegt - mit den schon genannten Folgen.
Etwas sinnfrei ist es schon, wenn man bereits ab dem ersten Zeichen filtert (wenn es nicht gerade selten wie ein y ist). Man würde da also erst ab einer bestimmten Ausgangsmenge (4 Zeichen?)  reagieren. In der Praxis aber mit richtigen Datenmengen würde man den Filter ausführen lassen, wenn die Usereingabe vollständig ist, somit einmal.

ZitatIch habe die Felder Vorname, Nachname nicht indiziert!
Ist das Programm/Gesetz oder Selbstkritik?
Wenn einem dann nachhaltig Performance am Herzen liegt, würde man schon fragliche Felder indizieren sowie ein Abfragedesign nutzen, dass diese Indizierung auch nutzen kann.
Mit freundlichem Glück Auf!

Eberhard

Josef P.

[etwas OT]

Hallo!

Falls nach dem Filtern im Listenfeld ein Mitarbeiter ausgewählt werden soll, könnte man gleich ein Kombinationsfeld verwenden. Damit kann man die Eingabe automatisch vervollständigen lassen.

BTW: Ich bin bei Suchfelder, die sich auf mehrere Datenfelder beziehen immer etwas skeptisch. Der Anwender weiß doch üblicherweise, ob der nach dem Nachnamen oder den Vornamen suchen will.

mfg
Josef

Xoar

Mahlzeit,

ja....ich habe die Kritik/Tipps angenommen und filtere nun nach Abschluss der Eingabe.

Bezogen auf nicht indizierte Vor-/Nachname Felder hab ich gedacht, dass zu viele indizierte Felder in einer Tabelle auch kontraproduktiv sind und diese ja ausschließlich für die Suche benötigt werden.

Bezogen auf Nachname/Vorname-Suche kommt es häufiger vor, dass jemand im Fall A nur den Nachname kennt, oder im Fall B den Vorname. Ich habe aus Platzgründen nur ein einzelnes Textfeld als Sucheingabe.

Mit dem Kombinationsfeld könnte ich das auch nochmal testen wie praktikabel das zu nutzen ist. Irgendwie hab ich in vager Erinnerung, dass es schwierig war bei/nach der Sucheingabe das Dropdownfeld aufgeploppt zu haben.

PS: Mir gefällt es vom Design, wenn man nach einer Sucheingabe eine Auswahlliste hat, wo man ggf. einen der richtigen Datensätze auswählen kann.

Danke 👍🏻

PhilS

@ebs17 , @Josef P. : Eure Hinweise sind sicherlich gut für den Computer, er muss weniger arbeiten und kann schnell und einfach Ergebnisse liefern. - "Schnelle Ergebnisse" klingt zwar erstmal gut für den Benutzer, aber wenn er (der Benutzer) 5 Sekunden nachdenken muss, wie der vollständige (Vor|Nach)name einer Person richtig geschrieben wird, damit der Computer 0,5 Sekunden weniger braucht, um das Ergebnis zu liefern, ist dem Benutzer damit nicht wirklich geholfen.

Eine Grundregel für gutes UI/UX-Design: Don't make me think!

Bzgl. "OT": Ich denke, dass UI/UX-Design bei Entwicklern oft viel zu kurz kommt, daher finde ich das gar nicht OT.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Josef P.

ZitatDon't make me think!
Da ist für mich immer die Frage, wie weit muss das gehen.
Ein "Google-Suchfeld" passt für Google ideal ... aber passt das auch bei Datenbankanwendungen mit klar abgegrenzten Dateninhalten gut?

Ausgangsszenario: in einer Liste eine Person suchen.
Nehme ich 2 Textboxen - jeweils eine für Nachname sowie Vorname oder nehme ich nur eine und schreib rein, was mir einfällt.
(Maskierung mit '*[Suchtext]*' will ich hier gar nicht betrachten.)

2 Textboxen:
Vorteil: wenn ich weiß, ob mein Suchtext Teil des Vornamen oder des Nachnamen ist, finde ich schneller zum Ziel.
Nachteil: Es gibt Namen, da weiß man das gar nicht so genau, wenn man nur den Namen liest.

1 Textbox:
Vorteil: Ich tippe einfach Text und mögliche Treffer kommen
Nachteil: Ich erhalte möglicherweise mehrere Treffer ... "Peter Alexander"

Aufwand für den Entwickler: Was passiert, wenn ich "Peter Alexander" eintippe ... wie filtere ich die Datensätze?
... Vorname like "*Peter Alexander*" or Nachname like "*Peter Alexander*" wird nicht funktionieren.
=> (Vorname like "*Peter*" or Vorname like "*Alexander*") and (Nachname like "*Peter*" OR Nachname like "*Alexander*") .. würde das passen? (Vielleicht ist es doch ein Doppel-Vorname, den der Anwender eingetragen hat.

Nicht zu vergessen: Abweichende Schreibweisen.


Bei Mitarbeiterlisten würde ich wie oben erwähnt in Richtung Kombinationsfeld gehen, da man die Namen meist besser kennt als irgendwelche Kontakte von "fremden Firmen".

mfg
Josef

ebs17

Zitatnachdenken muss, wie der vollständige (Vor|Nach)name einer Person richtig geschrieben wird
Bei einer Mustersuche wie oben gezeigt ist man weit weg davon, einen vollständigen Namen eingeben zu müssen. Man muss aber nicht bereits beim Tippen ausgebremst werden.

... und Zeiten können sich drastisch verschieben: Oben war von 600 Datensätzen die Rede. Nun lass mal die Firma bekannt und erfolgreich werden.
Mit freundlichem Glück Auf!

Eberhard