{"id":55001087,"date":"2017-06-01T00:00:00","date_gmt":"2020-05-14T13:42:39","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1087"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Filter_speichern_und_wieder_abrufen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/","title":{"rendered":"Filter speichern und wieder abrufen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Der Benutzer einer Access-Datenbank will sich nicht damit besch&auml;ftigen, Where-Ausdr&uuml;cke zu definieren, mit denen er die Daten seiner Datenbank filtern kann. Er braucht aussagekr&auml;ftige Bezeichnungen, mit denen er die gew&uuml;nschten Daten erh&auml;lt &#8211; am besten mit nicht viel mehr als einem Mausklick. Das ist eine sch&ouml;ne Aufgabe: Also statten wir unsere Anwendung mit einer solchen M&ouml;glichkeit aus, die der Benutzer sogar noch mit selbst angewendeten Filterkriterien anreichern kann. Und das, ohne auch nur einen Hauch von SQL zu beherrschen.<\/b><\/p>\n<h2>Ausgangsdatenbank<\/h2>\n<p>Die Beispieldatenbank enth&auml;lt eine Tabelle <b>tblKunden <\/b>und eine Tabelle <b>tblAnreden<\/b>, wobei die Tabelle <b>tblKunden <\/b>&uuml;ber die Fremdschl&uuml;sselfelder <b>LieferAnrede <\/b>und <b>RechnungAnrede <\/b>mit der Tabelle <b>tblAnreden <\/b>verkn&uuml;pft ist. Zus&auml;tzlich haben wir eine Abfrage namens <b>qryKunden <\/b>angelegt, welche die beiden Tabellen <b>tblKunden <\/b>und <b>tblAnreden <\/b>zusammenfasst. Dabei haben wir in dieser Abfrage die beiden Felder <b>LieferAnredeID <\/b>und <b>RechnungAnredeID <\/b>der Tabelle <b>tblKunden <\/b>weggelassen und daf&uuml;r die Bezeichnung der Anreden aus der Tabelle <b>tblAnreden <\/b>hinzugef&uuml;gt.  Diese Abfrage dient als Datenherkunft eines Unterformulars namens <b>sfmKundenfilter<\/b>. Die Felder haben wir vollst&auml;ndig in den Detailbereich der Entwurfsansicht gezogen. Damit das Unterformular die Daten in der Datenblattansicht anzeigt, stellen Sie die Eigenschaft <b>Standardansicht <\/b>auf diesen Wert ein. Das Unterformular haben wir in ein Hauptformular namens <b>frmKundenfilter <\/b>gezogen, das neben diesem Unterformular nat&uuml;rlich noch die Steuer-elemente zum Anwenden der Filter enthalten soll. Dieser Aufbau sieht wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_001.png\" alt=\"Basisausstattung des Formulars frmKundenfilter samt Unterformular sfmKundenfilter\" width=\"499,6607\" height=\"393,7256\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Basisausstattung des Formulars frmKundenfilter samt Unterformular sfmKundenfilter<\/span><\/b><\/p>\n<h2>Ziel der L&ouml;sung<\/h2>\n<p>Das Ziel ist nun, dem Hauptformular ein Kombinationsfeld hinzuzuf&uuml;gen, mit dem der Benutzer einen vordefinierten Filter ausw&auml;hlen kann. Hat er diesen ausgew&auml;hlt, soll der Filter direkt auf die Daten im Unterformular angewendet werden. Das bedeutet, dass wir die Filter auch an irgendeiner Stelle vordefinieren und auch abrufbar machen m&uuml;ssen. Was bietet sich da besser an als eine Tabelle<\/p>\n<h2>Tabelle zum Speichern der Filter<\/h2>\n<p>Die Tabelle, in der wir die Filterkriterien speichern wollen, hei&szlig;t <b>tblFormularfilter <\/b>und ist wie in der Entwurfsansicht aus Bild 2 aufgebaut. Neben dem Prim&auml;rschl&uuml;sselfeld enth&auml;lt die Tabelle drei Felder:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_002.png\" alt=\"Tabelle zum Speichern der Filterkriterien\" width=\"649,559\" height=\"392,0079\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Tabelle zum Speichern der Filterkriterien<\/span><\/b><\/p>\n<ul>\n<li><b>Bezeichnung<\/b>: Bezeichnung des Filters, wie er auch im Kombinationsfeld des Formulars zur Auswahl angeboten werden soll<\/li>\n<li><b>Filter<\/b>: Filterkriterium im SQL-Format<\/li>\n<li><b>Formularname<\/b>: Name des Formulars, f&uuml;r das der Filter vorgesehen ist. Durch dieses Feld erm&ouml;glichen wir den Einsatz der L&ouml;sung in mehreren Formularen.<\/li>\n<\/ul>\n<p>Da jede Bezeichnung nur einmal f&uuml;r jedes Formular verwendet werden soll, legen wir au&szlig;erdem noch einen eindeutigen Index &uuml;ber die beiden Felder <b>Bezeichnung<\/b> und <b>Formularname <\/b>fest (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_010.png\" alt=\"Eindeutiger Index &uuml;ber die beiden Felder Bezeichnung und Formularname\" width=\"424,7115\" height=\"214,5911\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eindeutiger Index &uuml;ber die beiden Felder Bezeichnung und Formularname<\/span><\/b><\/p>\n<p>Um gleich mit dieser Tabelle arbeiten zu k&ouml;nnen, geben wir ein paar Beispiele f&uuml;r Filterkriterien in die Datenblattansicht der Tabelle ein (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_003.png\" alt=\"Die Tabelle tblFormularfilter mit einigen Beispieldatens&auml;tzen\" width=\"700\" height=\"195,9288\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle tblFormularfilter mit einigen Beispieldatens&auml;tzen<\/span><\/b><\/p>\n<h2>Einbau des Filterkombinationsfeldes<\/h2>\n<p>Nun wollen wir das Kombinationsfeld zum Filtern der Daten des Unterformulars nach einem der vordefinierten Filter hinzuf&uuml;gen. Dazu legen Sie ein einfaches Kombinationsfeld im oberen Bereich des Formulars an und nennen es <b>cboFormularfilter<\/b>. Tragen Sie f&uuml;r die Eigenschaft <b>Datensatzherkunft<\/b> des Kombinationsfeldes die Abfrage <b>tblFormularfilter <\/b>ein. Stellen Sie f&uuml;r die Eigenschaft <b>Spaltenanzahl <\/b>den Wert <b>3 <\/b>und f&uuml;r die Eigenschaft <b>Spaltenbreiten <\/b>den Wert <b>0cm;;0cm <\/b>ein (s. Bild 5). Was bedeuten diese Werte Als Datensatzherkunft verwenden wir die Tabelle <b>tblFormularfilter<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_004.png\" alt=\"Hinzuf&uuml;gen des Kombinationsfeldes zur Auswahl des Filters\" width=\"599,593\" height=\"428,5405\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Hinzuf&uuml;gen des Kombinationsfeldes zur Auswahl des Filters<\/span><\/b><\/p>\n<p>Wir ben&ouml;tigen das erste Feld als gebundene Spalte, das zweite als anzuzeigenden Wert und das dritte enth&auml;lt das Filterkriterium, das wir auslesen wollen, wenn der Benutzer einen der Eintr&auml;ge ausgew&auml;hlt hat. Also teilen wir dem Kombinationsfeld drei Spalten zu, von denen die erste und die dritte die Breite 0cm aufweisen sollen &#8211; also quasi ausgeblendet sind. Nur die mittlere Spalte soll erscheinen, und das in voller Breite. Daher finden Sie zwischen den beiden Semikola keine explizite Breitenangabe.<\/p>\n<h2>Nach Formular filtern<\/h2>\n<p>Nun haben wir allerdings in der Tabelle <b>tblFormularfilter <\/b>bereits ein Feld namens <b>Formularname<\/b> hinterlegt, mit dem wir festlegen wollen, f&uuml;r welches Formular der jeweilige Filter verwendet werden kann. Wir k&ouml;nnen ja durchaus ein Kundenformular, ein Artikelformular oder auch ein Lieferantenformular mit einem solchen Filter ausstatten.<\/p>\n<p>Wie aber filtern wir die Datensatzherkunft eines Kombinationsfeldes nach dem Namen des Formulars, in dem es angezeigt wird Dies erledigen wir am einfachsten, indem wir die Datensatzherkunft beim Laden des Formulars einstellen. Die dazu notwendige Ereignisprozedur wird durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st und sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboFormularfilter.RowSource = _\r\n         \"SELECT * FROM tblFormularfilter  WHERE Formularname = ''\" & Me.Name & \"''\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach finden wir im Kombinationsfeld bereits alle gew&uuml;nschten Eintr&auml;ge vor (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_005.png\" alt=\"Kombinationsfeldes zur Auswahl des Filters\" width=\"649,559\" height=\"392,0206\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Kombinationsfeldes zur Auswahl des Filters<\/span><\/b><\/p>\n<h2>Filterfunktion hinzuf&uuml;gen<\/h2>\n<p>Nun fehlt als Grundausstattung noch eine Funktion, die den in der Tabelle gespeicherten Filterausdruck nach der Auswahl eines der Eintr&auml;ge des Kombinationsfeldes auf die Daten des Unterformulars anwendet. Diese Prozedur erstellen wir f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes. Sie sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboFormularfilter_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     strFilter = Me!cboFormularfilter.Column(2)\r\n     Me!sfmKundenfilter.Form.Filter = strFilter\r\n     Me!sfmKundenfilter.Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ermittelt mit der Eigenschaft <b>Column(2) <\/b>den Wert der dritten Spalte des ausgew&auml;hlten Eintrags des Kombinationsfeldes und tr&auml;gt diesen in die Variable <b>strFilter <\/b>ein (zur Erl&auml;uterung: der Index der Spalten im Kombinationsfeld startet mit <b>0<\/b>). Dann weist sie diesen Ausdruck der Eigenschaft <b>Filter <\/b>des <b>Form<\/b>-Objekts des Unterformular-Steuerelements zu und stellt <b>FilterOn <\/b>auf den Wert <b>True <\/b>ein. Das Ergebnis sieht dann beispielsweise wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_006.png\" alt=\"Der Filter in Aktion\" width=\"649,559\" height=\"206,7561\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Der Filter in Aktion<\/span><\/b><\/p>\n<h2>Filter leeren<\/h2>\n<p>Nun fehlt noch eine einfache Funktion, mit welcher der Benutzer den Filter leeren und wieder alle Datens&auml;tze im Unterformular einblenden kann. Dazu haben wir zwei M&ouml;glichkeiten: Entweder wir f&uuml;gen eine Schaltfl&auml;che hinzu, welche den Filter wieder entfernt, oder wir legen im Kombinationsfeld einen Eintrag an, der etwa den Text <b><Filter leeren> <\/b>anzeigt. Hier entscheiden wir uns f&uuml;r den ersten Weg, was zwar bedeutet, dass wir ein zus&auml;tzliches Steuer-element anlegen m&uuml;ssen (s. Bild 8). Allerdings ist dies f&uuml;r den Benutzter offensichtlicher als ein Eintrag im Kombinationsfeld, der nicht direkt sichtbar ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_007.png\" alt=\"Schaltfl&auml;che zum Deaktivieren des Filters\" width=\"549,6265\" height=\"162,6447\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Schaltfl&auml;che zum Deaktivieren des Filters<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che f&uuml;gen Sie am besten direkt neben dem Kombinationsfeld ein und legen f&uuml;r das Ereignis <b>Beim Klicken <\/b>die folgende Ereignisprozedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFilterLeeren_Click()\r\n     Me!cboFormularfilter = Null\r\n     Me!sfmKundenfilter.Form.Filter = \"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Eigene Filter definieren<\/h2>\n<p>Nun kommt der interessante Teil: Sie wollen ja nicht immer, wenn der Benutzer ein neues Filterkriterium w&uuml;nscht, zur Tastatur greifen und dem Benutzer anschlie&szlig;end eine neue Version der Datenbank zusenden. Es w&auml;re doch toll, wenn der Benutzer selbst seine Filterkriterien zusammenstellen k&ouml;nnte. Den Grundstein dazu haben wir ja bereits gelegt, indem wir eine Tabelle zum Speichern der Filterkriterien angelegt haben &#8211; diese l&auml;dt nat&uuml;rlich dazu ein, weitere Kriterien hinzuzuf&uuml;gen.<\/p>\n<p><!--30percent--><\/p>\n<p>Nun k&ouml;nnten Sie dem Benutzer grundlegende SQL-Kenntnisse vermitteln, damit er die Abfragekriterien selbst anhand der Felder und der gew&uuml;nschten Vergleichswerte zusammenstellt. Ab einer gewissen Komplexit&auml;t kommt der Benutzer auch sicher nicht um diesen Schritt herum. Aber f&uuml;r viele einfache Kriterien kann der Benutzer sich mit den Mitteln der Benutzeroberfl&auml;che behelfen: Dabei filtert er einfach selbst die Daten in dem Formular, indem er etwa auf den Pfeil nach unten im Spaltenkopf klickt, dann beispielsweise f&uuml;r ein Textfeld den Eintrag <b>Textfilter|Enth&auml;lt&#8230; <\/b>ausw&auml;hlt und den gew&uuml;nschten Vergleichswert in das nun erscheinende Feld eingibt (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_008.png\" alt=\"Eingabe von Filterkriterien &uuml;ber die Benutzeroberfl&auml;che\" width=\"649,559\" height=\"461,2809\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Eingabe von Filterkriterien &uuml;ber die Benutzeroberfl&auml;che<\/span><\/b><\/p>\n<p>Was die Wenigsten wissen: Das dadurch angewendete Filterkriterium wird ebenfalls in die Eigenschaft <b>Filter<\/b> des jeweiligen Formulars eingetragen. Sie k&ouml;nnen dieses also etwa &uuml;ber den Direktbereich ausgeben lassen &#8211; zum Beispiel wie in Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_009.png\" alt=\"Ausgabe des aktuellen Filterkriteriums im Direktbereich\" width=\"424,7115\" height=\"178,7289\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Ausgabe des aktuellen Filterkriteriums im Direktbereich<\/span><\/b><\/p>\n<p>Das k&ouml;nnen wir uns nat&uuml;rlich zunutze machen und das Filterkriterium speichern, wenn der Benutzer das gew&uuml;nschte Ergebnis erhalten soll. Dazu f&uuml;gen wir eine weitere Schaltfl&auml;che mit der Beschriftung <b>Filter speichern <\/b>hinzu. Diese erh&auml;lt den Namen <b>cmdFilterSpeichern <\/b>und die Prozedur aus Listing 1 f&uuml;r die Ereigniseigenschaft <b>Beim Klicken<\/b>. Die Prozedur ermittelt zun&auml;chst den aktuellen Filterausdruck und speichert diesen in der Variablen <b>strFilter<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFilterSpeichern_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strFormularname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolGespeichert<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFilterID<span style=\"color:blue;\"> As Long<\/span>\r\n     strFilter = Me!sfmKundenfilter.Form.Filter\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es ist kein Filter aktiv.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     bolGespeichert = <span style=\"color:blue;\">True<\/span>\r\n     strBezeichnung = InputBox(\"Geben Sie eine Bezeichnung f&uuml;r den Filter ein:\", \"Filter speichern\")\r\n     strFormularname = Me.Name\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strBezeichnung) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         db.Execute \"INSERT INTO tblFormularfilter(Bezeichnung, Filter, Formularname) VALUES(''\" & strBezeichnung _\r\n             & \"'', ''\" & strFilter & \"'', ''\" & strFormularname & \"'')\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n             If <span style=\"color:blue;\">MsgBox<\/span>(\"Es gibt bereits einen Filter mit dieser Bezeichnung. &uuml;berschreiben\", vbYesNo, _\r\n                     \"Filter &uuml;berschreiben\") = vbYes Then\r\n                 db.Execute \"UPDATE tblFormularfilter SET Filter = ''\" & strFilter & \"'' WHERE Bezeichnung = ''\" _\r\n                     & strBezeichnung & \"'' AND Formularname = ''\" & strFormularname & \"''\", dbFailOnError\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 bolGespeichert = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolGespeichert<span style=\"color:blue;\"> Then<\/span>\r\n             lngFilterID = DLookup(\"FilterID\", \"tblFormularfilter\", \"Bezeichnung = ''\" & strBezeichnung _\r\n                 & \"'' AND Formularname = ''\" & strFormularname & \"''\")\r\n             Me!cboFormularfilter.Requery\r\n             Me!cboFormularfilter = lngFilterID\r\n         <span style=\"color:blue;\">End If<\/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 1: Speichern eines benutzerdefinierten Filters<\/span><\/b><\/p>\n<p>Hat <b>strFilter <\/b>danach die L&auml;nge <b>0<\/b>, war offensichtlich kein Filter aktiviert und die Prozedur wird mit einer entsprechenden Meldung abgebrochen. Eine Variable namens <b>bolGespeichert <\/b>wird auf <b>True <\/b>eingestellt &#8211; hat diese am Ende der Prozedur auch noch diesen Wert, wurde erfolgreich gespeichert und es k&ouml;nnen die zur Anpassung der Benutzeroberfl&auml;che n&ouml;tigen Schritte durchgef&uuml;hrt werden.<\/p>\n<p>Nun fragt die Prozedur per <b>InputBox <\/b>die Bezeichnung f&uuml;r den neuen Filter ab und speichert diese in der Variablen <b>strBezeichnung<\/b>. Au&szlig;erdem landet noch der Name des aktuellen Formulars in der Variablen <b>strFormularname<\/b>. Hat der Benutzer keinen Wert in die <b>InputBox <\/b>eingegeben oder die <b>Abbrechen<\/b>-Schaltfl&auml;che bet&auml;tigt, ist die L&auml;nge der Zeichenkette in der Variablen <b>strBezeichnung <\/b>gleich <b>0<\/b>. In diesem Fall endet die Prozedur ebenfalls. Anderenfalls holt die Prozedur einen Verweis auf das aktuelle <b>Database<\/b>-Objekt in die Variable <b>db<\/b> und deaktiviert die Fehlerbehandlung. Dies hat den Sinn, dass beim nachfolgenden Versuch, die aktuelle Kombination aus Bezeichnung und Formularname samt Filterausdruck in der Tabelle <b>tblFormularfilter <\/b>zu speichern, ein Fehler auftreten k&ouml;nnte &#8211; und zwar, wenn bereits ein Filter mit der angegebenen Bezeichnung f&uuml;r dieses Formular gespeichert wurde. In diesem Fall liefert <b>Err.Number <\/b>in der folgenden <b>If&#8230;Then<\/b>-Bedingung den Wert <b>3022<\/b>, was zum Ausf&uuml;hren des <b>Then<\/b>-Teils dieser Bedingung f&uuml;hrt. Hier fragt die Prozedur den Benutzer, ob er den bereits vorhandenen Filter mit dieser Bezeichnung &uuml;berschreiben m&ouml;chte. Falls ja, f&uuml;hrt die Prozedur per <b>Execute<\/b>-Methode eine entsprechende <b>UPDATE<\/b>-Anweisung aus und aktualisiert den Datensatz mit dem neuen Filterausdruck. W&uuml;nscht der Benutzer dies nicht, wurde nichts ge&auml;ndert und <b>bolGespeichert <\/b>erh&auml;lt den Wert <b>False<\/b>.<\/p>\n<p>Hat <b>bolGespeichert <\/b>hier den Wert <b>True<\/b>, wollen wir noch daf&uuml;r sorgen, dass der frisch angelegte (oder ge&auml;nderte) Filterausdruck auch gleich im Kombinationsfeld angezeigt wird. Dazu ermitteln wir per <b>DLookup<\/b>-Funktion den Prim&auml;rschl&uuml;sselwert zu dem Datensatz mit der Bezeichnung und dem Formularnamen und legen diesen in der Variablen <b>lngFilterID <\/b>ab. Danach aktualisieren wir die Datensatzherkunft des Kombinationsfeldes und stellen dieses auf die soeben ermittelte ID ein &#8211; wie etwa in Bild 11 zu sehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_011.png\" alt=\"Ein frisch angelegter Filter\" width=\"700\" height=\"158,446\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Ein frisch angelegter Filter<\/span><\/b><\/p>\n<h2>Filter verwalten<\/h2>\n<p>Mit der Zeit sammeln sich so einige Filter in der Tabelle <b>strFormularfilter<\/b> an (s. Bild 12). Diese soll der Benutzer nat&uuml;rlich auch verwalten k&ouml;nnen &#8211; allein, um nicht mehr ben&ouml;tigte Filter auszusortieren oder Filter umzubenennen und so neu zu strukturieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_012.png\" alt=\"Filtersammlung\" width=\"649,559\" height=\"233,8742\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Filtersammlung<\/span><\/b><\/p>\n<p>Dazu f&uuml;gen wir dem Formular <b>frmKundenfilter<\/b> eine weitere Schaltfl&auml;che namens <b>cmdFilterBearbeiten <\/b>hinzu, welche die folgende Ereignisprozedur ausl&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFilterBearbeiten_Click()\r\n     DoCmd.OpenForm \"frmFormularfilter\", OpenArgs:=Nz(Me.cboFormularfilter, 0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Entwurf des Formulars <b>frmFormularfilter <\/b>sieht wie in Bild 13 aus. Er besteht aus einem Hauptformular mit zwei Textfeldern namens <b>txtSucheBezeichnung <\/b>und <b>txtSucheFilter<\/b>, in die der Benutzer Filterausdr&uuml;cke f&uuml;r die Felder <b>Bezeichnung<\/b> und <b>Filter <\/b>eingeben kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_014.png\" alt=\"Formular zum Verwalten der Filter in der Entwurfsansicht\" width=\"549,6265\" height=\"371,4236\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Formular zum Verwalten der Filter in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Au&szlig;erdem finden Sie dort eine Schaltfl&auml;che namens <b>cmdFilterLeeren<\/b>, welche die zuvor genannten Textfelder leert und auch den Filter f&uuml;r das Unterformular zur&uuml;cksetzt.<\/p>\n<p>Das Unterformular hei&szlig;t <b>sfmFormularfilter <\/b>und verwendet die Tabelle <b>tblFormularfilter <\/b>als Datenherkunft. Es zeigt alle Felder der Tabelle in der Datenblattansicht an.<\/p>\n<p>Die beiden Textfelder zum Filtern der Datens&auml;tze des Unterformulars erwarten die Eingabe des Benutzers und filtern das Unterformular nach jedem getippten Zeichen neu, damit der Benutzer immer direkt das aktuelle Ergebnis sieht.<\/p>\n<p>Zu diesem Zweck finden Sie im Kopf des Klassenmoduls zu diesem Formular die Deklaration zweier Variablen zum Aufnehmen des jeweils aktuellen Textes der beiden Textfelder:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strSucheBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strSucheFilter<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Wenn der Benutzer nun etwa ein Zeichen in das Textfeld <b>txtSucheBezeichnung <\/b>eintippt, l&ouml;st er das Ereignis <b>Bei &auml;nderung <\/b>aus. Daf&uuml;r haben wir die Ereignisprozedur <b>txtSucheBezeichnung_Change <\/b>hinterlegt, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSucheBezeichnung_Change()\r\n     strSucheBezeichnung = Me!txtSucheBezeichnung.Text\r\n     Suchen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier ermitteln wir &uuml;ber die Eigenschaft <b>Text <\/b>des Textfeldes <b>txtSucheBezeichnung <\/b>den aktuellen Inhalt dieses Textfeldes und tragen ihn in die Variable <b>strSucheBezeichnung <\/b>ein. Warum <b>Text <\/b>und nicht einfach <b>Value<\/b> Weil <b>Value <\/b>sich erst nach dem Abschlie&szlig;en der Eingabe etwa durch Verlassen des Textfeldes &auml;ndert und wir so nicht nach der Eingabe eines jeden Zeichens neu filtern k&ouml;nnen. Nach dem Speichern des Vergleichswertes ruft die Prozedur die Routine <b>Suchen <\/b>auf, die wir gleich im Anschluss erl&auml;utern.<\/p>\n<p>Zuvor noch ein Blick auf die entsprechende Ereignisprozedur f&uuml;r das Textfeld <b>txtSucheFilter<\/b>. Diese ist analog aufgebaut wie <b>txtBezeichnungFilter_Change<\/b> und speichert den aktuellen Text des Textfeldes in der Variablen <b>strSucheFilter<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSucheFilter_Change()\r\n     strSucheFilter = Me!txtSucheFilter.Text\r\n     Suchen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Warum aber speichern wir die Inhalte der Text-Eigenschaft jeweils in lokalen Variablen, bevor wir die <b>Suchen<\/b>-Funktion aufrufen Wir k&ouml;nnten doch auch von der Suchen-Funktion auf die entsprechenden Werte der Textfelder zugreifen Leider nein: Auf die <b>Text<\/b>-Eigenschaft kann man nur zugreifen, wenn das jeweilige Textfeld gerade den Fokus besitzt. Wir m&uuml;ssten also in der Routine zum Suchen erst noch den Fokus verschieben, was zu unn&ouml;tigen Komplikationen f&uuml;hrt. Da speichern wir die aktuellen Werte doch lieber schnell in zwei Variablen.<\/p>\n<p>Beide Prozeduren rufen danach die Routine <b>Suchen<\/b> auf, die wir in Listing 2 abgebildet haben. Diese pr&uuml;ft zun&auml;chst, ob <b>strSucheBezeichnung <\/b>eine Zeichenkette mit mehr als <b>0 <\/b>Zeichen enth&auml;lt. In diesem Fall f&uuml;gt sie zur Variablen <b>strSuchausdruck <\/b>einen Teil hinzu, der beispielsweise so aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Suchen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchausdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSucheBezeichnung) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSuchausdruck = strSuchausdruck & \" AND Bezeichnung LIKE ''*\" & strSucheBezeichnung & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSucheFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSuchausdruck = strSuchausdruck & \" AND Filter LIKE ''*\" & strSucheFilter & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSuchausdruck) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSuchausdruck = <span style=\"color:blue;\">Mid<\/span>(strSuchausdruck, 6)\r\n         Me!sfmFormularfilter.Form.Filter = strSuchausdruck\r\n         Me!sfmFormularfilter.Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmFormularfilter.Form.Filter = \"\"\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 2: Durchsuchen der Filter nach verschiedenen Kriterien<\/span><\/b><\/p>\n<pre>  AND Bezeichnung LIKE ''*Liefer*''<\/pre>\n<p>Das Gleiche geschieht danach f&uuml;r die <b>String<\/b>-Variable <b>strSucheFilter<\/b>. Wenn beide Textfelder bereits einen Wert enthalten, sind auch die beiden <b>String<\/b>-Variablen gef&uuml;llt, wodurch dann zwei Ausdr&uuml;cke in der Variablen <b>strSuchausdruck <\/b>zusammengef&uuml;hrt werden.<\/p>\n<p>Hat <b>strSuchausdruck <\/b>danach also einen Inhalt mit der L&auml;nge gr&ouml;&szlig;er <b>0<\/b>, wird das f&uuml;hrende <b>AND <\/b>vorn im Suchausdruck mit der <b>Mid<\/b>-Funktion abgeschnitten. Dann landet der Suchausdruck in der Eigenschaft <b>Filter <\/b>des <b>Form<\/b>-Objekts des Unterformular-Steuerelements und der Filter wird mit <b>FilterOn = True <\/b>aktiviert. Sollte keine der beiden Variablen <b>strSucheBezeichnung <\/b>und <b>strSucheFilter <\/b>gef&uuml;llt sein, wird der Filter mit <b>Filter = &#8222;&#8220; <\/b>deaktiviert.<\/p>\n<p>Das Ergebnis sieht dann etwa wie in Bild 14 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1087_013.png\" alt=\"Formular zum Verwalten in der Formularansicht\" width=\"700\" height=\"236,9012\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Formular zum Verwalten in der Formularansicht<\/span><\/b><\/p>\n<p>Nun haben wir auch diesem Formular eine Schaltfl&auml;che namens <b>cmdFilterLeeren<\/b> hinzugef&uuml;gt, welche beim Anklicken die folgende Prozedur ausl&ouml;sen soll:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFilterLeeren_Click()\r\n     Me!txtSucheBezeichnung = Null\r\n     Me!txtSucheFilter = Null\r\n     strSucheBezeichnung = \"\"\r\n     strSucheFilter = \"\"\r\n     Suchen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit werden zun&auml;chst die beiden Textfelder <b>txtSucheBezeichnung <\/b>und <b>txtSucheFilter <\/b>geleert und danach die entsprechenden String-Variablen. Der anschlie&szlig;ende Aufruf der <b>Suchen<\/b>-Routine sorgt dann daf&uuml;r, dass das Unterformular wieder alle Datens&auml;tze anzeigt.<\/p>\n<h2>Filter f&uuml;r alle oder nur f&uuml;r Formulare<\/h2>\n<p>Wir m&uuml;ssen nun noch entscheiden, ob das Formular zur Verwaltung der Formularfilter immer alle Datens&auml;tze f&uuml;r die aktuelle Datenbank anzeigen soll oder ob der Benutzer nur die Datens&auml;tze sehen soll, die sich auf das Formular beziehen, von dem aus er das Formlar zur Filterverwaltung aufgerufen hat. Letzteres scheint logischer zu sein, denn wieso sollte man Filter verwalten, die sich auf mehrere Formulare beziehen<\/p>\n<p>Also stellen wir das Formular so ein, dass das Unterformular gleich zu Beginn nur die Filter zum aktuellen Formular anzeigt. Dazu leeren wir einfach die Eigenschaft <b>Datenherkunft <\/b>des Formulars und weisen beim Laden des Formulars eine entsprechend gefilterte Datenherkunft zu. Warum auf diesem Wege und nicht durch Anpassen des Filterausdrucks Weil wir dann mit den anderen per Textfeld zu setzenden Filtern durcheinander kommen.<\/p>\n<p>Also verwenden wir beim Laden des Formulars die Ereignisprozedur aus Listing 3. Diese ermittelt mit <b>Screen.ActiveForm.Name <\/b>den Namen des aufrufenden Formulars und stellt eine <b>Recordsource <\/b>zusammen, welche die Tabelle <b>tblFormularfilter <\/b>nach diesem Formular filtert. Dann nutzen wir noch die beim Aufruf des Formulars per &ouml;ffnungsargument &uuml;bergebene ID des aktuell im Kombinationsfeld zur Auswahl des Filters ausgew&auml;hlten Filter. Sofern ein solcher markiert ist, wird der Datensatzzeiger des Unterformulars gleich auf diesen Eintrag eingestellt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>lngFilterID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRecordsource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFormularname<span style=\"color:blue;\"> As String<\/span>\r\n     lngFilterID = Me.OpenArgs\r\n     strFormularname = Screen.ActiveForm.Name\r\n     strRecordsource = \"SELECT * FROM tblFormularfilter WHERE Formularname = ''\" & strFormularname & \"''\"\r\n     Me!sfmFormularfilter.Form.RecordSource = strRecordsource\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngFilterID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!sfmFormularfilter.Form.Recordset.FindFirst \"FilterID = \" & lngFilterID\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: Beim Laden der Filterverwaltung<\/span><\/b><\/p>\n<p>Der Benutzer kann seine Filterausdr&uuml;cke nun komfortabel mit diesem Formular bearbeiten, neue Filter hinzuf&uuml;gen und nicht mehr ben&ouml;tigte Filter l&ouml;schen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VereinfachteFilter.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/34A34BA1-1110-410C-998F-0F7D6A8B8103\/aiu_1087.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Benutzer einer Access-Datenbank will sich nicht damit besch&auml;ftigen, Where-Ausdr&uuml;cke zu definieren, mit denen er die Daten seiner Datenbank filtern kann. Er braucht aussagekr&auml;ftige Bezeichnungen, mit denen er die gew&uuml;nschten Daten erh&auml;lt &#8211; am besten mit nicht viel mehr als einem Mausklick. Das ist eine sch&ouml;ne Aufgabe: Also statten wir unsere Anwendung mit einer solchen M&ouml;glichkeit aus, die der Benutzer sogar noch mit selbst angewendeten Filterkriterien anreichern kann. Und das, ohne auch nur einen Hauch von SQL zu k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662017,66032017,44000023],"tags":[],"class_list":["post-55001087","post","type-post","status-publish","format-standard","hentry","category-662017","category-66032017","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Filter speichern und wieder abrufen - 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\/Filter_speichern_und_wieder_abrufen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filter speichern und wieder abrufen\" \/>\n<meta property=\"og:description\" content=\"Der Benutzer einer Access-Datenbank will sich nicht damit besch&auml;ftigen, Where-Ausdr&uuml;cke zu definieren, mit denen er die Daten seiner Datenbank filtern kann. Er braucht aussagekr&auml;ftige Bezeichnungen, mit denen er die gew&uuml;nschten Daten erh&auml;lt - am besten mit nicht viel mehr als einem Mausklick. Das ist eine sch&ouml;ne Aufgabe: Also statten wir unsere Anwendung mit einer solchen M&ouml;glichkeit aus, die der Benutzer sogar noch mit selbst angewendeten Filterkriterien anreichern kann. Und das, ohne auch nur einen Hauch von SQL zu k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:42:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Filter speichern und wieder abrufen\",\"datePublished\":\"2020-05-14T13:42:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/\"},\"wordCount\":2758,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/541794e608374f669b56652d000dcf27\",\"articleSection\":[\"2017\",\"3\\\/2017\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/\",\"name\":\"Filter speichern und wieder abrufen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/541794e608374f669b56652d000dcf27\",\"datePublished\":\"2020-05-14T13:42:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/541794e608374f669b56652d000dcf27\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/541794e608374f669b56652d000dcf27\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filter_speichern_und_wieder_abrufen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Filter speichern und wieder abrufen\"}]},{\"@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":"Filter speichern und wieder abrufen - 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\/Filter_speichern_und_wieder_abrufen\/","og_locale":"de_DE","og_type":"article","og_title":"Filter speichern und wieder abrufen","og_description":"Der Benutzer einer Access-Datenbank will sich nicht damit besch&auml;ftigen, Where-Ausdr&uuml;cke zu definieren, mit denen er die Daten seiner Datenbank filtern kann. Er braucht aussagekr&auml;ftige Bezeichnungen, mit denen er die gew&uuml;nschten Daten erh&auml;lt - am besten mit nicht viel mehr als einem Mausklick. Das ist eine sch&ouml;ne Aufgabe: Also statten wir unsere Anwendung mit einer solchen M&ouml;glichkeit aus, die der Benutzer sogar noch mit selbst angewendeten Filterkriterien anreichern kann. Und das, ohne auch nur einen Hauch von SQL zu k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:42:39+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Filter speichern und wieder abrufen","datePublished":"2020-05-14T13:42:39+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/"},"wordCount":2758,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27","articleSection":["2017","3\/2017","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/","url":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/","name":"Filter speichern und wieder abrufen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27","datePublished":"2020-05-14T13:42:39+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/541794e608374f669b56652d000dcf27"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Filter_speichern_und_wieder_abrufen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Filter speichern und wieder abrufen"}]},{"@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\/55001087","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=55001087"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001087\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}