{"id":55001497,"date":"2024-10-01T00:00:00","date_gmt":"2024-08-27T09:38:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1497"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Flexible_Schnellsuche","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/","title":{"rendered":"Flexible Schnellsuche"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0\" width=\"1\" height=\"1\" alt=\"\"><b>Wer kennt das nicht als Entwickler: Man m&ouml;chte mal eben schnell in einer Tabelle nach einem bestimmten Datensatz suchen. Und das auch noch wiederholt, sodass man immer noch den Filter entfernen und diesen neu setzen muss &#8211; wozu wir die eingebauten Filter-Elemente der Datenblattansicht nutzen. Viel sch&ouml;ner w&auml;re es doch, wenn wir mal eben das Kriterium und weitere Einstellungen &uuml;ber das Ribbon steuern k&ouml;nnten &#8211; w&auml;hrend wir die Daten beim Filtern betrachten. Genau dazu haben wir uns f&uuml;r den Eigenbedarf eine kleine Schnellsuche gebaut, die wir in diesem Beitrag vorstellen. Das Beste: Selbst wenn Sie gar nicht genau erfahren wollen, wie es funktioniert, finden Sie die L&ouml;sung f&uuml;r 32-Bit- und 64-Bit-Access im Download zu diesem Beitrag.<\/b><\/p>\n<p>Das Tool soll gar keine aufwendigen Aufgaben erledigen: Wir wollen schlicht und einfach im Ribbon ein Feld haben, in das wir einen Vergleichswert eingeben k&ouml;nnen. <\/p>\n<p>Die Suche wollen wir durch Bet&auml;tigen der Eingabetaste oder einer Schaltfl&auml;che starten.<\/p>\n<p>Zum einen m&ouml;chten wir nur das aktuell markierte Feld oder alle Felder nach dem gesuchten Inhalt filtern und zum anderen m&ouml;chten wir festlegen, ob der gesamte Feldinhalt mit dem Suchbegriff &uuml;bereinstimmen muss oder ob der Suchbegriff nur im Feld enthalten sein soll. All dies sehen wir in Bild 1. Hier haben wir das Textfeld zur Eingabe des Filters, die beiden Schaltfl&auml;chen zum Aktivieren und Deaktivieren des Filters sowie die beiden Optionen f&uuml;r das Durchsuchen des kompletten Feldinhalts und f&uuml;r das aktuelle Feld oder alle Felder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_05\/pic_1497_001.png\" alt=\"Ribbon-Funktion zur Schnellsuche in Datenbl&auml;ttern und Formularen\" width=\"700\" height=\"325,711\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ribbon-Funktion zur Schnellsuche in Datenbl&auml;ttern und Formularen<\/span><\/b><\/p>\n<p>Eine solche Erweiterung k&ouml;nnen wir einer einzelnen Access-Anwendung hinzuf&uuml;gen, indem wir die entsprechende Ribbondefinition anlegen und die dadurch aufgerufenen Funktionen hinzuf&uuml;gen.<\/p>\n<h2>COM-Add-In mit twinBASIC<\/h2>\n<p>Wir wollen diese Funktion allerdings in allen Access-Anwendungen nutzen, jedoch nicht die Funktion in alle Access-Anwendungen einbauen. Deshalb haben wir ein COM-Add-In auf Basis von twinBASIC programmiert. Wie das COM-Add-In funktioniert, zeigen wir in diesem Beitrag. Wenn Sie das COM-Add-In anpassen oder erweitern oder ein neues COM-Add-In auf Basis dieses Add-Ins erstellen wollen, sind Sie nach der Lekt&uuml;re dieses Beitrags bestens ger&uuml;stet. Alles, was man braucht, ist die aktuelle Version der f&uuml;r 32-Bit-Anwendungen kostenlosen twinBASIC-Entwicklungsumgebung, zum Beispiel von hier:<\/p>\n<pre>https:\/\/github.com\/twinbasic\/twinbasic\/releases<\/pre>\n<p>Dabei handelt es sich um eine <b>.exe<\/b>-Datei mit einigen weiteren Dateien, die Sie nur auf Ihre Festplatte extrahieren und starten m&uuml;ssen, zum Beispiel durch einen Doppelklick auf die Datei <b>amvFastSearch.twinproj <\/b>aus dem Download zu diesem Beitrag.<\/p>\n<h2>Code des COM-Add-Ins<\/h2>\n<p>Das Projekt enth&auml;lt nur zwei Module. Das erste namens <b>DllRegistration.twin<\/b> enth&auml;lt lediglich die beiden Funktionen, die beim Registrieren und beim Aufheben der Registrierung durchgef&uuml;hrt werden sollen. Diese werden sowohl ausgef&uuml;hrt, wenn wir in twinBASIC den Befehl <b>File|Build <\/b>aufrufen als auch dann, wenn wir die fertig erstellte <b>.dll<\/b>-Datei mit dem Befehl <b>Regsvr32.exe <\/b>registrieren. Diese enthalten die Informationen, die dann in die Registry geschrieben werden sollen und beim Start von Access ausgelesen werden. Weiter unten zeigen wir jedoch auch noch, wie die Registrierung &uuml;ber die Benutzeroberfl&auml;che funktioniert.<\/p>\n<h2>Beim Start des COM-Add-Ins<\/h2>\n<p>Ist das COM-Add-In einmal registriert, wird es beim Start von Access eingelesen und verschiedene Ereignisprozeduren der beiden Schnittstellen des COM-Add-Ins werden ausgel&ouml;st. Das COM-Add-In implementiert die beiden Schnittstellen <b>IDTExtensibility2 <\/b>und <b>IRibbonExtensibility<\/b>. Die erste sorgt daf&uuml;r, dass das COM-Add-In beim Starten von Access ebenfalls gestartet wird und einen Verweis auf die Access-Instanz erh&auml;lt. Die zweite enth&auml;lt nur eine Funktion, mit der sich Access eine Ribbondefinition holen kann, die wir im COM-Add-In zusammenstellen.<\/p>\n<p>Bevor wir uns die Prozeduren ansehen, die beim Start ausgel&ouml;st werden, werfen wir einen Blick auf einige Variablen, die wir im Kopf der Klasse <b>amvFastSearch <\/b>unterbringen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application\r\n<span style=\"color:blue;\">Private <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n<span style=\"color:blue;\">Private <\/span>bolKompletterFeldinhalt<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Private <\/span>bolNurAktuellesFeld<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Private <\/span>strVergleichswert<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Die erste nimmt einen Verweis auf die Access-Instanz auf, die das COM-Add-In verwendet. Die zweite erh&auml;lt nach dem Erstellen des Ribbons einen Objektverweis auf die Definition, damit wir dar&uuml;ber auf bestimmte Ereignisse reagieren k&ouml;nnen.<\/p>\n<p>Die &uuml;brigen Variablen sind bereits f&uuml;r das Speichern der Informationen vorgesehen, die wir &uuml;ber die Ribbon-Benutzerschnittstelle des Tools eingeben.<\/p>\n<h2>Beim Verbinden des COM-Add-Ins<\/h2>\n<p>Wenn Access gestartet wird und das COM-Add-In &uuml;ber die Registry als aktiv identifiziert, wird dieses aufgerufen und erh&auml;lt &uuml;ber die Ereignisprozedur <b>OnConnection<\/b> mit dem Parameter Application einen Verweis auf die aufrufende Access-Instanz. Dieser wird direkt in der Variablen <b>objAccess <\/b>gespeichert:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, _\r\n         ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n         Implements IDTExtensibility2.OnConnection\r\n     <span style=\"color:blue;\">Set<\/span> objAccess = Application\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Es gibt noch weitere Ereignisprozeduren f&uuml;r das COM-Add-In, aber die sind f&uuml;r uns nicht weiter interessant. Wichtig ist nur, dass sie &uuml;berhaupt implementiert werden.<\/p>\n<h2>Ribbondefinition zusammenstellen<\/h2>\n<p>Die Funktion <b>GetCustomUI <\/b>stellt die Ribbondefinition zusammen und gibt diese an Access zur&uuml;ck, damit diese dort angewendet werden kann (siehe Listing 1). Das Ribbon besteht aus einem <b>customUI<\/b>-Element mit den Callback-Ereignissen <b>loadImage <\/b>und <b>onLoad<\/b>. Die f&uuml;r <b>onLoad <\/b>hinterlegte Prozedur wird einmalig beim Einlesen der Ribbondefinition ausgef&uuml;hrt.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\" loadImage=\"\"LoadImage\"\" \" _\r\n         & \"onLoad=\"\"onLoad\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;ribbon startFromScratch=\"\"false\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;tab idMso=\"\"TabHomeAccess\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;group id=\"\"grpFastSearch\"\" label=\"\"Schnellsuche\"\" insertAfterMso=\"\"GroupSortAndFilter\"\"&gt;\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;box id=\"\"box1\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"            &lt;editBox label=\"\"Filtern nach:\"\" id=\"\"txtFilter\"\" sizeString=\"\"aaaaaaaaaaaaaaaaa\"\" \" _\r\n         & \"onChange=\"\"onChange\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"            &lt;button imageMso=\"\"FilterToggleFilter\"\" id=\"\"btnFilter\"\" onAction=\"\"onAction\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"            &lt;button imageMso=\"\"FilterClearAllFilters\"\" id=\"\"btnFilterAus\"\" onAction=\"\"onAction\"\"\/&gt;\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;\/box&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;checkBox label=\"\"Kompletten Feldinhalt untersuchen\"\" id=\"\"chkKompletterFeldinhalt\"\" \" _\r\n         & \"onAction=\"\"OnAction_Checkbox\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;checkBox label=\"\"Nur aktuelles Feld untersuchen\"\" id=\"\"chkNurAktuellesFeldUntersuchen\"\" \" _\r\n         & \"onAction=\"\"OnAction_Checkbox\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;\/tab&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Zusammenstellen der Ribbondefinition <\/span><\/b><\/p>\n<p>Diese nimmt einen Verweis auf die Ribbondefinition entgegen und speichert diese in der Variablen <b>objRibbon<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>OnLoad(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon = ribbon\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die f&uuml;r das Attribut <b>loadImage <\/b>hinterlegte Funktion <b>loadImage <\/b>erwartet f&uuml;r den mit <b>imageId <\/b>&uuml;bergebenen Namen ein entsprechendes Objekt des Typs <b>IPictureDisp<\/b>. Dieses holen wir mit der Funktion <b>LoadResPicture <\/b>aus den Ressourcen des twinBASIC-Projekts:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>LoadImage(imageId<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>IPictureDisp\r\n     Return LoadResPicture(imageId, _\r\n        vbResBitmapFromIcon, 32, 32)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>In diesem COM-Add-In nutzen wir diese Funktion ehrlich gesagt gar nicht &#8211; aber wenn Sie weitere Funktionen hinzuf&uuml;gen wollen, deren Schaltfl&auml;chen ein benutzerdefiniertes Icon aufweisen sollen, f&uuml;gen Sie einfach die entsprechende <b>.ico<\/b>-Datei zum Ordner <b>Resources|ICON <\/b>des Projekts hinzu und hinterlegen den Namen f&uuml;r die Eigenschaft <b>image<\/b> des jeweiligen Ribbonelements.<\/p>\n<p>In der Ribbondefinition geht es weiter mit den Elementen <b>ribbon<\/b>, <b>tabs <\/b>und <b>tab<\/b>. Als <b>tab<\/b>-Element referenzieren wir das eingebaute <b>tab<\/b>-Element <b>TabHomeAccess<\/b>. Hier f&uuml;gen wir ein group-Element ein, das wir hinter dem eingebauten Element <b>GroupSortAndFilter <\/b>platzieren, also direkt hinter den standardm&auml;&szlig;igen Sortier- und Filterfunktionen. Darin legen wir ein <b>box<\/b>-Element an, dass die <b>editBox <\/b>namens <b>txtFilter <\/b>und die beiden <b>button<\/b>-Elemente <b>btnFilter <\/b>und <b>btnFilterAus <\/b>gruppieren soll, damit diese in einer Zeile nebeneinander abgebildet werden.<\/p>\n<p>Danach folgen noch die beiden <b>checkBox<\/b>-Elemente <b>chkKompletterFeldinhalt <\/b>und <b>chkNurAktuellesFeldUntersuchen<\/b>. Anschlie&szlig;end werden die ge&ouml;ffneten Elemente <b>group, tab<\/b>, <b>tabs<\/b>, <b>ribbon <\/b>und <b>customUI <\/b>in umgekehrter Reihenfolge wieder geschlossen.<\/p>\n<h2>Funktionen der Steuerelemente im Ribbon<\/h2>\n<p>Das <b>editBox<\/b>-Steuerelement haben wir mit den beiden Attributen <b>onChange <\/b>und <b>getText <\/b>ausgestattet. onChange wird ausgel&ouml;st, wenn der Benutzer den Inhalt &auml;ndert und die &Auml;nderung abschlie&szlig;t. Dies l&ouml;st den folgenden Code aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnChange(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, text<span style=\"color:blue;\"> As String<\/span>)\r\n     strVergleichswert = text\r\n     <span style=\"color:blue;\">Call<\/span> Filter()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir schreiben den Vergleichswert in die Variable <b>strVergleichswert <\/b>und rufen die Prozedur <b>Filter <\/b>auf, die das Filtern selbst erledigt. Auf diese kommen wir sp&auml;ter zur&uuml;ck.<\/p>\n<p>Die durch <b>getText <\/b>ausgel&ouml;ste Funktion liefert den aktuellen Wert von <b>strVergleichswert <\/b>an das <b>editBox<\/b>-Element zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>GetText(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)<span style=\"color:blue;\"> As String<\/span>\r\n     Return strVergleichswert\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wozu das sinnvoll ist, besprechen wir gleich im Anschluss.<\/p>\n<h2>Funktionen der Schaltfl&auml;chen<\/h2>\n<p>Die Schaltfl&auml;che <b>btnFilter <\/b>ruft mit <b>onAction <\/b>die Prozedur <b>onAction <\/b>auf, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     Select Case control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnFilter\"\r\n             <span style=\"color:blue;\">Call<\/span> Filter\r\n         <span style=\"color:blue;\">Case <\/span>\"btnFilterAus\"\r\n             strVergleichswert = \"\"\r\n             <span style=\"color:blue;\">Call<\/span> objRibbon.Invalidate()\r\n             <span style=\"color:blue;\">Call<\/span> Filter\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"OnAction nicht behandelt: \" & control.Id\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie erwartet mit dem Parameter <b>control<\/b> einen Verweis auf das aufrufende <b>button<\/b>-Element. Wenn wir den Button <b>btnFilter <\/b>anklicken, sorgt dies f&uuml;r den Aufruf der Prozedur <b>Filter<\/b>.<\/p>\n<p>Wenn wir <b>btnFilterAus <\/b>anklicken, wird <b>strVergleichswert <\/b>auf eine leere Zeichenkette eingestellt. Au&szlig;erdem rufen wir die Methode <b>Invalidate <\/b>von <b>objRibbon <\/b>auf und sorgen so daf&uuml;r, dass alle <b>get&#8230;<\/b>-Attribute erneut aus den entsprechenden Funktionen gef&uuml;llt werden m&uuml;ssen.<\/p>\n<p>Dadurch wird auch das Textfeld geleert, indem es mit der leeren Zeichenkette aus <b>strVergleichswert <\/b>gef&uuml;llt wird.<\/p>\n<p>Damit wird erneut die Prozedur Filter ausgel&ouml;st, die bei leerem Vergleichskriterium den Filter deaktiviert.<\/p>\n<h2>checkbox-Elemente<\/h2>\n<p>Wenn der Benutzer das <b>checkBox<\/b>-Element <b>chkKompletterFeldinhalt <\/b>anklickt, l&ouml;st er die Prozedur <b>OnAction_Checkbox <\/b>aus. Diese pr&uuml;ft wieder, von welcher Checkbox sie ausgel&ouml;st wurde:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnAction_Checkbox(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n         pressed<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     Select Case control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"chkKompletterFeldinhalt\"\r\n             bolKompletterFeldinhalt = pressed\r\n         <span style=\"color:blue;\">Case <\/span>\"chkNurAktuellesFeldUntersuchen\"\r\n             bolNurAktuellesFeld = pressed\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> Filter(<span style=\"color:blue;\">True<\/span>)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie stellt die jeweilige Variable, also <b>bolKompletterFeldinhalt <\/b>oder <b>bolNurAktuellesFeldUntersuchen<\/b>, auf den aktuellen Wert des entsprechenden Kontrollk&auml;stchens ein. Danach ruft auch sie wieder die <b>Filter<\/b>-Prozedur auf, damit der Filter an die ge&auml;nderten Optionen angepasst werden kann.<\/p>\n<h2>Filter-Prozedur<\/h2>\n<p>Damit haben wir alle Ribbon-Elemente erl&auml;utert und k&ouml;nnen uns endlich um die <b>Filter<\/b>-Prozedur k&uuml;mmern (erster Teil siehe Listing 2). Sie versucht zun&auml;chst, das aktive Steuerelement mit <b>objAccess.Screen.ActiveControl <\/b>zu referenzieren. Der Hintergrund ist, es auch kein Objekt gibt, dessen Inhalt gefiltert werden kann.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Filter(<span style=\"color:blue;\">Optional<\/span> bolCheckbox<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strField<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As Object<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ctl = objAccess.Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>ctl Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte markiere ein Steuerelement innerhalb des zu filternden Datenblatts.\", vbOKOnly + _\r\n             vbExclamation, \"amvFastSearch\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = objAccess.Screen.ActiveControl.Parent.recordset\r\n     <span style=\"color:blue;\">If <\/span>rst Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolCheckbox = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"F&uuml;r diese Funktion muss ein Feld in einem Datenblatt den Fokus haben.\", vbOKOnly _\r\n                 + vbExclamation, \"amvFastSearch\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strField = objAccess.Screen.ActiveControl.ControlSource\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strField) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"F&uuml;r diese Funktion muss ein Feld im Datenblatt den Fokus haben.\", vbOKOnly + vbExclamation, _\r\n             \"amvFastSearch\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Filtern des Datenblatts (Teil 1)<\/span><\/b><\/p>\n<p>Der Bezug &uuml;ber <b>objAccess <\/b>ist wichtig, weil das COM-Add-In die <b>Screen<\/b>-Klasse an sich ja gar nicht kennt. Wenn die Variable <b>ctl <\/b>anschlie&szlig;end nicht mit einem Verweis auf ein Steuerelement gef&uuml;llt ist, erscheint eine Meldung, die den Benutzer darauf hinweist, ein entsprechendes Steuerelement zu markieren. Au&szlig;erdem wird die Prozedur an dieser Stelle verlassen. Anschlie&szlig;end versuchen wir, das Recordset des <b>Parent<\/b>-Elements des Steuerelements aus <b>Screen.ActiveControl <\/b>zu ermitteln. Liefert dies kein <b>Recordset<\/b>-Element, erscheint ebenfalls eine entsprechende Meldung und die Prozedur endet hier.<\/p>\n<p>L&auml;uft die Prozedur nach dieser Pr&uuml;fung noch, haben wir bereits zwei Informationen: Es hat ein Steuerelement den Fokus, dessen &uuml;bergeordnetes Element ein <b>Recordset<\/b>-Objekt verwendet. Damit k&ouml;nnen wir zur n&auml;chsten Pr&uuml;fung &uuml;bergehen: Handelt es sich um ein gebundenes Steuerelement? Dazu weisen wir der Variablen <b>strField <\/b>den Inhalt von <b>objAccess.Screen.ActiveControl.ControlSource <\/b>zu. Diese Eigenschaft ist nur f&uuml;r gebundene Steuerelemente gef&uuml;llt. Ist <b>Len(strField) <\/b>anschlie&szlig;end also leer, haben wir kein gebundenes Steuerelement und somit auch keine Grundlage zum Durchsuchen der Datens&auml;tze.<\/p>\n<p>Erst danach k&ouml;nnen wir in das Zusammensetzen des Filters einsteigen (siehe Listing 3). Als Erstes untersuchen wir nun den Wert der Variablen <b>strVergleichswert<\/b>. Diese wird nach jeder &Auml;nderung des Steuerelements <b>txtFilter <\/b>im Ribbon mit dem dort enthaltenen Wert aktualisiert. Liefert <b>Len(strVergleichswert) <\/b>den Wert <b>0<\/b>, leeren wir den Filter des Datenblatts, indem wir <b>objAccess.Screen.ActiveControl.Parent.Filter <\/b>auf eine leere Zeichenkette einstellen.<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strVergleichswert) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         objAccess.Screen.ActiveControl.Parent.Filter = \"\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolNurAktuellesFeld<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>bolKompletterFeldinhalt = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                 strFilter = strField & \" LIKE ''\" & strVergleichswert & \"''\"\r\n                 objAccess.Screen.ActiveControl.Parent.Filter = strFilter\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strFilter = strField & \" LIKE ''*\" & strVergleichswert & \"*''\"\r\n                 objAccess.Screen.ActiveControl.Parent.Filter = strFilter\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             For Each fld In rst.Fields\r\n                 Select Case fld.Type\r\n                     <span style=\"color:blue;\">Case <\/span>dbAttachment, dbComplexByte, dbComplexDecimal, dbComplexDouble, dbComplexGUID, _\r\n                         dbComplexInteger, dbComplexLong, dbComplexSingle, dbComplexText, dbLongBinary, dbVarBinary\r\n                     <span style=\"color:blue;\">Case Else<\/span>\r\n                         <span style=\"color:blue;\">If <\/span>bolKompletterFeldinhalt = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                             strFilter = strFilter & \" OR \" & fld.Name & \" LIKE ''\" & strVergleichswert & \"''\"\r\n                         <span style=\"color:blue;\">Else<\/span>\r\n                             strFilter = strFilter & \" OR \" & fld.Name & \" LIKE ''*\" & strVergleichswert & \"*''\"\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> fld\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 4)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             objAccess.Screen.ActiveControl.Parent.filter = strFilter\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         objAccess.Screen.ActiveControl.Parent.filteron = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Filtern des Datenblatts (Teil 2)<\/span><\/b><\/p>\n<p>Hat <b>strVergleichswert <\/b>jedoch einen Wert, untersuchen wir die weiteren Bedingungen anhand der Werte f&uuml;r die Variablen <b>bolNurAktuellesFeld<\/b> und <b>bolKompletterFeldinhalt<\/b>.<\/p>\n<p>Zun&auml;chst bearbeiten wir den Fall, dass beide Variablen den Wert <b>True <\/b>enthalten, dass wir also den Suchbegriff mit dem kompletten Inhalt des aktuellen Feldes abgleichen wollen. In diesem Fall stellen wir einen Filterausdruck zusammen, der beispielsweise so lautet:<\/p>\n<pre>Vorname LIKE ''Andr&eacute;''<\/pre>\n<p>Wenn <b>bolKompletterFeldinhalt <\/b>den Wert <b>False <\/b>enth&auml;lt, wird daraus dieses Kriterium:<\/p>\n<pre>Vorname LIKE ''*Andr&eacute;*''<\/pre>\n<p>Durch die Sternchen kann der Suchausdruck also an beliebiger Stelle im Feldinhalt enthalten sein. Wenn <b>bolNurAktuellesFeld <\/b>den Wert <b>False <\/b>enth&auml;lt, sollen alle Felder mit dem Vergleichswert verglichen werden. Hier nutzen wir nun das weiter oben bereits ermittelte Recordset. In einer <b>For Each<\/b>-Schleife durchlaufen wir alle Elemente der <b>Fields<\/b>-Auflistung und referenzieren das aktuelle Element mit der Variablen <b>fld<\/b>.<\/p>\n<p>In der Schleife unterscheiden wir nach Feldern, deren Inhalt mit Zeichenketten verglichen werden kann und solchen, bei denen das nicht m&ouml;glich ist. Dabei lassen wir die Datentypen <b>dbAttachment<\/b>, <b>dbComplexByte<\/b>, <b>dbComplexDecimal<\/b>, <b>dbComplexDouble<\/b>, <b>dbComplexGUID<\/b>, <b>dbComplexInteger<\/b>, <b>dbComplexLong<\/b>, <b>dbComplexSingle<\/b>, <b>dbComplexText<\/b>, <b>dbLongBinary <\/b>und <b>dbVarBinary <\/b>au&szlig;en vor. F&uuml;r alle anderen pr&uuml;fen wir wieder zuerst, ob der komplette Feldinhalt untersucht werden soll oder ob auch Teilinhalte als Fundstellen gelten.<\/p>\n<p>Im ersteren Fall stellen wir nun in <b>strFilter <\/b>eine Zeichenkette zusammen, die beispielsweise wie folgt aussehen w&uuml;rde, wenn das Recordset nur die beiden Felder <b>Vorname <\/b>und <b>Nachname <\/b>enthalten w&uuml;rde:<\/p>\n<pre>Vorname LIKE ''Minhorst'' OR Nachname LIKE ''Minhorst''<\/pre>\n<p>Wenn auch Teilzeichenketten g&uuml;ltig sind, kommen noch die Sternchen als Platzhalter zu unserem Filter-Ausdruck hinzu:<\/p>\n<pre>Vorname LIKE ''*Minhorst*'' OR Nachname LIKE ''*Minhorst*''<\/pre>\n<p>Schlie&szlig;lich stellen wir die Eigenschaft <b>FilterOn <\/b>f&uuml;r das &uuml;bergeordnete Objekt auf <b>True <\/b>ein, damit der Filter aktiviert wird.<\/p>\n<h2>COM-Add-In erstellen<\/h2>\n<p>Sie k&ouml;nnen das COM-Add-In nun mit dem Men&uuml;befehl <b>File|Build <\/b>erstellen. Achten Sie dabei darauf, dass wenn es bereits einmal erstellt wurde und aktuell eine Access-Instanz l&auml;uft, keine Neuerstellung m&ouml;glich ist, weil die vorhandene DLL nicht gel&ouml;scht werden kann &#8211; diese ist in Benutzung. Sie sollten also zun&auml;chst alle Access-Instanzen beenden. Treten dann Probleme bei der Erstellung auf, kann dies daran liegen, dass noch eine Access-Instanz im Hintergrund l&auml;uft. Diese l&auml;sst sich nur &uuml;ber den Task-Manager beenden.<\/p>\n<p>Wenn Sie das COM-Add-In auf dem eigenen Rechner erstellen, werden direkt die notwendigen Registry-Eintr&auml;ge erstellt, die daf&uuml;r sorgen, dass das COM-Add-In beim n&auml;chsten Start von Access erkannt und aufgerufen wird.<\/p>\n<p>Um das COM-Add-In aus der Registrierung zu entfernen, wechseln Sie im twinBASIC-Projekt zur Datei <b>DllRegistration.twin<\/b>. Hier f&uuml;hren Sie die Prozedur <b>DllUnregisterServer <\/b>aus. Auch dazu darf aktuell keine Access-Instanz ge&ouml;ffnet sein und auf die DLL zugreifen.<\/p>\n<h2>COM-Add-In auf einem anderen Rechner installieren<\/h2>\n<p>Wenn Sie es auf einem anderen Rechner installieren wollen, sind nur die folgenden Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Kopieren der DLL-Datei in das gew&uuml;nschte Verzeichnis.<\/li>\n<li>Registrieren der DLL-Datei.<\/li>\n<\/ul>\n<p>Das k&ouml;nnen wir &uuml;ber die Benutzeroberfl&auml;che von Access erledigen. Dazu &ouml;ffnen wir die Access-Optionen mit dem Ribboneintrag <b>Datei|Optionen<\/b>. Hier wechseln wir zum Bereich <b>Add-Ins<\/b>, wo wir unter <b>Verwalten <\/b>den Eintrag <b>COM-Add-Ins <\/b>ausw&auml;hlen und auf <b>Los&#8230; <\/b>klicken. Dies &ouml;ffnet den Dialog <b>COM-Add-Ins <\/b>aus Bild 2. Hier klicken wir auf <b>Hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen im folgenden Dateiauswahl-Dialog die DLL aus. Diese finden wir in der Regel im Verzeichnis der <b>.twinproj<\/b>-Datei in einem Ordner namens <b>Build<\/b>. Danach k&ouml;nnen wir den Dialog schlie&szlig;en und das COM-Add-In bereits nutzen. Eine fertige 32-Bit- und 64-Bit-Version finden Sie im Download des Beitrags.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_05\/pic_1497_002.png\" alt=\"Hinzuf&uuml;gen eines COM-Add-Ins zu Access\" width=\"649,559\" height=\"271,348\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen eines COM-Add-Ins zu Access<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit diesem Beitrag erhalten Sie eine praktische DLL, die &uuml;ber das Ribbon das schnelle Filtern in Tabellen, Abfragen oder Formularen erm&ouml;glicht.<\/p>\n<p>Und auch, wenn Sie diese Funktion nicht nutzen wollen, finden Sie mit dem Beispielprojekt die Grundlage zum Programmieren eigener COM-Add-Ins, mit denen Sie vielleicht sehns&uuml;chtig vermisste Funktionen zur Benutzeroberfl&auml;che von Access hinzuf&uuml;gen k&ouml;nnen.<\/p>\n<p>Wir laden Sie herzlich ein, uns unter der E-Mail-Adresse <b>support@minhorst.com <\/b>mitzuteilen, welche Ideen Sie hierzu haben oder bereits umgesetzt haben.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvFastSearch.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/6509E065-9941-47A0-8E80-B686EB91C15D\/aiu_1497.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer kennt das nicht als Entwickler: Man m&ouml;chte mal eben schnell in einer Tabelle nach einem bestimmten Datensatz suchen. Und das auch noch wiederholt, sodass man immer noch den Filter entfernen und diesen neu setzen muss &#8211; wozu wir die eingebauten Filter-Elemente der Datenblattansicht nutzen. Viel sch&ouml;ner w&auml;re es doch, wenn wir mal eben das Kriterium und weitere Einstellungen &uuml;ber das Ribbon steuern k&ouml;nnten &#8211; w&auml;hrend wir die Daten beim Filtern betrachten. Genau dazu haben wir uns f&uuml;r den Eigenbedarf eine kleine Schnellsuche gebaut, die wir in diesem Beitrag vorstellen. Das Beste: Selbst wenn Sie gar nicht genau erfahren wollen, wir es funktioniert, finden Sie die L&ouml;sung f&uuml;r 32-Bit- und 64-Bit-Access im Download zu diesem Beitrag.<\/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":[662024,66052024,44000027],"tags":[],"class_list":["post-55001497","post","type-post","status-publish","format-standard","hentry","category-662024","category-66052024","category-Loesungen"],"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>Flexible Schnellsuche - 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\/Flexible_Schnellsuche\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flexible Schnellsuche\" \/>\n<meta property=\"og:description\" content=\"Wer kennt das nicht als Entwickler: Man m&ouml;chte mal eben schnell in einer Tabelle nach einem bestimmten Datensatz suchen. Und das auch noch wiederholt, sodass man immer noch den Filter entfernen und diesen neu setzen muss - wozu wir die eingebauten Filter-Elemente der Datenblattansicht nutzen. Viel sch&ouml;ner w&auml;re es doch, wenn wir mal eben das Kriterium und weitere Einstellungen &uuml;ber das Ribbon steuern k&ouml;nnten - w&auml;hrend wir die Daten beim Filtern betrachten. Genau dazu haben wir uns f&uuml;r den Eigenbedarf eine kleine Schnellsuche gebaut, die wir in diesem Beitrag vorstellen. Das Beste: Selbst wenn Sie gar nicht genau erfahren wollen, wir es funktioniert, finden Sie die L&ouml;sung f&uuml;r 32-Bit- und 64-Bit-Access im Download zu diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-27T09:38:51+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Flexible Schnellsuche\",\"datePublished\":\"2024-08-27T09:38:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/\"},\"wordCount\":2379,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/af7582395abd4d03af1cf391b90b87f0\",\"articleSection\":[\"2024\",\"5\\\/2024\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/\",\"name\":\"Flexible Schnellsuche - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/af7582395abd4d03af1cf391b90b87f0\",\"datePublished\":\"2024-08-27T09:38:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/af7582395abd4d03af1cf391b90b87f0\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/af7582395abd4d03af1cf391b90b87f0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Schnellsuche\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flexible Schnellsuche\"}]},{\"@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":"Flexible Schnellsuche - 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\/Flexible_Schnellsuche\/","og_locale":"de_DE","og_type":"article","og_title":"Flexible Schnellsuche","og_description":"Wer kennt das nicht als Entwickler: Man m&ouml;chte mal eben schnell in einer Tabelle nach einem bestimmten Datensatz suchen. Und das auch noch wiederholt, sodass man immer noch den Filter entfernen und diesen neu setzen muss - wozu wir die eingebauten Filter-Elemente der Datenblattansicht nutzen. Viel sch&ouml;ner w&auml;re es doch, wenn wir mal eben das Kriterium und weitere Einstellungen &uuml;ber das Ribbon steuern k&ouml;nnten - w&auml;hrend wir die Daten beim Filtern betrachten. Genau dazu haben wir uns f&uuml;r den Eigenbedarf eine kleine Schnellsuche gebaut, die wir in diesem Beitrag vorstellen. Das Beste: Selbst wenn Sie gar nicht genau erfahren wollen, wir es funktioniert, finden Sie die L&ouml;sung f&uuml;r 32-Bit- und 64-Bit-Access im Download zu diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-08-27T09:38:51+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Flexible Schnellsuche","datePublished":"2024-08-27T09:38:51+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/"},"wordCount":2379,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0","articleSection":["2024","5\/2024","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/","url":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/","name":"Flexible Schnellsuche - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0","datePublished":"2024-08-27T09:38:51+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/af7582395abd4d03af1cf391b90b87f0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Schnellsuche\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Flexible Schnellsuche"}]},{"@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\/55001497","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=55001497"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001497\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}