{"id":55001120,"date":"2018-04-01T00:00:00","date_gmt":"2020-05-13T21:18:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1120"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Listenfeld_mit_Schnellsuche_per_Taste","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/","title":{"rendered":"Listenfeld mit Schnellsuche per Taste"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Neulich fiel mir in einer Benutzerumgebung auf, dass ich dort im Listenfeld per Eingabe eines Zeichens direkt zu den Eintr&auml;gen springen konnte, die mit diesem Zeichen beginnen. Das ist immer ein sch&ouml;ner Anlass, dies in Access nach zu programmieren. Dieser Beitrag liefert also eine Erweiterung f&uuml;r Listenfelder, mit der Sie dem Benutzer die Auswahl der enthaltenen Eintr&auml;ge noch leichter machen k&ouml;nnen.<\/b><\/p>\n<p>Als Beispiel dient die Tabelle <b>tblArtikel <\/b>der S&uuml;dsturm-Beispieldatenbank. Diese verwenden wir als Datensatzherkunft eines neuen Listenfeldes in einem Formular namens <b>lstArtikel<\/b> &#8211; und zwar &uuml;ber eine Abfrage, die nur die beiden Felder <b>ArtikelID <\/b>und <b>Artikelname <\/b>liefert. Dabei sortiert die Abfrage die Datens&auml;tze noch nach dem Artikelnamen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_001.png\" alt=\"Abfrage als Datenherkunft des Listenfeldes\" width=\"499,6607\" height=\"344,3206\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Abfrage als Datenherkunft des Listenfeldes<\/span><\/b><\/p>\n<p>Mit dieser Abfrage statten wir dann das Listenfeld <b>lstArtikel <\/b>im Formular <b>frmListenfeldSchnellsuche <\/b>aus. Damit das Listenfeld nur die Spalte mit den Artikelnamen anzeigt und nicht den Prim&auml;rschl&uuml;sselwert der Datens&auml;tze, stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein. Das Formular sieht dann im Entwurf wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_002.png\" alt=\"Entwurfsansicht des Beispielformulars\" width=\"649,559\" height=\"369,849\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurfsansicht des Beispielformulars<\/span><\/b><\/p>\n<h2>Funktion schon da &#8230;<\/h2>\n<p>Nun wollen wir eine Funktion zum Listenfeld hinzuf&uuml;gen, die daf&uuml;r sorgt, dass die Eingabe eines Buchstabens direkt zum ersten Datensatz springt, der mit diesem Buchstaben anf&auml;ngt.<\/p>\n<p>Als ich dann allerdings testweise in die Formularansicht des Formulars wechselte und einen Buchstaben eingegeben habe, w&auml;hrend das Listenfeld den Fokus hat, stellte ich erstaunt fest, dass diese Funktion bereits in das Listenfeld von Access integriert ist! Das Eintippen des Buchstabens C beispielsweise sorgte direkt zur Markierung des ersten Datensatzes, der mit dem Buchstaben C beginnt (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_003.png\" alt=\"Formular in Aktion\" width=\"549,6265\" height=\"249,334\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Formular in Aktion<\/span><\/b><\/p>\n<p>Das zeigt mal wieder, dass auch eine Anwendung wie Access, die praktisch seit 2010 &uuml;berhaupt nicht mehr weiterentwickelt wurde, noch Funktionen offenbart, die man bis dahin noch nie genutzt hat, geschweige denn erkannt hat. Nun: Ich gehe davon aus, dass der eine oder andere diese Funktion bereits kennt &#8211; an mir ist diese bisher jedoch vor&uuml;bergegangen.<\/p>\n<p>Nun denn: So einfach lassen wir uns nicht abspeisen und bieten Varianten zum Standardverhalten des Listenfeldes bei Eingabe eines Buchstabens an. Das Standardverhalten sieht wie folgt aus:<\/p>\n<p>Wenn Sie einen Buchstaben eingeben, zu dem das Listenfeld in der ersten Spalte einen Wert enth&auml;lt, der mit diesem Buchstaben beginnt, wird dieser Datensatz markiert.<\/p>\n<p>Geben Sie den gleichen Buchstaben nochmals ein, wird die Markierung zum n&auml;chsten Eintrag verschoben, dessen Wert in der ersten Spalte mit diesem Buchstaben beginnt. Ist nur ein passender Eintrag vorhanden, bleibt dieser markiert. Liegen mehrere Eintr&auml;ge vor, durchl&auml;uft das Listenfeld diese Eintr&auml;ge immer wieder, wenn der Benutzer die gleiche Taste mehrfach bet&auml;tigt. Ist kein passender Eintrag vorhanden, bleibt der aktuelle Eintrag markiert.<\/p>\n<h2>Varianten<\/h2>\n<p>Die erste Variante, die wir uns ansehen wollen, entspricht dem Verhalten, das die Dateiliste im Windows Explorer bietet. Wenn die Dateiliste den Fokus hat und Sie geben einen Buchstaben ein, verh&auml;lt sich die Liste wie das Listenfeld in Access, das hei&szlig;t, dass der erste Eintrag markiert wird, dessen Dateiname mit dem angegebenen Anfangsbuchstaben beginnt.<\/p>\n<p>Das funktioniert auch noch genauso wie im Listenfeld, wenn Sie beispielsweise drei Eintr&auml;ge haben, die mit <b>p <\/b>beginnen und mehrfach die Taste <b>p <\/b>dr&uuml;cken. Wenn Sie aber bei der Konstellation von Bild 4 erst <b>p <\/b>und dann direkt <b>l <\/b>dr&uuml;cken, springt die Markierung nicht erst zum Eintrag <b>pic001 <\/b>und dann zum ersten Eintrag, der mit <b>l <\/b>beginnt. Stattdessen tut sich nichts und die Markierung verharrt gef&uuml;hlt eine Sekunde auf dem Eintrag mit dem Anfangsbuchstaben <b>p<\/b>. Der Grund ist einfach: Im Windows Explorer k&ouml;nnen Sie auch durch z&uuml;gige Eingabe mehrerer aufeinanderfolgender Zeichen zu Eintr&auml;gen springen, die mit diesen Zeichen beginnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_004.png\" alt=\"Tastatureingabe im Windows Explorer\" width=\"549,6265\" height=\"363,0562\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tastatureingabe im Windows Explorer<\/span><\/b><\/p>\n<p>Wenn Sie also wie im Beispiel in der Abbildung <b>pic003 <\/b>eingeben, dann springt die Markierung erst zum ersten Eintrag mit <b>p <\/b>und dann weiter zum Eintrag <b>pic003.png<\/b>.<\/p>\n<p>Der Explorer wartet also immer einige Augenblicke auf weitere schnell eingegebene Zeichen, bevor er davon ausgeht, dass nun doch ein anderer Eintrag angesteuert werden soll.<\/p>\n<p>Diese Funktion wollen wir nun f&uuml;r das Listenfeld abbilden. Der erste Ansatz, den wir unternehmen, soll nur zum ersten Element mit dem Anfangsbuchstaben springen, den wir mit der Tastatur eingeben.<\/p>\n<p>Dazu wollen wir es mit der <b>FindFirst<\/b>-Methode probieren, die wir in der Prozedur, die durch das Ereignis <b>Bei Taste ab <\/b>ausl&ouml;sen, wie folgt einsetzen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     strSQL = \"Artikelname LIKE ''''\" & Chr(KeyCode) & \"*''''\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strSQL\r\n     Me!lstArtikel.Recordset.FindFirst strSQL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis ist allerdings ern&uuml;chternd, wie Bild 5 zeigt: Bei der Eingabe der Taste <b>C <\/b>beispielsweise springt die Markierung noch zum richtigen Datensatz, aber wenn wir diese Taste mehrfach bet&auml;tigen, sieht das Resultat wie in der Abbildung aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_005.png\" alt=\"Die FindFirst-Methode funktioniert f&uuml;r unseren Anwendungszweck funktioniert.\" width=\"424,7115\" height=\"361,1863\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die FindFirst-Methode funktioniert f&uuml;r unseren Anwendungszweck funktioniert.<\/span><\/b><\/p>\n<p>Dar&uuml;ber hinaus gibt es nach ein paar weiteren Tastatureingaben noch eine nicht reproduzierbare Fehlermeldung (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_006.png\" alt=\"Fehlermeldung nach mehrmaligem Ausl&ouml;sen der Prozedur\" width=\"649,559\" height=\"445,9799\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Fehlermeldung nach mehrmaligem Ausl&ouml;sen der Prozedur<\/span><\/b><\/p>\n<h2>Listeneintr&auml;ge durchlaufen<\/h2>\n<p>Also m&uuml;ssen wir uns einen anderen Ansatz &uuml;berlegen. Dieser ist nur sinnvoll, wenn das Listenfeld nicht allzuviele Datens&auml;tze enth&auml;lt, denn wir durchlaufen hier die Listeneintr&auml;ge, bis wir den ersten passenden Eintrag gefunden haben.<\/p>\n<p>Der erste Entwurf des Codes sieht wie in Listing 1 aus. In dieser Prozedur durchlaufen wir alle Datens&auml;tze vom ersten bis zu dem Datensatz, dessen erstes Zeichen in der Spalte mit dem Index <b>1, i <\/b>mit dem eingetippten Zeichen &uuml;bereinstimmt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     For i = 0 To Me!lstArtikel.ListCount - 1\r\n         <span style=\"color:blue;\">Debug.Print<\/span> i, <span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), 1), Me!lstArtikel.Column(1, i)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), 1) = Chr(KeyCode)<span style=\"color:blue;\"> Then<\/span>\r\n             Me!lstArtikel.Selected(i) = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Versuch, den ersten passenden Eintrag zu finden und zu markieren<\/span><\/b><\/p>\n<p>Wenn wir diesen Code ausprobieren und etwa den Buchstaben <b>B <\/b>eingeben, funktioniert es. Wenn wir allerdings einen Anfangsbuchstaben eingeben, f&uuml;r den es mehrere Artikelnamen gibt &#8211; wie beim Buchstaben <b>C <\/b>-, erhalten wir das Ergebnis aus Bild 7. Wir landen also immer genau einen Eintrag unter dem erwarteten Ergebnis.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_007.png\" alt=\"Falsche Selektion\" width=\"424,7115\" height=\"235,9509\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Falsche Selektion<\/span><\/b><\/p>\n<p>Warum das so ist, l&auml;sst sich nicht so einfach erkl&auml;ren.<\/p>\n<p>Zu Analysezwecken haben wir per <b>Debug.Print<\/b>-Anweisung die jeweils durchlaufenen Werte f&uuml;r <b>i<\/b>, den ersten Buchstaben des Artikels und den kompletten Artikelnamen ausgeben lassen. Auch das lieferte keine Auff&auml;lligkeiten &#8211; wenn wir beispielsweise den Buchstaben <b>C <\/b>eingeben, erschien im Direktbereich die folgende Ausgabe:<\/p>\n<pre>  0            A             Alice Mutton\r\n  1            A             Aniseed Syrup\r\n  2            B             Boston Crab Meat\r\n  3            C             Camembert Pierrot<\/pre>\n<p>Es wurde aber dennoch nicht der Eintrag <b>Camembert Pierrot<\/b>, sondern <b>Carnarvon Tigers <\/b>markiert &#8211; also genau ein Eintrag weiter unten. Wir gingen also davon aus, dass die Prozedur f&uuml;r Eintrag mit dem Index-Wert <b>3 <\/b>die Eigenschaft <b>Selected <\/b>auf den Wert <b>True <\/b>einstellt. Den entsprechenden Befehl haben wir dann &uuml;ber den Direktbereich abgesetzt:<\/p>\n<pre>Forms(0)!lstArtikel.Selected(3) = true<\/pre>\n<p>Interessanterweise hat dies den richtigen Eintrag markiert (siehe Bild 8). Warum aber wird im Code der falsche Eintrag markiert Die Aufkl&auml;rung erhofften wir uns &uuml;ber das Debuggen des Codes. Also haben wir einen Haltepunkt f&uuml;r den Prozedurkopf festgelegt, haben den Fokus auf das Listenfeld gelegt, den Buchstaben <b>C <\/b>eingetippt und dann den Code Zeile f&uuml;r Zeile durchlaufen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_1120_008.png\" alt=\"Markierung &uuml;ber den Direktbereich\" width=\"424,7115\" height=\"235,9509\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Markierung &uuml;ber den Direktbereich<\/span><\/b><\/p>\n<p>Das Verr&uuml;ckte ist: In diesem Fall markiert der Code die richtige Zeile, also die erste, deren Artikelname mit dem Buchstaben <b>C <\/b>beginnt. Das ist zwar nicht das erste Mal, dass eine Prozedur mit und ohne &uuml;berwachung durch das Debugging verschiedene Resultate liefert, aber nach meiner Erinnerung habe ich bisher immer den Grund f&uuml;r die Abweichung gefunden.<\/p>\n<p>In diesem Fall habe ich noch weiter experimentiert, indem ich beispielsweise den Haltepunkt nur in die erste Zeile gelegt habe und den Code dann mit <b>F5 <\/b>durchlaufen lie&szlig;. Oder ich habe den Haltepunkt auf die letzte Zeile gelegt.<\/p>\n<p>In allen F&auml;llen mit Haltepunkt lieferte die Prozedur das richtige Ergebnis. Sobald ich die Prozedur ohne Haltepunkt durchlaufen lie&szlig;, erhielt ich das falsche Ergebnis.<\/p>\n<p>Interessanterweise war das Ergebnis ja auch immer dann korrekt, wenn es nur einen Eintrag mit dem entsprechenden Anfangsbuchstaben gab &#8211; es konnte also kein Problem mit dem Index sein.<\/p>\n<p>Dennoch konnten wir durch die Manipulation des Index-Wertes der <b>Selected<\/b>-Eigenschaft eine funktionierende L&ouml;sung liefen. Wenn wir den Wert <b>1 <\/b>vom Index abziehen, arbeitet die Prozedur ohne Debugging korrekt:<\/p>\n<pre>Me!lstArtikel.Selected(i - 1) = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Wenn wir diese Variante hingegen im Debugging-Modus ausprobieren, liefert sie zuverl&auml;ssig falsche (richtige) Ergebnisse, n&auml;mlich immer den Eintrag, der sich eine Position vor dem gesuchten Eintrag befindet.<\/p>\n<h2>Mehrere Buchstaben abfragen<\/h2>\n<p>Nun haben wir allerdings gerade einmal die bereits vorhandene Funktion abgebildet &#8211; und das noch nicht einmal vollst&auml;ndig, denn wir zeigen ja immer nur den ersten Datensatz mit dem entsprechenden Anfangsbuchstaben an. Aber wir wollen ja auch noch weitergehen und die Eingabe mehrerer Anfangsbuchstaben vorsehen.<\/p>\n<p>Wie k&ouml;nnte das aussehen Im Windows Explorer springt die Markierung auf jeden Fall zum ersten Eintrag des ersten eingegebenen Buchstabens. Dann gibt der Windows Explorer dem Benutzer jeweils ein paar Hundertstelsekunden Zeit, um weitere Buchstaben einzutippen.<\/p>\n<p>Wir m&uuml;ssen also die Zeit zwischen der Eingabe der Buchstaben erfassen und diese pr&uuml;fen.<\/p>\n<p>Hat der Benutzer sich zwischen zwei Buchstaben nur kurz Zeit gelassen, interpretieren wir dies als die Fortsetzung der Eingabe des Suchbegriffs. L&auml;sst er zwischen zwei Buchstaben eine l&auml;ngere Pause, interpretieren wir dies als die Eingabe eines neuen Buchstabens.<\/p>\n<p>Stellt sich die erste Frage: Wie messen wir die Zeit Dazu nutzen wir eine API-Funktion namens <b>GetTickCount<\/b>, die uns die Zeit in Millisekunden liefert.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function GetTickCount Lib \"kernel32\" () <span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Dabei verwenden wir eine Variable namens <b>lngStart<\/b>, um den Startzeitpunkt zu speichern:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>lngStart<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Den Startzeitpunkt nehmen wir mit der Funktion <b>StartTimer <\/b>auf, welche den aktuellen Wert von <b>GetTickCount <\/b>in der Variablen <b>lngStart <\/b>speichert:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StartTimer()\r\n     lngStart = GetTickCount\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Zeitraum seit dem Aufruf von <b>StartTimer <\/b>ermitteln wir dann mit der Funktion <b>EndTimer<\/b>. Diese ermittelt wiederum mit der Funktion <b>GetTickCount<\/b> die aktuelle Systemzeit und gibt die Differenz aus der aktuellen Systemzeit und der mit <b>StartTimer <\/b>in <b>lngStart <\/b>gespeicherten Systemzeit:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EndTimer()<span style=\"color:blue;\"> As Long<\/span>\r\n     EndTimer = (GetTickCount - lngStart)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Ergebnis ist die zwischen den beiden Aufrufen verstrichene Zeit.<\/p>\n<p>Damit k&ouml;nnen wir nun starten:<\/p>\n<ul>\n<li>Wir wollen beim ersten Tastenanschlag die Funktion <b>StartTimer <\/b>aufrufen, damit die Startzeit gespeichert wird.<\/li>\n<li>Beim n&auml;chsten Tastenanschlag pr&uuml;fen, ob der von <b>EndTimer <\/b>gelieferte Wert gr&ouml;&szlig;er als ein bestimmtes Zeitintervall ist. Falls ja, starten wir eine neue Suche nach dem Eintrag mit dem eingegebenen Anfangsbuchstaben. Falls nicht, f&uuml;gen wir den Buchstaben zum aktuellen Buchstaben hinzu und suchen nach Eintr&auml;gen, die mit dieser Zeichenkette beginnen.<\/li>\n<\/ul>\n<p>Wir k&uuml;mmern uns erst einmal darum, dass der Suchbegriff ordnungsgem&auml;&szlig; zusammengestellt wird. Diesen speichern wir in der Variablen <b>strSuche<\/b>, die wir im Klassenmodul des Formulars deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>strSuche<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Dann leeren wir die bisherige Version der Prozedur <b>lstArtikel_KeyDown <\/b>und erg&auml;nzen diese wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTimer<span style=\"color:blue;\"> As Long<\/span>\r\n     lngTimer = EndTimer\r\n     <span style=\"color:blue;\">If <\/span>lngTimer &gt; 500<span style=\"color:blue;\"> Then<\/span>\r\n         strSuche = Chr(KeyCode)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSuche = strSuche & Chr(KeyCode)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strSuche, lngTimer\r\n     StartTimer\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ermittelt mit der Funktion <b>EndTimer <\/b>die aktuelle Zeit minus der in der Variablen <b>lngStart <\/b>gespeicherten Zeit und speichert diese in der Variablen <b>lngTimer<\/b>. Im ersten Durchgang ist <b>lngStart <\/b>noch gleich <b>0<\/b>, sodass <b>lngTimer <\/b>die aktuelle Systemzeit aufweist (zum Beispiel <b>413609750<\/b>).<\/p>\n<p>Dieser Wert ist also jenseits von Gut und B&ouml;se, wenn man diesen heranzieht, um die Zeit seit dem letzten Tastaturanschlag zu ermitteln. <b>lngTimer <\/b>wird also viel gr&ouml;&szlig;er als 500 Millisekunden sein, was in der <b>If&#8230;Then<\/b>-Bedingung dazu f&uuml;hrt, dass der Buchstabe aus <b>Chr(KeyCode) <\/b>in der Variablen <b>strSuche <\/b>gespeichert wird.<\/p>\n<p>Wenn dem letzten Tastenanschlag weniger als 500 Millisekunden vergangen sind, wird hingegen der aktuelle Buchstabe zu dem bereits in der Variablen <b>strSuche <\/b>gespeicherten Eintrag hinzugef&uuml;gt. In jedem Fall wird am Ende der Prozedur die Funktion <b>StartTimer <\/b>aufgerufen, damit die Systemzeit dieses Tastenanschlages in der Variablen <b>lngStart <\/b>gespeichert wird. Die Ausgabe durch die <b>Debug.Print<\/b>-Anweisung sieht beispielsweise wie folgt aus:<\/p>\n<pre>C              413609750 \r\nCH             78 \r\nCHA            140 \r\nCHAI           94 \r\nC              938 \r\nCH             109 \r\nCHA            109 \r\nCHAN           94 \r\nCHANG          172<\/pre>\n<p>Das hei&szlig;t, dass wir nacheinander die Zeichenfolgen <b>Chai <\/b>und dann, nach einer knappen Sekunde, die Zeichenfolge <b>Chang <\/b>eingegeben haben. Soweit, so gut: Den Suchbegriff haben wir nun schon. Nun m&uuml;ssen wir noch daf&uuml;r sorgen, dass dieser zum geeigneten Zeitpunkt markiert wird &#8211; also sobald der Benutzer einmal 500 Millisekunden lang kein Zeichen eingegeben hat.<\/p>\n<p>Also bauen wir die Ereignisprozedur wie in Listing 2 auf.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTimer<span style=\"color:blue;\"> As Long<\/span>\r\n     lngTimer = EndTimer\r\n     <span style=\"color:blue;\">If <\/span>lngTimer &gt; 5000<span style=\"color:blue;\"> Then<\/span>\r\n         strSuche = Chr(KeyCode)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSuche = strSuche & Chr(KeyCode)\r\n         For i = 0 To Me!lstArtikel.ListCount - 1\r\n             <span style=\"color:blue;\">Debug.Print<\/span> i, <span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), 1), Me!lstArtikel.Column(1, i), _\r\n                 <span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), <span style=\"color:blue;\">Len<\/span>(strSuche)), strSuche\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), <span style=\"color:blue;\">Len<\/span>(strSuche)) = strSuche<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!lstArtikel.Selected(i - 1) = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strSuche, lngTimer\r\n     StartTimer\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Markieren von Eintr&auml;gen mit mehreren eingegebenen Zeichen<\/span><\/b><\/p>\n<p>Dummerweise reagiert das Listenfeld nun nach der Eingabe einer Buchstabenkombination wie <b>Chai <\/b>gar nicht wie gew&uuml;nscht. Statt den Eintrag <b>Chai <\/b>anzuzeigen, springt sie wild durch die Datens&auml;tze. Bei genauerem Hinsehen springt sie gar nicht so wild, sondern zeigt nacheinander die Datens&auml;tze mit den Anfangsbuchstaben <b>C<\/b>, <b>H<\/b>, <b>A <\/b>und <b>I <\/b>an.<\/p>\n<p>Hier liegt also offensichtlich ein grundlegendes Problem vor: Die eingebaute Funktion zum Markieren von Eintr&auml;gen mit dem eingetippten Anfangsbuchstaben l&auml;sst sich nicht von unserer Prozedur beeindrucken und tut einfach weiter ihren Dienst.<\/p>\n<p>Wie bekommen wir das in den Griff Dazu m&uuml;ssen wir schlicht das Markieren des gew&uuml;nschten Eintrags verlagern. Normalerweise reagiert das Listenfeld direkt auf das Herunterdr&uuml;cken der Taste. Offensichtlich f&uuml;hrt es seine Markierung auch noch nach dem Ausf&uuml;hren der Ereignisprozedur <b>Bei Taste ab <\/b>aus, weshalb unsere Markierung verpufft.<\/p>\n<p>Also tragen wir unsere Anweisungen, die bisher in der Prozedur <b>lstArtikel_KeyDown <\/b>untergebracht waren, in der Prozedur <b>lstArtikel_KeyUp <\/b>unter. Der Benutzer wird diesen Unterschied nicht bemerken; die zeitliche Differenz ist in diesem Fall &auml;u&szlig;erst gering.<\/p>\n<p>Allerdings springt die Markierung nun doch einige Male hin- und her &#8211; erstens durch die eingebaute Funktion, die immer den Eintrag mit dem aktuell getippten Anfangsbuchstaben markiert und zweitens durch unsere eigene Prozedur. Aber auch dieses Problem k&ouml;nnen wir zumindest noch etwas eingrenzen.<\/p>\n<p>Dazu deaktivieren wir das Neuzeichnen des Formulars f&uuml;r den Zeitraum, in dem der Benutzer die Taste herunterdr&uuml;ckt bis er sie wieder losl&auml;sst. Dazu f&uuml;gen wir der Ereignisprozedur, die durch das Ereignis <b>Bei Taste ab <\/b>ausgel&ouml;st wird, die folgende Anweisung hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me.Painting = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur, die durch das Ereignis <b>Bei Taste auf <\/b>ausgel&ouml;st wird, passen wir hingegen wie in Listing 3 an.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTimer<span style=\"color:blue;\"> As Long<\/span>\r\n     lngTimer = EndTimer\r\n     <span style=\"color:blue;\">If <\/span>lngTimer &gt; 500<span style=\"color:blue;\"> Then<\/span>\r\n         strSuche = Chr(KeyCode)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSuche = strSuche & Chr(KeyCode)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     For i = 0 To Me!lstArtikel.ListCount - 1\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(Me!lstArtikel.Column(1, i), <span style=\"color:blue;\">Len<\/span>(strSuche)) = strSuche<span style=\"color:blue;\"> Then<\/span>\r\n             Me!lstArtikel.Selected(i) = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     StartTimer\r\n     Me.Painting = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Markieren von Eintr&auml;gen mit mehreren eingegebenen Zeichen, zweite Version<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft nun wiederum, ob seit dem letzten Tastendruck mehr als 500 Millisekunden vergangen sind. Falls ja, beginnt die Suche mit dem soeben eingegebenen Zeichen, falls nicht, wird das zuletzt eingegebene Zeichen an die zuvor eingegebene Zeichenkette angeh&auml;ngt.<\/p>\n<p>Danach durchl&auml;uft die Prozedur wieder alle Eintr&auml;ge des Listenfeldes, wobei sie diesmal nicht den ersten Buchstaben mit dem eingegebenen Buchstaben vergleicht, sondern die ersten <b>x <\/b>Buchstaben, wobei <b>x <\/b>der L&auml;nge der Zeichenkette aus <b>strSuche <\/b>entspricht, mit dem Inhalt von <b>strSuche<\/b>.<\/p>\n<p>Wurde ein entsprechender Eintrag gefunden, markiert die Prozedur diesen und verl&auml;sst anschlie&szlig;end die Schleife.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt, wie Sie einem Listenfeld ein schnelles Springen zu Datens&auml;tzen hinzuf&uuml;gen, das nach der Eingabe eines einzigen Zeichens ausgel&ouml;st wird oder auch schnell eingegebene Zeichenketten ber&uuml;cksichtigt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ListenfeldSchnellsuche.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/DE04BA87-428A-4531-A8EC-6CB000CA1F97\/aiu_1120.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich fiel mir in einer Benutzerumgebung auf, dass ich dort im Listenfeld per Eingabe eines Zeichens direkt zu den Eintr&auml;gen springen konnte, die mit diesem Zeichen beginnen. Das ist immer ein sch&ouml;ner Anlass, dies in Access nachzuprogrammieren. Dieser Beitrag liefert also eine Erweiterung f&uuml;r Listenfelder, mit der Sie dem Benutzer die Auswahl der enthaltenen Eintr&auml;ge noch leichter machen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022018,662018,44000023],"tags":[],"class_list":["post-55001120","post","type-post","status-publish","format-standard","hentry","category-66022018","category-662018","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Listenfeld mit Schnellsuche per Taste - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Listenfeld mit Schnellsuche per Taste\" \/>\n<meta property=\"og:description\" content=\"Neulich fiel mir in einer Benutzerumgebung auf, dass ich dort im Listenfeld per Eingabe eines Zeichens direkt zu den Eintr&auml;gen springen konnte, die mit diesem Zeichen beginnen. Das ist immer ein sch&ouml;ner Anlass, dies in Access nachzuprogrammieren. Dieser Beitrag liefert also eine Erweiterung f&uuml;r Listenfelder, mit der Sie dem Benutzer die Auswahl der enthaltenen Eintr&auml;ge noch leichter machen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:18:30+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Listenfeld mit Schnellsuche per Taste\",\"datePublished\":\"2020-05-13T21:18:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/\"},\"wordCount\":2483,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8c93a5d547a14715924371f17b1e8b44\",\"articleSection\":[\"2\\\/2018\",\"2018\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/\",\"name\":\"Listenfeld mit Schnellsuche per Taste - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8c93a5d547a14715924371f17b1e8b44\",\"datePublished\":\"2020-05-13T21:18:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8c93a5d547a14715924371f17b1e8b44\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8c93a5d547a14715924371f17b1e8b44\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_mit_Schnellsuche_per_Taste\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Listenfeld mit Schnellsuche per Taste\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Listenfeld mit Schnellsuche per Taste - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/","og_locale":"de_DE","og_type":"article","og_title":"Listenfeld mit Schnellsuche per Taste","og_description":"Neulich fiel mir in einer Benutzerumgebung auf, dass ich dort im Listenfeld per Eingabe eines Zeichens direkt zu den Eintr&auml;gen springen konnte, die mit diesem Zeichen beginnen. Das ist immer ein sch&ouml;ner Anlass, dies in Access nachzuprogrammieren. Dieser Beitrag liefert also eine Erweiterung f&uuml;r Listenfelder, mit der Sie dem Benutzer die Auswahl der enthaltenen Eintr&auml;ge noch leichter machen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:18:30+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Listenfeld mit Schnellsuche per Taste","datePublished":"2020-05-13T21:18:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/"},"wordCount":2483,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44","articleSection":["2\/2018","2018","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/","url":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/","name":"Listenfeld mit Schnellsuche per Taste - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44","datePublished":"2020-05-13T21:18:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/8c93a5d547a14715924371f17b1e8b44"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_mit_Schnellsuche_per_Taste\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Listenfeld mit Schnellsuche per Taste"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001120"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001120\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}