{"id":55000674,"date":"2009-08-01T00:00:00","date_gmt":"2020-05-22T22:16:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=674"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Globale_Suche","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/","title":{"rendered":"Globale Suche"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Eine der bekanntesten Tastenkombinationen d&uuml;rfte Strg + F zum Aktivieren der Suchfunktion sein. Der Windows Explorer hat sie, die Internet Browser verwenden sie einheitlich und die Office-Anwendungen greifen darauf zur&uuml;ck. Haben Sie Ihre Anwendungen auch schon damit ausgestattet Nein Na, dann wird es aber h&ouml;chste Zeit! Spendieren Sie den Benutzern diesen Shortcut und zeigen Sie die richtige Suche f&uuml;r den aktuellen Kontext an.<\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Ziel dieser L&ouml;sung<\/p>\n<p>In einer Access-Anwendung braucht man, wie in anderen Anwendungen auch, hier und da eine Suchfunktion. Normalerweise bezieht sich diese Suche auf die in einem Formular angezeigten Daten und soll das Durchsuchen der enthaltenen Felder erm&ouml;glichen.<\/p>\n<p>Die f&uuml;r die Suche notwendigen Elemente sind dabei meist Teil des Formulars selbst; manchmal &ouml;ffnet sich auch ein extra Formular mit den Feldern zur Eingabe der Suchkriterien und gegebenenfalls einer Ergebnisliste.<\/p>\n<p>Dieser Beitrag stellt eine Suchfunktion vor, die Sie von beliebigen Formularen aus aufrufen k&ouml;nnen und deren Inhalt Sie gr&ouml;&szlig;tenteil selbst konfigurieren k&ouml;nnen. Der Aufruf soll &uuml;ber die bekannte Tastenkombination <b>Strg + F <\/b>erfolgen und einen Suchdialog anzeigen, der die zu durchsuchenden Felder des zum Zeitpunkt des Aufrufs ge&ouml;ffneten Formulars anzeigt.<\/p>\n<p>Es soll aber auch m&ouml;glich sein, nach anderen Elementen zu suchen, als nach solchen, die das aktuelle Formular anzeigt &#8211; also beispielsweise nach Artikeln -, w&auml;hrend das Kundenformular sichtbar ist. Und f&uuml;r alle F&auml;lle liefert die L&ouml;sung auch die M&ouml;glichkeit, in allen festgelegten Tabellen nach Elementen zu suchen.<\/p>\n<p>Wichtig ist hier nat&uuml;rlich eine hohe Konfigurierbarkeit. Dies bezieht sich vor allem auf die folgenden Punkte:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie legen die Tabellen fest, in denen gesucht werden soll.<\/li>\n<li class=\"aufz-hlung\">Sie definieren die Felder, die in die Suche einbezogen werden.<\/li>\n<li class=\"aufz-hlung\">Sie stellen die Formulare ein, die beim Anklicken eines der Suchergebnisse ge&ouml;ffnet werden und das ausgew&auml;hlte Ergebnis anzeigen sollen.<\/li>\n<li class=\"aufz-hlung\">Au&szlig;erdem soll die Suche verschiedene Tabellen oder auch alle Tabellen durchforsten k&ouml;nnen &#8211; je nachdem, von wo sie aufgerufen wurde. Geschieht dies beispielsweise vom Kundenformular aus, soll sie standardm&auml;&szlig;ig die Kunden durchsuchen; ist gerade kein Formular ge&ouml;ffnet, durchsucht sie alle angegebenen Tabellen oder der Benutzer stellt selbst ein, welche Daten f&uuml;r die Suche verwendet werden sollen.<\/li>\n<\/ul>\n<p>Der Benutzer sieht von diesen Konfigurationsm&ouml;glichkeiten nichts &#8211; er soll lediglich die Suche nutzen k&ouml;nnen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suche vorbereiten<\/p>\n<p>Die Suche bereiten Sie als Entwickler mit dem Formular <b>frmGlobalSearchOptions<\/b> vor. Dieses sieht wie in Bild 1 aus und zeigt jeweils die Definition einer Suche in einem Datensatz an. Gleichzeitig k&ouml;nnen Sie hier auch festlegen, wie die Daten der Datenherkunft dieser Suche in einer Suche &uuml;ber alle Daten angezeigt werden sollen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic010_opt.jpeg\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Konfigurationsformular f&uuml;r die globale Suche<\/span><\/b><\/p>\n<p>Schauen wir uns die Suchdefinition aus Bild 1 genauer an. Die im Konfigurationsformular angezeigte Suche wird in f&uuml;nf Bereichen definiert. Der erste Bereich erwartet die Eingabe eines Titels, der das gesuchte Element umschreibt (hier <b>Artikel<\/b>), die Tabelle oder Abfrage, aus der die Daten stammen (<b>tblArtikel<\/b>) und das Prim&auml;rschl&uuml;sselfeld dieser Tabelle (<b>ArtikelID<\/b>).<\/p>\n<p>Die n&auml;chsten sechs Felder im zweiten Bereich enthalten s&auml;mtliche Parameter der <b>DoCmd.OpenForm<\/b>-Methode. Damit k&ouml;nnen Sie genau festlegen, welches Formular angezeigt wird, wenn der Benutzer die Details zu einem Suchergebnis des Typs <b>Artikel <\/b>sehen m&ouml;chte und wie dieses ge&ouml;ffnet werden soll. Interessant ist die M&ouml;glichkeit, etwa f&uuml;r den Parameter <b>WhereCondition <\/b>Platzhalter wie <b>[PKID]<\/b>, <b>[PKIDValue]<\/b> und <b>[Title]<\/b> einzuf&uuml;gen. Diese werden zur Laufzeit durch den Prim&auml;rschl&uuml;sselnamen, den Prim&auml;rschl&uuml;sselwert und den weiter oben im Formular angegebenen Titel ersetzt. Anders w&auml;re es auch kaum denkbar, ein Formular zu &ouml;ffnen, das den in der globalen Suche ausgew&auml;hlten Datensatz anzeigt.<\/p>\n<p>Der untere Bereich enth&auml;lt nur ein Feld, das einen Ausdruck f&uuml;r die Ausgabe im Suchergebnis der globalen Suche erwartet. Wie erw&auml;hnt, k&ouml;nnen Sie, wenn das Suchformular nicht in einem bestimmten Kontext ge&ouml;ffnet wurde, eine globale Suche &uuml;ber alle in der Suchkonfiguration angegebenen Tabellen durchf&uuml;hren. Nun bestehen die Suchergebnisse der einzelnen Suchen, wie etwa nach Artikeln oder Kunden, aus verschiedenen Feldern, die auch noch eine unterschiedliche Anzahl aufweisen k&ouml;nnen. Damit das Suchergebnis einer globalen Suche dennoch aussagekr&auml;ftig ist, soll es nur zwei Spalten enthalten, von denen die erste den weiter oben angegebenen Titel liefert und damit einen Hinweis auf die Tabelle, aus der die Datens&auml;tze stammen, und die zweite einen Ausdruck einblendet, der die wichtigsten Informationen des gefundenen Datensatzes enth&auml;lt:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Artikelname &amp; &quot;, &quot; &amp; Liefereinheit <\/b>etwa liefert Eintr&auml;ge der Tabelle <b>tblArtikel <\/b>wie <b>Chai, 10 Kartons x 20 Beutel<\/b>.<\/li>\n<li class=\"aufz-hlung\"><b>KundenCode &amp; &quot; &#8211; &quot; &amp; Firma <\/b>zeigt Daten aus <b>tblKunden <\/b>wie <b>ALFKI &#8211; Alfreds Futterkiste <\/b>an.<\/li>\n<\/ul>\n<p>Beachten Sie, dass diese Ausdr&uuml;cke gleichzeitig als Grundlage f&uuml;r die Suchabfrage dienen &#8211; bei der Suche in allen konfigurierten Tabellen werden also nur die so festgelegten Ausdr&uuml;cke durchsucht!<\/p>\n<p>Der Bereich oben rechts legt die Felder fest, die f&uuml;r die Anzeige des Suchergebnisses und f&uuml;r die Suche herangezogen werden. Die Unterscheidung erfolgt &uuml;ber die beiden <b>Ja\/Nein<\/b>-Felder auf der rechten Seite.<\/p>\n<p>Der letzte Bereich unten rechts ist ebenfalls wichtig: Dort k&ouml;nnen Sie die Formulare ausw&auml;hlen, welche beim Anwenden der Tastenkombination <b>Strg + F <\/b>zum Anzeigen des im aktuellen Datensatz des Konfigurationsformulars definierten Suchformulars f&uuml;hren. Bet&auml;tigt der Benutzer <b>Strg + F<\/b>, wenn kein Formular ge&ouml;ffnet ist oder eines, f&uuml;r das keine Suche konfiguriert wurde, dann &ouml;ffnet sich das Suchformular und bietet die globale Suche &uuml;ber alle festgelegten Tabellen an.<\/p>\n<p><b>Globale Suche im Einsatz<\/b><\/p>\n<p>Wie genau funktioniert nun die eigentliche globale Suche Diese bietet ein einziges Suchformular, das dynamisch den Gegebenheiten angepasst wird. Das Formular sieht wie in Bild 2 aus. &Uuml;ber das oberste Kombinationsfeld w&auml;hlt der Benutzer aus, wonach er suchen m&ouml;chte &#8211; entweder nach allen Daten, welche die Suche abdeckt, oder nach etwas Speziellem wie Artikel oder Kunden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic014_opt.jpeg\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die globale Suche in Aktion<\/span><\/b><\/p>\n<p>Hat er sich f&uuml;r Letzteres entschieden, kann er mit dem zweiten Kombinationsfeld eines der Felder ausw&auml;hlen, die in der Konfiguration als Suchkriterien festgelegt wurden. Das Feld <b>Suchbegriff <\/b>schlie&szlig;lich nimmt den Suchbegriff auf und filtert die in der Ergebnisliste angezeigten Eintr&auml;ge nach jedem Tastenanschlag. Das oberste Kombinationsfeld zur Auswahl der zu durchsuchenden Objekte wird dabei automatisch vorbelegt, wenn der Benutzer <b>Strg + F <\/b>dr&uuml;ckt, w&auml;hrend eines der unter <b>Aufrufende Formulare <\/b>in der Konfiguration angegebenen Formulare den Fokus hat.<\/p>\n<p><b>Einsatz der globalen Suche in eigenen Anwendungen<\/b><\/p>\n<p>Wenn Sie diese Suche in einer eigenen Anwendung verwenden m&ouml;chten, brauchen Sie nur ein paar Objekte zu importieren, das Suchformular optisch den &uuml;brigen Objekten Ihrer Datenbank anzupassen und die Suche wie oben beschrieben zu konfigurieren. Sie ben&ouml;tigen die folgenden Elemente:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Tabellen <b>tblGlobalSearchOptionsFields<\/b>, <b>tblGlobalSearchOptionsForms <\/b>und <b>tblGlobalSearchOptionsTables<\/b><\/li>\n<li class=\"aufz-hlung\">Formulare <b>frmGlobalSearch<\/b> und <b>frmGlobalSearchOptions<\/b><\/li>\n<li class=\"aufz-hlung\">Makros <b>AutoExec <\/b>und <b>AutoKeys<\/b><\/li>\n<li class=\"aufz-hlung\">Modul <b>mdlGlobalSearch<\/b><\/li>\n<\/ul>\n<p>Falls schon eines oder beide Makros vorhanden sind, f&uuml;gen Sie die enthaltenen Befehle einfach hinzu. F&uuml;r alle, die unsere globale Suche nicht nur einsetzen, sondern auch noch weiter anpassen oder um Funktionen erweitern m&ouml;chten, beschreiben die folgenden Seiten detailliert den Aufbau der L&ouml;sung.<\/p>\n<p><b>Tastenkombination<\/b><\/p>\n<p>Beginnen wir doch gleich dort, wo auch der Benutzer Ihrer Anwendung wohl anfangen w&uuml;rde, wenn er kein Tastaturfeind ist und auch in anderen Anwendungen auf <b>Strg + F <\/b>als Allheilmittel f&uuml;r das Auffinden vermisster Informationen setzt: beim F&uuml;llen der Tastenkombination mit Leben.<\/p>\n<p>Hier gibt es zwei M&ouml;glichkeiten: Entweder Sie legen eine solche Tastenkombination nur f&uuml;r bestimmte Elemente wie etwa Formulare fest, oder Sie definieren diese anwendungsweit. Im folgenden Fall wollen wir die zweite Variante w&auml;hlen, da die Suche auch verf&uuml;gbar sein soll, wenn gar kein Formular ge&ouml;ffnet ist.<\/p>\n<p>Wie also &ouml;ffnen wir das Suchformular durch pures Bet&auml;tigen von <b>Strg + F<\/b> Dies geschieht ganz einfach mithilfe des f&uuml;r die Definition von globalen Tastenkombinationen vorgesehenen Makros namens <b>Autokeys<\/b>. Legen Sie also ein leeres Makro an und speichern Sie es unter diesem Namen.<\/p>\n<p>Aktivieren Sie dann die Anzeige der Spalte <b>Makroname <\/b>und tragen Sie dort den Ausdruck <b>^f <\/b>ein, was der Tastenkombination <b>Strg + F <\/b>entspricht. Als Aktion legen Sie <b>Ausf&uuml;hrenCode <\/b>mit dem Parameter <b>=GlobalSearch() <\/b>fest, was den Aufruf der gleichnamigen, &ouml;ffentlich deklarierten Funktion ausl&ouml;st (siehe Bild 3). Diese k&ouml;nnen Sie zun&auml;chst in dieser Form in ein Standardmodul eintragen und gleich testen, ob die Tastenkombination funktioniert:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Das AutoKeys-Makro f&uuml;hrt auf Tastendruck die gew&uuml;nschte Funktion aus.<\/span><\/b><\/p>\n<pre>Public Function GlobalSearch()\r\n    On Error Resume Next\r\n    DoCmd.OpenForm &quot;frmGlobalSearch&quot;, _\r\n    OpenArgs:=Screen.ActiveForm.Name\r\n    If Err.Number = 2475 Then\r\n        DoCmd.OpenForm &quot;frmGlobalSearch&quot;\r\n    End If\r\nEnd Function<\/pre>\n<p>Die Routine ruft gleich das Formular <b>frmGlobalSearch <\/b>auf und &uuml;bergibt, wenn gerade ein anderes Formular den Fokus hat, dessen Namen als &Ouml;ffnungsargument. Dieses wird in <b>frmGlobalSearch <\/b>ausgewertet &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Unter einer speziellen Konstellation kann es vorkommen, dass das <b>AutoKeys<\/b>-Makro partout seinen Dienst verweigert &#8211; wenn Access einen anderen Namen f&uuml;r das Makro festgelegt hat, das auf Tastenkombinationen reagieren soll. Das pr&uuml;fen Sie ganz einfach mit folgender Anweisung, die Sie im Direktfenster des VBA-Editors (<b>Strg + G<\/b>) absetzen:<\/p>\n<pre>Debug.Print Application.GetOption(&quot;Key assignment macro&quot;)<\/pre>\n<p>Liefert dies ein anderes Resultat als <b>AutoKeys<\/b>, beispielsweise <b>Tastaturbelegung<\/b>, haben Sie zwei M&ouml;glichkeiten: Entweder Sie legen auch noch ein zweites Makro f&uuml;r diesen Fall an (andere Namen als <b>AutoKeys <\/b>oder <b>Tastaturbelegung <\/b>sind eigentlich un&uuml;blich &#8211; aber nicht auszuschlie&szlig;en), oder Sie pr&uuml;fen den Namen des <b>AutoKeys<\/b>-Makros und stellen diesen gegebenenfalls auf <b>AutoKeys <\/b>ein. Dies m&uuml;ssten Sie wiederum in einer VBA-Routine erledigen, die beim Start der Anwendung durch das Makro <b>AutoExec <\/b>aufgerufen wird (siehe Bild 4):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Das AutoExec-Makro ruft eine Funktion auf, die den Namen des AutoKeys-Makros einstellt.<\/span><\/b><\/p>\n<pre>Public Function CheckAutokeys()\r\n    If Not Application.GetOption(&quot;Key\r\n    assignment macro&quot;) = &quot;Autokeys&quot; Then\r\n    Application.SetOption &quot;Key assignment\r\n    macro&quot;, &quot;Autokeys&quot;\r\nEnd If\r\nEnd Function<\/pre>\n<p>Die M&ouml;glichkeit, dass ein Anwender andere Anwendungen einsetzt, deren <b>AutoKeys<\/b>-Makro anders als <b>AutoKeys <\/b>hei&szlig;t, lassen wir hier au&szlig;en vor &#8211; im wahren Leben sollten Sie aber den Ausgangszustand vor dem Schlie&szlig;en der Anwendung wieder herstellen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suche konfigurieren<\/p>\n<p>Bevor der Benutzer die Suche einsetzen kann, m&uuml;ssen Sie einige Einstellungen vornehmen. Dies soll &uuml;ber entsprechende Formulare geschehen, wobei die Einstellungen in einer entsprechenden Tabelle gespeichert werden. M&ouml;gliche Einstellungen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Angabe eines Titels, beispielsweise <b>Kunden <\/b>oder <b>Artikel<\/b><\/li>\n<li class=\"aufz-hlung\">Tabelle, aus der die Daten stammen<\/li>\n<li class=\"aufz-hlung\">Felder, die durchsucht und angezeigt werden sollen<\/li>\n<li class=\"aufz-hlung\">Formular, das ge&ouml;ffnet werden soll, wenn der Benutzer auf einen Eintrag des Suchergebnisses klickt<\/li>\n<li class=\"aufz-hlung\">Formulare, in deren Zusammenhang bestimmte Suchen aktiviert werden sollen<\/li>\n<\/ul>\n<p>Zum Speichern dienen drei Tabellen namens <b>tblGlobalSearchOptionsTables<\/b>, <b>tblGlobalSearchOptionsFields<\/b> und <b>tblGlobalSearchOptionsForms<\/b>. <b>tblGlobalSearchOptionsTables <\/b>enth&auml;lt diese Felder:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ID<\/b>: Prim&auml;rschl&uuml;sselfeld<\/li>\n<li class=\"aufz-hlung\"><b>Title<\/b>: Titel, der im Suchfenster angezeigt wird<\/li>\n<li class=\"aufz-hlung\"><b>TableOrQuery<\/b>: Tabelle oder Abfrage, aus der die Suchfelder stammen<\/li>\n<li class=\"aufz-hlung\"><b>PrimaryKey<\/b>: Prim&auml;rschl&uuml;ssel dieser Tabelle, mit der auch das sp&auml;ter anzuzeigende Formular gefiltert werden soll<\/li>\n<li class=\"aufz-hlung\"><b>Formname<\/b>: Name des zu &ouml;ffnenden Formulars<\/li>\n<li class=\"aufz-hlung\"><b>View<\/b>, <b>Filtername<\/b>, <b>WhereCondition<\/b>, <b>DataMode<\/b>, <b>WindowMode <\/b>und <b>OpenArgs<\/b>: Parameter f&uuml;r das &Ouml;ffnen des Formulars per <b>DoCmd.OpenArgs<\/b><\/li>\n<\/ul>\n<p>Die Tabelle <b>tblGlobalSearchOptionsFields <\/b>enth&auml;lt diese Felder:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ID<\/b>: Prim&auml;rschl&uuml;sselfeld<\/li>\n<li class=\"aufz-hlung\"><b>TableID<\/b>: Fremdschl&uuml;sselfeld zum Festlegen eines Datensatzes aus <b>tblGlobalSearchOptionsTables<\/b><\/li>\n<li class=\"aufz-hlung\"><b>Fieldname<\/b>: Name des Feldes<\/li>\n<li class=\"aufz-hlung\"><b>ShowField<\/b>: Gibt an, ob das Feld im Suchergebnis angezeigt werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>SearchField<\/b>: Gibt an, ob das Feld in die Suche einbezogen werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>ColumnWidth<\/b>: Breite der Spalte dieses Feldes im Listenfeld<\/li>\n<li class=\"aufz-hlung\"><b>OrderID<\/b>: Repr&auml;sentiert die Reihenfolge-Position des Feldes.<\/li>\n<\/ul>\n<p>Die Tabelle <b>tblGlobalSearchOptionsForms<\/b> ordnet den verschiedenen Suchen die Namen der Formulare zu, in deren Kontext eine Suche aufgerufen wird. Bild 5 zeigt die drei Tabellen im Beziehungen-Fenster.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Tabellen der globalen Suche im Beziehungen-Fenster<\/span><\/b><\/p>\n<p><b>Konfigurationsformular<\/b><\/p>\n<p>Die Konfiguration soll &uuml;ber ein Formular namens <b>frmGlobalSearchOptions <\/b>erfolgen, das jeweils einen Datensatz der Tabelle <b>tblGlobalSearchOptionsTables <\/b>anzeigt und die damit verkn&uuml;pften Datens&auml;tze der Tabelle <b>tblGlobalSearchOptionFields <\/b>in einem Unterformular darstellt (<b>sfmGlobalSearchOptions<\/b>).<\/p>\n<p>Beginnen Sie mit dem Unterformular: Dazu legen Sie ein neues leeres Unterformular an und stellen die Datenherkunft auf die Tabelle <b>tblGlobalSearchOptionsFields <\/b>ein.<\/p>\n<p>Ziehen Sie alle Felder, die das Unterformular anzeigen soll, in den Detailbereich der Entwurfsansicht (siehe Bild 6). Wir wollen dort nur die Felder ausw&auml;hlen, deren Reihenfolge festlegen und einstellen, welche Felder angezeigt und\/oder f&uuml;r die Suche verwendet werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Entwurf des Unterformulars sfmGlobalSearchOptions<\/span><\/b><\/p>\n<p>Sp&auml;ter peppen wir das Formular noch auf, bis hierher reicht uns diese Fassung jedoch. Kommen wir zum Hauptformular, das auf der Tabelle <b>tblGlobalSearchOptionsTables <\/b>als Datenherkunft basiert.<\/p>\n<p>Hier ziehen Sie einfach alle Felder au&szlig;er dem Prim&auml;rschl&uuml;sselfeld in den Detailbereich. Au&szlig;erdem f&uuml;gen Sie per Drag and Drop das Unterformular <b>sfmGlobalSearchOptions <\/b>zum Entwurf des Hauptformulars hinzu.<\/p>\n<p><!--30percent--><\/p>\n<p>In der Datenblattansicht sieht das Unterformular dann etwa wie in Bild 7 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Das Konfigurationsformular im Rohbau<\/span><\/b><\/p>\n<p><b>Konfigurationsformular optimieren<\/b><\/p>\n<p>Mit dem Formular <b>frmGlobalSearchOptions <\/b>lassen sich zwar nun schon die ben&ouml;tigten Daten eintragen, aber jeder Wert muss von Hand eingetippt werden &#8211; hier gibt es also Optimierungspotenzial. Beginnen wir mit dem Feld zur Eingabe der Tabelle oder Abfrage: Diese sollen Sie nat&uuml;rlich nicht eintippen, sondern aus einer Liste ausw&auml;hlen.<\/p>\n<p>Sie wandeln das Textfeld also in ein Kombinationsfeld um (Kontextmen&uuml; <b>&auml;ndern zu|Kombinationsfeld<\/b>) und stellen die Datensatzherkunft auf den folgenden Ausdruck ein:<\/p>\n<pre>SELECT Name\r\nFROM MSysObjects\r\nWHERE Name Not Like &quot;MSys*&quot;\r\nAND (Type = 1 OR Type = 5)\r\nORDER BY MSysObjects.Name;<\/pre>\n<p>Das Kombinationsfeld erlaubt nun bereits das komfortable Ausw&auml;hlen der gew&uuml;nschten Tabelle oder Abfrage (siehe Bild 8). Nach der Auswahl einer Tabelle oder Abfrage soll das Feld <b>PrimaryKey<\/b>, ebenfalls als Kombinationsfeld ausgef&uuml;hrt, mit den Feldnamen der ausw&auml;hlten Tabelle gef&uuml;llt werden. Dazu legen Sie f&uuml;r das Steuerelement <b>cboTableOrQuery <\/b>eine neue Ereignisprozedur an, indem Sie f&uuml;r die Eigenschaft <b>Nach Aktualisierung <\/b>des Steuerelements den Wert <b>[Ereignisprozedur] <\/b>ausw&auml;hlen und dann auf die Schaltfl&auml;che mit den drei Punkten (&#8230;) rechts neben dem Eigenschaftsfeld klicken. Im nun erscheinenden VBA-Editor finden Sie bereits den Prozedurrumpf vor, den Sie wie folgt erg&auml;nzen:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Einfache Tabellenauswahl<\/span><\/b><\/p>\n<pre>Private Sub cboTableOrQuery_AfterUpdate()\r\nIf Not IsNull(Me!cboTableOrQuery) Then\r\n Me!cboPrimaryKey.RowSourceType = \r\n    &quot;Field List&quot;\r\n    Me!cboPrimaryKey.RowSource =\r\n    Me!cboTableOrQuery\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Dies stellt die Eigenschaft <b>Herkunftsart <\/b>auf den Wert <b>Feldliste <\/b>und die Eigenschaft <b>Datensatzherkunft <\/b>auf den Namen der Tabelle ein, welche die Feldliste liefern soll &#8211; in diesem Fall die Tabelle, die der Benutzer im Kombinationsfeld <b>cboTableOrQuery <\/b>ausgew&auml;hlt hat. Nach Auswahl der Tabelle oder Abfrage bietet das Kombinationsfeld <b>cboPrimaryKey <\/b>nun alle dort enthaltenen Felder an (siehe Bild 9).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic007_opt.jpeg\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Auswahl des Prim&auml;rschl&uuml;sselfelds einer Tabelle oder Abfrage<\/span><\/b><\/p>\n<p>Warum aber soll der Benutzer den Prim&auml;rschl&uuml;ssel &uuml;berhaupt ausw&auml;hlen, wenn dieser ja meistens schon definiert ist Er sollte zumindest die M&ouml;glichkeit erhalten, dies zu tun. Das f&uuml;r <b>PrimaryKey <\/b>angegebene Feld soll beim &Ouml;ffnen des Detailformulars eines aus der Ergebnisliste ausgew&auml;hlten Datensatzes als <b>WhereCondition <\/b>zum Einsatz kommen. Es kann aber nat&uuml;rlich auch vorkommen, dass hier nicht das Prim&auml;rschl&uuml;sselfeld, sondern ein anderes ben&ouml;tigt wird.<\/p>\n<p>Einigen wir uns auf einen Kompromiss: Das Feld <b>cboPrimaryKey <\/b>soll zwar alle Felder der Tabelle oder Abfrage zur Auswahl anbieten, aber der Prim&auml;rschl&uuml;ssel der Tabelle soll automatisch ermittelt und voreingestellt werden. Das spart dann in den meisten F&auml;llen einen Maus-Klick ein.<\/p>\n<p>F&uuml;r das Ermitteln des Prim&auml;rschl&uuml;ssels verwenden wir die im Beitrag <b>Tipps und Tricks <\/b>aus Ausgabe 3\/2009 (Shortlink 671) vorgestellte Funktion <b>GetPrimaryKeyFields <\/b>und passen die durch das Ereignis <b>Nach Aktualisierung <\/b>ausgel&ouml;ste Prozedur wie in Listing 1 an.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Hinzuf&uuml;gen von History-Feldern zu einer Tabelle<\/p>\n<pre>Private Sub cboTableOrQuery_AfterUpdate()\r\n    Dim strPrimaryKey As String\r\n    If Not IsNull(Me!cboTableOrQuery) Then\r\n        Me!cboPrimaryKey.RowSourceType = &quot;Field List&quot;\r\n        Me!cboPrimaryKey.RowSource = Me!cboTableOrQuery\r\n        strPrimaryKey = GetPrimaryKeyFields(Me.cboTableOrQuery)\r\n        If Len(strPrimaryKey) &gt; 0 Then\r\n            strPrimaryKey = Split(strPrimaryKey, &quot;;&quot;)(0)\r\n            If Len(strPrimaryKey) Then\r\n                strPrimaryKey = Mid(strPrimaryKey, 2)\r\n            End If\r\n        End If\r\n        If Len(strPrimaryKey) &gt; 0 Then\r\n            Me!cboPrimaryKey = strPrimaryKey\r\n        Else\r\n            Me!cboPrimaryKey = Me!cboPrimaryKey.ItemData(0)\r\n        End If\r\n    End If\r\n    End Sub<\/pre>\n<p>Die Prozedur liest nun zus&auml;tzlich den Namen des Prim&auml;rschl&uuml;sselfeldes aus und stellt diesen, soweit vorhanden, als Wert des Kombinationsfeldes <b>cboPrimaryKey <\/b>ein. Wird kein Prim&auml;rschl&uuml;ssel gefunden, zeigt das Kombinationsfeld einfach das erste Feld der Feldliste an.<\/p>\n<p>Die Auswahl des Formulars, das beim Ausw&auml;hlen eines Suchergebnisses zur Anzeige des betroffenen Datensatzes ge&ouml;ffnet werden soll, kann ebenfalls &uuml;ber ein Kombinationsfeld erfolgen. <\/p>\n<p>Dieses hei&szlig;t <b>cboFormname<\/b> und besitzt den folgenden SQL-Ausdruck als Datensatzherkunft:<\/p>\n<pre>SELECT Name FROM MSysObjects\r\nWHERE Type = -32768\r\nORDER BY Name;<\/pre>\n<p>Die &uuml;brigen Felder dienen der Einstellung der Parameter beim &Ouml;ffnen des Formulars f&uuml;r die Details des ausgew&auml;hlten Suchergebnisses. Einige Parameter basieren auf Access-Konstanten, andere m&uuml;ssen Sie manuell eintragen.<\/p>\n<p>Die Steuerelemente mit den Konstanten f&uuml;hren wir wiederum als Kombinationsfelder aus, diesmal allerdings mit einer Wertliste als Datensatzherkunft. Konkret betrifft dies die Felder <b>View<\/b>, <b>DataMode <\/b>und <b>WindowMode<\/b>, die entsprechenden Kombinationsfelder sollen <b>cboView<\/b>, <b>cboDataMode <\/b>und <b>cboWindowMode <\/b>hei&szlig;en.<\/p>\n<p>Die notwendigen Eigenschaften stellen Sie entweder direkt im Eigenschaftsfenster ein oder weisen die Werte per VBA zu.<\/p>\n<p>Wir w&auml;hlen letzteren Weg und benutzen die Ereigniseigenschaft <b>Beim Laden<\/b>, um eine neue Ereignisprozedur zu erstellen.<\/p>\n<p>Diese sieht wie folgt aus und stellt die Eigenschaften f&uuml;r alle drei Kombinationsfelder ein:<\/p>\n<pre>Private Sub Form_Load()\r\nWith Me!cboView\r\n.RowSourceType = &quot;Value List&quot;\r\n.RowSource = &quot;1;acViewDesign;0;\r\nacViewNormal;2;acViewPreview&quot;\r\n.ColumnCount = 2\r\n.ColumnWidths = 0\r\nEnd With\r\nWith Me!cboDataMode\r\n.RowSourceType = &quot;Value List&quot;\r\n.RowSource = &quot;0;acFormAdd;\r\n1;acFormEdit;\r\n-1;acFormPropertySettings;\r\n2;acFormReadOnly&quot;\r\n.ColumnCount = 2\r\n.ColumnWidths = 0\r\nEnd With\r\nWith Me!cboWindowMode\r\n.RowSourceType = &quot;Value List&quot;\r\n.RowSource = &quot;3;acDialog;1;acHidden;\r\n2;acIcon;0;acWindowNormal&quot;\r\n.ColumnCount = 2\r\n.ColumnWidths = 0\r\nEnd With\r\nEnd Sub<\/pre>\n<p>Anschlie&szlig;end lassen sich die Konstanten leicht per Kombinationsfeld ausw&auml;hlen (siehe Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic008_opt.jpeg\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Ausw&auml;hlen von DoCmd.OpenForm-Konstanten<\/span><\/b><\/p>\n<p>F&uuml;r die drei Felder <b>Filtername<\/b>, <b>WhereCondition <\/b>und <b>OpenArgs <\/b>k&ouml;nnen Sie beliebige Werte hinterlegen. Auch hier m&ouml;chten wir es Ihnen aber noch ein wenig einfacher machen. Wir haben drei Platzhalter vorgesehen, die im laufenden Betrieb durch entsprechende Werte ersetzt werden:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>[PKID] <\/b>steht stellvertretend f&uuml;r das ausgew&auml;hlte Prim&auml;rschl&uuml;sselfeld<\/li>\n<li class=\"aufz-hlung\"><b>[PKIDValue] <\/b>steht f&uuml;r den Wert des Prim&auml;rschl&uuml;sselfelds f&uuml;r den ausgew&auml;hlten Datensatz.<\/li>\n<li class=\"aufz-hlung\"><b>[Title] <\/b>entspricht dem weiter oben eingegebenen Titel-Feld.<\/li>\n<\/ul>\n<p>Auf diese Weise k&ouml;nnen Sie etwa den folgenden Ausdruck f&uuml;r den Parameter <b>WhereCondition <\/b>eintragen:<\/p>\n<pre>[PKID] = [PKIDValue]<\/pre>\n<p>Zur Laufzeit wird dies dann beispielsweise wie folgt ersetzt:<\/p>\n<pre>KundeID = 12<\/pre>\n<p><b>Feldkonfiguration f&uuml;r die globale Suche<\/b><\/p>\n<p>K&uuml;mmern wir uns nun um das Unterformular. Dieses dient zur Auswahl der Felder, die in der Ergebnisliste angezeigt werden sollen und die als Suchfelder dienen. Da wir uns auch hier das Leben leicht machen wollen, wandeln wir das Feld <b>Fieldname <\/b>in ein Kombinationsfeld namens <b>cboFieldname <\/b>um. Es soll in Abh&auml;ngigkeit von der im Hauptformular f&uuml;r <b>TableOrQuery <\/b>ausgew&auml;hlten Tabelle oder Abfrage die entsprechenden Felder anzeigen. Das Einstellen der Datensatzherkunft erfolgt in der <b>Nach Aktualisieren<\/b>-Ereignisprozedur des Kombinationsfeldes <b>cboTableOrQuery <\/b>im Hauptformular, und zwar durch die folgenden Anweisungen, die Sie einfach hinter den bestehenden Codezeilen einf&uuml;gen:<\/p>\n<pre>With Me!sfmGlobalSearchOptions.Form!cboFieldname\r\n.RowSourceType = &quot;Field List&quot;\r\n.RowSource = Me!cboTableOrQuery\r\nEnd With<\/pre>\n<p>Das Ergebnis sieht wie in Bild 11 aus. Nach der Auswahl einer Tabelle oder Abfrage k&ouml;nnen Sie im Feld <b>Fieldname<\/b> des Unterformulars auf die enthaltenen Felder zugreifen. Die <b>ColumnWidth <\/b>der einzelnen Felder tragen Sie wiederum manuell ein, genau so wie Sie die <b>Ja\/Nein<\/b>-Felder <b>ShowField <\/b>und <b>SearchField <\/b>selbst anklicken m&uuml;ssen. Sinnvollerweise werden deren Standardwerte aber auf <b>Ja <\/b>eingestellt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic009_opt.jpeg\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Auswahl von Feldern f&uuml;r die Suchfunktion und Ergebnisanzeige<\/span><\/b><\/p>\n<p><b>Formulare, von denen die Suche aufgerufen werden soll<\/b><\/p>\n<p>Fehlt noch das zweite Unterformular des Konfigurationsdialogs. Dieses soll alle Formulare der Anwendung zur Auswahl anbieten, um diese als Startpunkt f&uuml;r den Aufruf verschiedener in der Konfiguration gespeicherter Suchen per <b>Strg + F <\/b>festzulegen. Das Unterformular hei&szlig;t <b>sfmGlobalSearchOptionsForms <\/b>und enth&auml;lt die Tabelle <b>tblGlobalSearchOptionsForms <\/b>als Datenherkunft. Daraus zeigt es lediglich das Feld <b>Formname <\/b>an. &auml;ndern Sie das Textfeld in ein Kombinationsfeld namens <b>cboFormname <\/b>um, sieht das Formular wie in Bild 12 aus. Damit das Kombinationsfeld die Liste aller in der Anwendung enthaltenen Formulare anzeigt, weisen Sie seiner Datensatzherkunft den folgenden Ausdruck zu:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic011_opt.jpeg\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Das Unterformular sfmGlobalSearchOptionsForms in der Entwurfsansicht<\/span><\/b><\/p>\n<pre>SELECT Name FROM MSysObjects WHERE Type=-32768 ORDER BY Name;<\/pre>\n<p>Das reicht, um die Formulare wie in Bild 13 zur Auswahl anzubieten, und vervollst&auml;ndigt unseren Konfigurationsdialog.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic012_opt.jpeg\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Auswahl von Formularen via Unterformular<\/span><\/b><\/p>\n<p><b>Das Suchformular<\/b><\/p>\n<p>Ein wenig mehr Technik steckt im eigentlichen Suchformular, dessen Aussehen weitgehend durch die mit dem Konfigurationsformular festgelegten Einstellungen bestimmt wird. Die Entwurfsansicht aus Bild 14 sieht unscheinbar aus und liefert folgende Steuerelemente:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/GlobaleSuche-web-images\/pic013_opt.jpeg\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Entwurfsansicht des globalen Suchformulars<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>cboSucheNach<\/b>: Legt fest, wonach gesucht wird, und enth&auml;lt die im Feld <b>Titel<\/b> der Konfiguration festgelegten Eintr&auml;ge.<\/li>\n<li class=\"aufz-hlung\"><b>cboSucheIn<\/b>: Legt fest, in welchem Feld der im obigen Steuerelement ausgew&auml;hlten Datenherkunft gesucht werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>txtSuchbegriff<\/b>: Dient der Eingabe des Suchbegriffs, der nach jedem Zeichen in das unsichtbare Feld <b>txtSuchbegriffTemp <\/b>geschrieben wird.<\/li>\n<li class=\"aufz-hlung\"><b>txtSuchbegriffTemp<\/b>: Ist unsichtbar und dient als Grundlage f&uuml;r das Filtern des Listenfeldes.<\/li>\n<li class=\"aufz-hlung\"><b>lstSuchergebnis<\/b>: Zeigt das Suchergebnis an. Ein Doppelklick soll das angegebene Detailformular &ouml;ffnen.<\/li>\n<li class=\"aufz-hlung\"><b>cmdAnzeigen<\/b>: &Ouml;ffnet ebenfalls das Detailformular zum aktuell ausgew&auml;hlten Eintrag des Listenfeldes.<\/li>\n<li class=\"aufz-hlung\"><b>cmdSchliessen<\/b>: Schlie&szlig;t die globale Suche.<\/li>\n<\/ul>\n<p><b>Ausw&auml;hlen der Datenherkunft<\/b><\/p>\n<p>Mit dem obersten Kombinationsfeld soll der Benutzer entweder den Eintrag <b>&lt;Alles durchsuchen&gt; <\/b>oder einen der in der Konfiguration unter <b>Titel <\/b>angegebenen Eintr&auml;ge ausw&auml;hlen, was zu diesem SQL-Ausdruck als Datensatzherkunft f&uuml;hrt:<\/p>\n<pre>SELECT 0 AS ID, ''&lt;Alles durchsuchen&gt;'' AS Title FROM tblGlobalSearchOptionsTables UNION SELECT ID, Title FROM tblGlobalSearchOptionsTables<\/pre>\n<p>Das zweite Kombinationsfeld soll die durchsuchbaren Felder zur Auswahl anbieten. Solange das erste Kombinationsfeld den Wert <b>0 <\/b>besitzt, findet keine Feldauswahl statt, da in der Regel mehrere Tabellen gleichzeitig durchsucht werden und keine eindeutigen Suchfelder f&uuml;r alle Tabellen vorhanden sind. Die Suche erfolgt dann automatisch &uuml;ber alle in der Konfiguration festgelegten Felder, was dazu f&uuml;hrt, dass das Kombinationsfeld <b>cboSuchenIn<\/b> gleich beim &Ouml;ffnen des Formulars deaktiviert sein soll.<\/p>\n<p>Dies &auml;ndert sich erst nach der Auswahl eines Werts im Kombinationsfeld <b>cboSuchenNach<\/b>, was das Ereignis <b>Nach Aktualisierung <\/b>ausl&ouml;st. Die dazugeh&ouml;rige Ereignisprozedur sieht so aus:<\/p>\n<pre>Private Sub cboSucheNach_AfterUpdate()\r\nIf Me!cboSucheNach = 0 Then\r\n Call InitializeFields\r\n    Me!cboSuchenIn.Enabled = False\r\nElse\r\n Call UpdateFields\r\n    Me!cboSuchenIn.Enabled = True\r\nEnd If\r\nCall GlobalSearch\r\nEnd Sub<\/pre>\n<p>Die Routine pr&uuml;ft, ob der Benutzer <b>&lt;Alles durchsuchen&gt; <\/b>oder einen anderen Eintrag ausgew&auml;hlt hat, und aktiviert oder deaktiviert abh&auml;ngig davon das Steuerelement <b>cboSuchenIn<\/b>. Falls <b>&lt;Alles durchsuchen&gt; <\/b>gew&auml;hlt wurde, ruft die Routine au&szlig;erdem eine weitere Routine namens <b>InitializeFields <\/b>auf, die einfach nur das Kombinationsfeld <b>cboSuchenIn <\/b>auf den Anfangszustand zur&uuml;cksetzt:<\/p>\n<pre>Private Sub InitializeFields()\r\nDim strSQL As String\r\nstrSQL = &quot;SELECT 0 AS ID, ''&lt;Alle Felder\r\ndurchsuchen&gt;'' AS Fieldname FROM\r\ntblGlobalSearchOptionsTables&quot;\r\nMe!cboSuchenIn.RowSource = strSQL\r\nMe!cboSuchenIn = Me!cboSuchenIn.ItemData(0)\r\nEnd Sub<\/pre>\n<p>W&auml;hlt der Benutzer einen anderen Eintrag wie etwa Artikel oder Kunden aus, aktiviert dies das zweite Kombinationsfeld <b>cboSuchenIn <\/b>und l&ouml;st au&szlig;erdem die Routine <b>UpdateFields <\/b>aus.<\/p>\n<p>Diese setzt einen SQL-Ausdruck zusammen, der per <b>UNION <\/b>zwei Elemente verbindet. Das erste enth&auml;lt einen einen Eintrag mit dem Text <b>&lt;Alle Felder durchsuchen&gt;. <\/b>Das zweite liefert die Feldnamen, die in der Konfiguration als Suchkriterium festgelegt wurden. Diesen Ausdruck weist die Routine der Datensatzherkunft des Kombinationsfeldes zu und markiert au&szlig;erdem den ersten Eintrag:<\/p>\n<pre>Private Sub UpdateFields()\r\nDim strSQL As String\r\nstrSQL = &quot;SELECT 0 AS ID, ''&lt;Alle Felder\r\ndurchsuchen&gt;'' AS Fieldname FROM\r\ntblGlobalSearchOptionsTables &quot;\r\nstrSQL = strSQL &amp; &quot;UNION &quot;\r\nstrSQL = strSQL &amp; &quot;SELECT ID, Fieldname\r\nFROM tblGlobalSearchOptionsFields WHERE\r\nTableID = &quot; &amp; Me!cboSucheNach\r\nMe!cboSuchenIn.RowSource = strSQL\r\nMe!cboSuchenIn = Me!cboSuchenIn.ItemData(0)\r\nEnd Sub<\/pre>\n<p>Anschlie&szlig;end l&ouml;st das Aktualisieren des ersten Kombinationsfelds <b>cboSuchenNach <\/b>noch die Routine <b>GlobalSearch <\/b>aus. Diese ist die wichtigste und umfangreichste Routine und sorgt f&uuml;r die Anzeige der Suchergebnisse. Weiter unten finden Sie eine detaillierte Beschreibung dieser Funktion. Schauen wir uns vorher noch an, was den &uuml;brigen Betrieb des Formulars sicherstellt. So wird beim Laden des Formulars die folgende Routine ausgel&ouml;st, welche die Routine <b>InitializeTables<\/b> aktiviert und dann den Fokus auf das Suchfeld verschiebt:<\/p>\n<pre>Private Sub Form_Load()\r\nCall InitializeTables\r\nMe!txtSuchbegriff.SetFocus\r\nEnd Sub<\/pre>\n<p><b>InitializeTables <\/b>&uuml;bernimmt die wichtige Aufgabe, die f&uuml;r den aktuellen Kontext gew&uuml;nschte Suche zu definieren. Entscheidend ist hier, ob beim Aufruf des Formulars <b>frmGlobalSearch <\/b>ein &Ouml;ffnungsargument &uuml;bergeben wurde oder nicht. Dieses enth&auml;lt, wenn es vorliegt, den Namen des Formulars, das beim Aufruf per <b>Strg + F <\/b>den Fokus hatte.<\/p>\n<p>Beim Fehlen eines &Ouml;ffnungsarguments w&auml;hlt die Routine einfach den ersten Eintrag des Kombinationsfelds <b>cboSuchenNach <\/b>aus (<b>&lt;Alles durchsuchen&gt;<\/b>) und ruft die weiter oben beschriebene Routine <b>InitializeFields <\/b>auf. Ist ein &Ouml;ffnungsargument vorhanden, durchsucht die Routine die Tabelle <b>tblGlobalSearchOptionsForms <\/b>nach dem Eintrag, dessen Feld <b>Formname <\/b>mit dem als &Ouml;ffnungsargument &uuml;bergebenen Eintrag &uuml;bereinstimmt, und stellt das Kombinationsfeld <b>cboSucheNach <\/b>so ein, dass dieses die entsprechende Suche anzeigt (also etwa <b>Artikel <\/b>oder <b>Kunden <\/b>wie in der Beispieldatenbank). Der Aufruf der Routine <b>UpdateFields <\/b>sorgt dann daf&uuml;r, dass das zweite Kombinationsfeld <b>cboSuchenIn <\/b>alle Felder zur Auswahl bereitstellt, die f&uuml;r diese Suche in der Konfiguration festgelegt wurden (siehe weiter oben):<\/p>\n<pre>Private Sub InitializeTables()\r\nIf IsNull(Me.OpenArgs) Then\r\n Me!cboSucheNach = _\r\n    Me!cboSucheNach.ItemData(0)\r\n    Call InitializeFields\r\nElse\r\n Me!cboSucheNach = Nz(DLookup(&quot;ID&quot;, _\r\n    &quot;tblGlobalSearchOptionsForms&quot;, _\r\n    &quot;Formname = ''&quot; &amp; Me.OpenArgs _\r\n    &amp; &quot;''&quot;), 0)\r\n    Call UpdateFields\r\nEnd If\r\nEnd Sub<\/pre>\n<p><b>Die Suchroutine GlobalSearch<\/b><\/p>\n<p>Kommen wir zur Kernaufgabe des globalen Suchformulars: zur Suche. Diese soll haupts&auml;chlich nach &auml;nderung des Suchbegriffs durchgef&uuml;hrt werden, und zwar nach jeder Zeichen&auml;nderung. Nach dem Eingeben eines Zeichens l&ouml;st Access das Ereignis <b>Bei &auml;nderung <\/b>von Textfeldern aus, was wir mit folgender Ereignisprozedur abfangen:<\/p>\n<pre>Private Sub txtSuchbegriff_Change()\r\nMe!txtSuchbegriffTemp = _\r\nMe!txtSuchbegriff.Text\r\nCall GlobalSearch\r\nEnd Sub<\/pre>\n<p>Die Routine f&uuml;llt zun&auml;chst das unsichtbare Textfeld <b>txtSuchbegriffTemp <\/b>mit dem aktuell in <b>txtSuchbegriff <\/b>enthaltenen Text und ruft dann die Routine <b>GlobalSearch <\/b>auf, die Sie in Listing 2 finden. Die Routine unterscheidet im Wesentlichen zwei F&auml;lle:<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Die globale Suchfunktion<\/p>\n<pre>Private Sub GlobalSearch()\r\n    Dim strSQL As String\r\n    Dim strSQLWhereCondition As String\r\n    Dim rstTables As DAO.Recordset\r\n    Dim rstFields As DAO.Recordset\r\n    Dim intFieldCount As Integer\r\n    Dim strColumnWidths As String\r\n    If Me!cboSucheNach = 0 Then\r\n        Set rstTables = dbs.OpenRecordset(&quot;SELECT * FROM tblGlobalSearchOptionsTables&quot;, dbOpenDynaset)\r\n        Do While Not rstTables.EOF\r\n            strSQL = strSQL &amp; &quot;SELECT &quot; &amp; rstTables!ID &amp; &quot; AS ID, &quot; &amp; rstTables!PrimaryKey _\r\n            &amp; &quot; AS ElementID,''&quot; &amp; rstTables!Title &amp; &quot;'' AS Element, &quot; &amp; rstTables!GeneralContent _\r\n            &amp; &quot; AS Kurzbeschreibung FROM &quot; &amp; rstTables!TableOrQuery &amp; &quot; &quot;\r\n            strSQL = strSQL &amp; &quot;WHERE &quot; &amp; rstTables!GeneralContent &amp; &quot; LIKE ''*&quot; &amp; Me!txtSuchbegriffTemp &amp; &quot;*'' &quot;\r\n            strSQL = strSQL &amp; &quot;UNION &quot;\r\n            rstTables.MoveNext\r\n        Loop\r\n        If Len(strSQL) &gt; 0 Then\r\n            strSQL = Left(strSQL, Len(strSQL) - 6)\r\n        End If\r\n        Me!lstSuchergebnis.ColumnWidths = &quot;0cm;0cm;3cm&quot;\r\n        Me!lstSuchergebnis.ColumnCount = 4\r\n    Else\r\n        Set rstTables = dbs.OpenRecordset(&quot;SELECT * FROM tblGlobalSearchOptionsTables WHERE ID = &quot; _\r\n        &amp; Me.cboSucheNach, dbOpenDynaset)\r\n        If Not rstTables.EOF Then\r\n            Set rstFields = dbs.OpenRecordset(&quot;SELECT * FROM tblGlobalSearchOptionsFields WHERE TableID = &quot; _\r\n            &amp; rstTables!ID, dbOpenDynaset)\r\n            strSQL = &quot;SELECT &quot; &amp; rstTables!PrimaryKey &amp; &quot; AS ID, &quot;\r\n            intFieldCount = 1\r\n            strColumnWidths = &quot;0cm;&quot;\r\n            Do While Not rstFields.EOF\r\n                intFieldCount = intFieldCount + 1\r\n                strColumnWidths = strColumnWidths &amp; rstFields!ColumnWidth &amp; &quot;cm; &quot;\r\n                If rstFields!ShowField = True Then\r\n                    strSQL = strSQL &amp; rstFields!FieldName &amp; &quot;, &quot;\r\n                End If\r\n                If rstFields!SearchField = True Then\r\n                    strSQLWhereCondition = strSQLWhereCondition &amp; rstFields!FieldName &amp; &quot; &amp; ''|'' &amp; &quot;\r\n                End If\r\n                rstFields.MoveNext\r\n            Loop\r\n            If intFieldCount = 0 Then Exit Sub\r\n            Me!lstSuchergebnis.ColumnCount = intFieldCount\r\n            Me!lstSuchergebnis.ColumnWidths = strColumnWidths\r\n            If Len(strSQL) &gt; 0 Then\r\n                strSQL = Left(strSQL, Len(strSQL) - 2)\r\n                strSQL = strSQL &amp; &quot; FROM &quot; &amp; rstTables!TableOrQuery\r\n            End If\r\n        End If\r\n    End If\r\n    If Me!cboSuchenIn = 0 Then\r\n        If Len(strSQLWhereCondition) &gt; 0 Then\r\n            strSQLWhereCondition = Left(strSQLWhereCondition, Len(strSQLWhereCondition) - 8)\r\n            strSQL = strSQL &amp; &quot; WHERE &quot; &amp; strSQLWhereCondition &amp; &quot; LIKE ''*&quot; &amp; Me!txtSuchbegriffTemp &amp; &quot;*''&quot;\r\n        End If\r\n    Else\r\n        strSQLWhereCondition = Me!cboSuchenIn.Column(1)\r\n        strSQL = strSQL &amp; &quot; WHERE &quot; &amp; strSQLWhereCondition &amp; &quot; LIKE ''*&quot; &amp; Me!txtSuchbegriffTemp &amp; &quot;*''&quot;\r\n    End If\r\n    Me!lstSuchergebnis.RowSource = strSQL\r\n    Me!cmdAnzeigen.Enabled = Not (Me!lstSuchergebnis.ListCount = 0)\r\n    End Sub<\/pre>\n<ul>\n<li class=\"aufz-hlung\">Im Kombinationsfeld <b>cboSuchenIn <\/b>ist der Wert <b>0 <\/b>ausgew&auml;hlt und somit eine Suche in allen angegebenen Tabellen angesagt.<\/li>\n<li class=\"aufz-hlung\">Im Kombinationsfeld <b>cboSuchenIn <\/b>ist ein anderer Wert als <b>0 <\/b>ausgew&auml;hlt, also soll eine spezielle Tabelle durchsucht werden.<\/li>\n<\/ul>\n<p>Diese Fallunterscheidung trifft die Routine mithilfe eines <b>If&#8230;Then<\/b>-Konstrukts. Der <b>If<\/b>-Abschnitt k&uuml;mmert sich um die Suche in allen Tabellen. Dazu erstellt die Routine zun&auml;chst eine Datensatzgruppe, die alle Datens&auml;tze der Tabelle <b>tblGlobalSearchOptionsTables <\/b>und somit die Konfiguration aller zu durchsuchenden Tabellen enth&auml;lt. Beim Durchlaufen dieser Tabellen stellt die Routine eine SQL-Abfrage zusammen, die im Falle der beiden Tabellen <b>tblArtikel <\/b>und <b>tblKunden <\/b>unserer Beispielkonfiguration etwa so aussieht:<\/p>\n<pre>SELECT 1 AS ID, ArtikelID AS ElementID,''Artikel'' AS Element, Artikelname &amp; &quot;, &quot; &amp; Liefereinheit AS Kurzbeschreibung FROM tblArtikel WHERE Artikelname &amp; &quot;, &quot; &amp; Liefereinheit LIKE ''**'' UNION SELECT 2 AS ID, KundeID AS ElementID,''Kunden'' AS Element, KundenCode &amp; &quot; - &quot; &amp; Firma AS Kurzbeschreibung FROM tblKunden WHERE KundenCode &amp; &quot; - &quot; &amp; Firma LIKE ''**''<\/pre>\n<p>Anschlie&szlig;end stellt die Routine noch die Spaltenanzahl und -breiten entsprechend den Spalten dieser Abfrage ein.<\/p>\n<p>Der <b>Else<\/b>-Zweig k&uuml;mmert sich um die Suche nach Daten aus einer konkreten Tabelle. Dazu &ouml;ffnet die Routine ebenfalls eine Datensatzgruppe auf Basis der Tabelle <b>tblGlobalSearchOptionsTables<\/b>, diesmal aber nur mit einem Datensatz &#8211; n&auml;mlich dem, der die im Kombinationsfeld aktivierte Suche repr&auml;sentiert.<\/p>\n<p>Die Routine erzeugt danach noch ein zweites Recordset, das auf der Tabelle <b>tblGlobalSearchOptionsFields <\/b>basiert und daraus genau die Datens&auml;tze einliest, welche die Felder f&uuml;r die aktuelle Suche enth&auml;lt. Die Routine durchl&auml;uft die Datens&auml;tze und erledigt dabei gleich mehrere Dinge:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie stellt eine Liste der Felder zusammen, die in der Ergebnisliste erscheinen sollen. Diese Felder wurden in der Konfiguration durch ein entsprechendes <b>Ja\/Nein<\/b>-Feld markiert.<\/li>\n<li class=\"aufz-hlung\">Gleichzeitig wird die Variable <b>intFieldCount <\/b>f&uuml;r jedes durchlaufene Feld um den Wert <b>1<\/b> erh&ouml;ht. Dies dient der sp&auml;teren Einstellung der Spaltenanzahl des Listenfeldes mit dem Suchergebnis.<\/li>\n<li class=\"aufz-hlung\">Im gleichen Zuge wird in der Stringvariablen <b>strColumnWidths <\/b>ein Ausdruck der Form <b>1cm;2cm;3cm&#8230; <\/b>zusammengestellt, der die in der Konfiguration festgelegten Spaltenbreiten f&uuml;r die Anzeige im Listenfeld enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Zuletzt pr&uuml;ft die Schleife, ob das Feld aus dem aktuellen Datensatz als Suchkriterium herangezogen werden soll, und stellt ein darauf basierendes <b>WHERE<\/b>-Statement zusammen.<\/li>\n<\/ul>\n<p>Danach pr&uuml;ft die Routine, ob <b>intFieldCount <\/b>gr&ouml;&szlig;er <b>0 <\/b>ist &#8211; falls nein, wurden keine Suchfelder f&uuml;r diese Suche festgelegt und die Routine wird beendet. Anderenfalls, und dies sollte der Regelfall sein, stellt die Routine die Eigenschaften <b>ColumnCount <\/b>und <b>ColumnWidths <\/b>des Listenfeldes <b>lstSuchergebnis <\/b>entsprechend ein, stellt die komplette SQL-Abfrage zusammen und weist diese als Datensatzherkunft dem Listenfeld zu.<\/p>\n<p><b>Suchergebnis anzeigen<\/b><\/p>\n<p>Nat&uuml;rlich soll das Suchergebnis auch noch in entsprechenden Formularen angezeigt werden. Der Benutzer kann dies auf zwei Arten erreichen: Entweder durch einen Doppelklick auf den jeweiligen Eintrag oder durch Markieren des Datensatzes und anschlie&szlig;endes Bet&auml;tigen der Schaltfl&auml;che <b>Anzeigen<\/b>. Beide Aktionen l&ouml;sen je eine Ereignisprozedur aus, die wie folgt aussehen kann:<\/p>\n<pre>Private Sub cmdAnzeigen_Click()\r\nCall ShowItem\r\nEnd Sub\r\nPrivate Sub lstSuchergebnis_DblClick(Cancel\r\nAs Integer)\r\nCall ShowItem\r\nEnd Sub<\/pre>\n<p>Die Routine <b>ShowItem <\/b>finden Sie in Listing 3. Auch sie unterscheidet wieder zwischen den zwei F&auml;llen der globalen Suche und der Suche in einer bestimmten Tabelle. <\/p>\n<p>Bei der globalen Suche enth&auml;lt die zweite, unsichtbare Spalte des Listenfeldes mit dem Suchergebnis die <b>ID <\/b>des Datensatzes aus der Tabelle <b>tblGlobalSearchOptionsTables<\/b>, aus der das Suchergebnis stammt.<\/p>\n<p>Die Routine liest die Parameter f&uuml;r das &Ouml;ffnen des Detailformulars in entsprechende Variablen ein. Dabei ruft sie die Funktion <b>ReplacePlaceholders <\/b>auf, die den Inhalt der Parameterwerte auf die drei Platzhalter pr&uuml;ft und diese gegebenenfalls ersetzt.<\/p>\n<p>Anschlie&szlig;end pr&uuml;ft die Routine, ob das Formular zur Anzeige des Datensatzes bereits ge&ouml;ffnet ist. Falls ja, muss dieses zun&auml;chst geschlossen werden, weil sich die Parameter sonst nicht auf die Anzeige des Formulars auswirken. Schlie&szlig;lich &ouml;ffnet die Routine das Formular mit den angegebenen Parametern.<\/p>\n<p>Falls sich die Suche auf eine spezielle Tabelle oder Abfrage bezieht, holt sich die Routine zun&auml;chst die <b>ID <\/b>des Datensatzes der Tabelle <b>tblGlobalSearchOptionsTables <\/b>aus dem Kombinationsfeld <b>cboSucheNach<\/b>. Eine weitere Variable speichert die ID des Datensatzes aus dem Suchergebnis, der im Detailformular angezeigt werden soll.<\/p>\n<p>Anschlie&szlig;end geschieht prinzipiell das Gleiche wie beim Anzeigen des Formulars f&uuml;r ein Ergebnis der globalen Suche: Die Parameter werden aus der Tabelle <b>tblGlobalSearchOptionsTables <\/b>ausgelesen, enthaltene Platzhalter ersetzt und das Formular ge&ouml;ffnet.<\/p>\n<p><b>Platzhalter ersetzen<\/b><\/p>\n<p>Die Funktion <b>ReplacePlaceholders <\/b>hat die Aufgabe, die drei Platzhalter <b>[PKID]<\/b>, <b>[PKIDValue] <\/b>und <b>[Title] <\/b>zu ersetzen. <b>ReplacePlaceholders<\/b> muss nat&uuml;rlich wissen, aus welcher Tabelle der anzuzeigende Datensatz stammt und um welchen Datensatz es sich genau handelt.<\/p>\n<p>Diese Informationen erh&auml;lt die Funktion von der aufrufenden Routine und wertet sie entsprechend aus. Schlie&szlig;lich ersetzt sie die Platzhalter und schickt den resultierenden Ausdruck als Funktionswert zur&uuml;ck.<\/p>\n<pre>Private Function ReplacePlaceholders(str As\r\nString, lngID As Long, lngValue As Long,\r\nstrTitle As String) As String\r\nDim strPKID As String\r\nDim strPKIDValue As String\r\nDim strTemp As String\r\nstrPKID = DLookup(&quot;PrimaryKey&quot;,\r\n&quot;tblGlobalSearchOptionsTables&quot;,\r\n&quot;ID = &quot; &amp; lngID)\r\nstrTemp = Replace(str, &quot;[PKID]&quot;, strPKID)\r\nstrTemp = Replace(strTemp, &quot;[PKIDValue]&quot;,\r\nlngValue)\r\nstrTemp = Replace(strTemp, &quot;[Title]&quot;,\r\nstrTitle)\r\nReplacePlaceholders = strTemp\r\nEnd Function<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zusammenfassung und Ausblick<\/p>\n<p>F&uuml;r den Einsatz dieser Suchfunktion in eigenen Anwendungen brauchen Sie nur ein paar Objekte in die Datenbank zu importieren und die Suche zu konfigurieren &#8211; schon k&ouml;nnen Sie loslegen.<\/p>\n<p>Etwas Arbeit m&uuml;ssen Sie vielleicht in das Anpassen des Suchformulars an den Rest der Benutzeroberfl&auml;che Ihrer Anwendung stecken und vielleicht fallen Ihnen auch noch Optimierungen der globalen Suchfunktion ein.<\/p>\n<p>Nebenbei erfahren Sie in diesem Beitrag einiges &uuml;ber den Zugriff auf die einzelnen Tabellen und die enthaltenen Felder sowie auf Formulare.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Anzeigen des gefundenen Datensatzes in der Detailansicht<\/p>\n<pre>Private Sub ShowItem()\r\nDim rstTable As DAO.Recordset\r\nDim strForm As String\r\nDim strWhereCondition As String\r\nDim strFiltername As String\r\nDim strOpenArgs As String\r\nDim lngID As Long\r\nDim lngValue As Long\r\nDim strTitle As String\r\nIf Nz(Me!cboSucheNach, 0) = 0 Then\r\n lngID = Me!lstSuchergebnis\r\n    lngValue = Me!lstSuchergebnis.Column(1)\r\n    Set rstTable = dbs.OpenRecordset(&quot;SELECT * FROM tblGlobalSearchOptionsTables WHERE ID = &quot; &amp; lngID, _\r\n    dbOpenDynaset)\r\n    If Not rstTable.EOF Then\r\n        strForm = rstTable!Formname\r\n        strTitle = rstTable!Title\r\n        strWhereCondition = ReplacePlaceholders(Nz(rstTable!WhereCondition, &quot;&quot;), lngID, lngValue, strTitle)\r\n        strFiltername = ReplacePlaceholders(Nz(rstTable!Filtername, &quot;&quot;), lngID, lngValue, strTitle)\r\n        strOpenArgs = ReplacePlaceholders(Nz(rstTable!OpenArgs, &quot;&quot;), lngID, lngValue, strTitle)\r\n        If IstFormularGeoeffnet(rstTable!Formname) Then\r\n            DoCmd.Close acForm, rstTable!Formname\r\n        End If\r\n        DoCmd.OpenForm rstTable!Formname, rstTable!View, strFiltername, strWhereCondition, _\r\n        rstTable!DataMode, rstTable!WindowMode, strOpenArgs\r\n    End If\r\nElse\r\n lngID = Me!cboSucheNach\r\n    lngValue = Me!lstSuchergebnis\r\n    Set rstTable = dbs.OpenRecordset(&quot;SELECT * FROM tblGlobalSearchOptionsTables WHERE ID = &quot; &amp; lngID, _\r\n    dbOpenDynaset)\r\n    If Not rstTable.EOF Then\r\n        strForm = rstTable!Formname\r\n        strTitle = rstTable!Title\r\n        strWhereCondition = ReplacePlaceholders(Nz(rstTable!WhereCondition, &quot;&quot;), lngID, lngValue, strTitle)\r\n        strFiltername = ReplacePlaceholders(Nz(rstTable!Filtername, &quot;&quot;), lngID, lngValue, strTitle)\r\n        strOpenArgs = ReplacePlaceholders(Nz(rstTable!OpenArgs, &quot;&quot;), lngID, lngValue, strTitle)\r\n        If IstFormularGeoeffnet(rstTable!Formname) Then\r\n            DoCmd.Close acForm, rstTable!Formname\r\n        End If\r\n        DoCmd.OpenForm rstTable!Formname, rstTable!View, strFiltername, strWhereCondition, _\r\n        rstTable!DataMode, rstTable!WindowMode, strOpenArgs\r\n    End If\r\nEnd If\r\nEnd Sub<\/pre>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>GlobaleSuche.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{C5A66FB3-FB96-4851-B0AD-EA2A7E6EAF8A}\/aiu_674.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine der bekanntesten Tastenkombinationen d&uuml;rfte Strg + F zum Aktivieren der Suchfunktion sein. Der Windows Explorer hat sie, die Internet Browser verwenden sie einheitlich und die Office-Anwendungen greifen darauf zur&uuml;ck. Haben Sie Ihre Anwendungen auch schon damit ausgestattet Nein Na, dann wird es aber h&ouml;chste Zeit! Spendieren Sie den Benutzern diesen Shortcut und zeigen Sie die richtige Suche f&uuml;r den aktuellen Kontext an.<\/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":[662009,66042009,44000028,44000023],"tags":[],"class_list":["post-55000674","post","type-post","status-publish","format-standard","hentry","category-662009","category-66042009","category-Ergonomie_und_Benutzeroberflaeche","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Globale Suche - 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\/Globale_Suche\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Globale Suche\" \/>\n<meta property=\"og:description\" content=\"Eine der bekanntesten Tastenkombinationen d&uuml;rfte Strg + F zum Aktivieren der Suchfunktion sein. Der Windows Explorer hat sie, die Internet Browser verwenden sie einheitlich und die Office-Anwendungen greifen darauf zur&uuml;ck. Haben Sie Ihre Anwendungen auch schon damit ausgestattet Nein Na, dann wird es aber h&ouml;chste Zeit! Spendieren Sie den Benutzern diesen Shortcut und zeigen Sie die richtige Suche f&uuml;r den aktuellen Kontext an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Globale_Suche\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:16:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7\" \/>\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=\"31\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Globale Suche\",\"datePublished\":\"2020-05-22T22:16:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/\"},\"wordCount\":4944,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e91ac2b39a644c98a1ea62d5d18ee9c7\",\"articleSection\":[\"2009\",\"4\\\/2009\",\"Ergonomie und Benutzeroberfl\u00e4che\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/\",\"name\":\"Globale Suche - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e91ac2b39a644c98a1ea62d5d18ee9c7\",\"datePublished\":\"2020-05-22T22:16:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e91ac2b39a644c98a1ea62d5d18ee9c7\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e91ac2b39a644c98a1ea62d5d18ee9c7\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Globale_Suche\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Globale Suche\"}]},{\"@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":"Globale Suche - 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\/Globale_Suche\/","og_locale":"de_DE","og_type":"article","og_title":"Globale Suche","og_description":"Eine der bekanntesten Tastenkombinationen d&uuml;rfte Strg + F zum Aktivieren der Suchfunktion sein. Der Windows Explorer hat sie, die Internet Browser verwenden sie einheitlich und die Office-Anwendungen greifen darauf zur&uuml;ck. Haben Sie Ihre Anwendungen auch schon damit ausgestattet Nein Na, dann wird es aber h&ouml;chste Zeit! Spendieren Sie den Benutzern diesen Shortcut und zeigen Sie die richtige Suche f&uuml;r den aktuellen Kontext an.","og_url":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:16:28+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Globale Suche","datePublished":"2020-05-22T22:16:28+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/"},"wordCount":4944,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7","articleSection":["2009","4\/2009","Ergonomie und Benutzeroberfl\u00e4che","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Globale_Suche\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/","url":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/","name":"Globale Suche - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7","datePublished":"2020-05-22T22:16:28+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Globale_Suche\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/e91ac2b39a644c98a1ea62d5d18ee9c7"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Globale_Suche\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Globale Suche"}]},{"@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\/55000674","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=55000674"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000674\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}