{"id":55001015,"date":"2015-12-01T00:00:00","date_gmt":"2020-05-22T19:09:15","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1015"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Filterbedingungen_einfach_zusammenstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/","title":{"rendered":"Filterbedingungen einfach zusammenstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Erstellen Sie in Ihren Anwendungen mit VBA Filterausdr&uuml;cke, um Formulare zu filtern oder Recordsets mit einer gefilterten Datenherkunft zu &ouml;ffnen Sind Ihnen dabei schon Fehler passiert, weil Sie die Werte nicht richtig konvertiert haben Oder finden Sie den Code zum Filtern zu aufwendig und suchen eine M&ouml;glichkeit, die Erstellung des Filtertextes zu vereinfachen Im vorliegenden Beitrag werden Sie verfolgen, wie eine Code-Struktur entsteht, die alle notwendigen Konvertierungsregeln ber&uuml;cksichtigt und trotzdem in der Anwendung &uuml;bersichtlich ist und Programmierfehler vermeidet.<\/b><\/p>\n<h2>Problemstellung<\/h2>\n<p>In Access-Anwendungen wird relativ oft mittels VBA ein Filterausdruck zusammengestellt. Typische Beispiele sind:<\/p>\n<ul>\n<li>SQL-Anweisung zum &ouml;ffnen eines Recordset (<b>Currentdb.OpenRecordset <\/b>und &auml;hnliche)<\/li>\n<li><b>WHERE<\/b>-Parameter von <b>DoCmd.OpenForm <\/b>oder <b>DoCmd.OpenReport<\/b><\/li>\n<li>Setzen der <b>Filter<\/b>-Eigenschaft in Formularen<\/li>\n<\/ul>\n<p>Beim Zusammensetzen der SQL-Texte werden &#8211; wie Sie in vielen Beitr&auml;gen in Foren lesen k&ouml;nnen &#8211; regelm&auml;&szlig;ig Fehler gemacht. Es wird der Datentyp nicht SQL-konform in Text konvertiert, m&ouml;gliche Null-Werte werden &uuml;bersehen, statt dem Variableninhalt wird der Variablenname in den SQL-Ausdruck &uuml;bernommen und so weiter. Damit Ihnen diese Fehler nicht passieren, beschreiben wir zuerst die Grundlagen f&uuml;r das Zusammenstellen von SQL-Anweisungen in VBA. Anschlie&szlig;end erstellen wir einen Code (in Form von Klassen), der die richtige Syntax f&uuml;r Sie erzeugt. Sie m&uuml;ssen den Klassen in Ihren Anwendungen nur noch Ihr Vorhaben mittels VBA-Anweisung mitteilen, um den gew&uuml;nschten Filterausdruck zu erstellen.<\/p>\n<h2>Syntax in Abh&auml;ngigkeit vom Datentyp<\/h2>\n<p>Bei der Konvertierung von Filterwerten in einen SQL-Text m&uuml;ssen Sie jeden Datentyp passend f&uuml;r das verwendete Datenbanksystem konvertieren. Die folgenden Abs&auml;tze beschreiben dies f&uuml;r die relevanten Datentypen.<\/p>\n<h2>Text<\/h2>\n<p>Ein Text muss mit Hochkommata (<b>&#8220;<\/b>) umschlossen werden. Je nach Datenbanksystem sind auch Anf&uuml;hrungszeichen (&#8222;) oder &auml;hnliches m&ouml;glich. Im weiteren Text werden wir zur Vereinfachung von Access\/Jet-SQL f&uuml;r DAO ausgehen.<\/p>\n<p>Beispiele:<\/p>\n<pre>... WHERE Textfeld = ''Filtertext''\r\n... WHERE Textfeld LIKE ''Filtertext*''<\/pre>\n<p>Wenn im zu filternden Text ein Hochkomma (<b>&#8220;<\/b>) enthalten ist (Beispiel: <b>O&#8220;Neill<\/b>), muss das Zeichen verdoppelt werden, damit der SQL-Interpreter erkennen kann, dass der Text noch nicht zu Ende ist. Aus dem Ausdruck<\/p>\n<pre>... WHERE Textfeld = ''O''Neill''<\/pre>\n<p>wird dann der folgende Ausdruck (mit <b>O&#8220;&#8220;Neill<\/b>):<\/p>\n<pre>... WHERE Textfeld = ''O''''Neill'' <\/pre>\n<h2>Zahlen<\/h2>\n<p>Zahlen sind in englischer Schreibweise mit Punkt als Dezimaltrennzeichen zu verwenden.<\/p>\n<pre>... WHERE Zahlfeld = 1.23<\/pre>\n<h2>Datum<\/h2>\n<p>Datumswerte sind im SQL-Text f&uuml;r Jet-SQL mit dem Raute-Zeichen (<b>#<\/b>) zu umschlie&szlig;en. Die Reihenfolge f&uuml;r Tag, Monat und Jahr muss in amerikanischer Schreibweise (<b>mm\/dd\/yyyy<\/b>) oder im ISO-Format (<b>yyyy-mm-dd<\/b>) erfolgen. Die erforderlichen Datumsformate sehen je nach Datenbanksystem unterschiedlich aus. Beispiele f&uuml;r Jet-SQL:<\/p>\n<pre>... WHERE Datumsfeld = #12\/24\/2015#\r\n... WHERE Datumsfeld = #2015-12-24#\r\n... WHERE Datumsfeld = #2015-12-24 16:30:00#<\/pre>\n<p>T-SQL (SQL-Server):<\/p>\n<pre>... WHERE Datumsfeld = ''20151224''\r\n... WHERE Datumsfeld = ''20151224 16:30:00''<\/pre>\n<h2>Ja\/Nein (Boolean)<\/h2>\n<p>In Access-Datenbanken wird <b>True <\/b>als <b>-1 <\/b>in Zahlenschreibweise verwendet. Der SQL-Server (T-SQL) betrachtet <b>1 <\/b>als <b>True <\/b>bei Bit-Datenfeldern. Im SQL-Text einer Access-Abfrage beziehungsweise DAO-Recordset und &auml;hnlichen ist die Angabe von <b>True <\/b>statt <b>-1 <\/b>zu empfehlen.<\/p>\n<p>Dann gibt es auch bei Abfragen auf &uuml;ber ODBC verkn&uuml;pfte SQL-Server-Tabellen keine Probleme.<\/p>\n<pre>... WHERE JaNeinFeld = <span style=\"color:blue;\">True<\/span><\/pre>\n<h2>Stolperfallen<\/h2>\n<p>Beim Zusammensetzen eines SQL-Textes entstehen die meisten Fehler beim Einbinden von Werten aus Variablen oder Steuerelementen in den SQL-Text.<\/p>\n<ul>\n<li>Die Konvertierung der Variablenwerte in einen SQL-Ausdruck wird nicht beziehungsweise falsch durchgef&uuml;hrt.<\/li>\n<li>Verdoppeln des Begrenzungszeichens vom Text (meist &#8220;) wird &uuml;bersehen, falls das Zeichen im Text enthalten ist. <\/li>\n<li>Wenn die Zusammenstellung des SQL-Textes &uuml;ber mehrere VBA-Zeilen erfolgt, werden notwendige Leerzeichen &uuml;bersehen.<\/li>\n<\/ul>\n<p>Diese Stolperfallen k&ouml;nnen Sie problemlos vermeiden, wenn Sie die Vorgehensweise f&uuml;r das Zusammenstellen eines SQL-Textes verinnerlichen und die f&uuml;r Ihr Datenbanksystem g&uuml;ltige SQL-Syntax kennen.<\/p>\n<h2>Vom statischen Text zum dynamisch aus Werten in Steuerelementen erstellten Text<\/h2>\n<p>Wenn Sie nicht sicher sind, wie ein SQL-Text mit Filterwerten aus Steuerelementen oder Variablen zusammengesetzt wird, versuchen Sie die Erstellung in umgekehrter Reihenfolge anzugehen.<\/p>\n<p>Nehmen Sie zum Ausprobieren der SQL-Anweisungen einen fixen Filterwert (welcher sp&auml;ter etwa durch eine Benutzereingabe &uuml;bergeben wird) an und erstellen im Access-Abfrageeditor eine SQL-Anweisung. Die Funktionsf&auml;higkeit dieser SQL-Anweisung testen Sie nun. Wenn die Abfrage das erwartete Ergebnis liefert, wissen Sie, dass diese SQL-Anweisung passt.<\/p>\n<p>Beispiel:<\/p>\n<pre>SELECT * FROM tabTest WHERE Textfeld LIKE ''abc*''<\/pre>\n<h2>Stufe 1: Vollst&auml;ndiger SQL-Text in Variable<\/h2>\n<p>Nun kopieren Sie diese SQL-Anweisung und speichern sie in einer <b>String<\/b>-Variable in einer Test-Prozedur, wie in Listing 1 gezeigt, ab.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe1()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    SqlText = \"SELECT * FROM tabTest WHERE Textfeld LIKE ''abc*''\"\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: VBA-Ausbaustufe 1<\/span><\/b><\/p>\n<p>Zum &ouml;ffnen eines Recordsets mit dem in VBA gespeicherten SQL-Text und zur Ausgabe der enthaltenen Datens&auml;tze in den Direktbereich verwenden wir die Hilfsprozedur aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlAnweisungAuswerten(ByVal SqlText<span style=\"color:blue;\"> As String<\/span>)\r\n    <span style=\"color:blue;\">Debug.Print<\/span> \"SQL: \"; SqlText\r\n    <span style=\"color:blue;\">With<\/span> CurrentDb.OpenRecordset(SlText)\r\n       <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> .EOF\r\n          <span style=\"color:blue;\">Debug.Print<\/span> \"ID: \"; .Fields(\"idTest\"), _\r\n                      \"Textfeld: \"; .Fields(\"Textfeld\")\r\n          .Move<span style=\"color:blue;\">Next<\/span>\r\n       <span style=\"color:blue;\">Loop<\/span>\r\n       .Close\r\n    End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hilfsprozedur zum Auswerten einer SQL-Anweisung<\/span><\/b><\/p>\n<h2>Stufe 2: Filterausdruck als extra String verketten<\/h2>\n<p>Im n&auml;chsten Ausbauschritt (s. Listing 3) trennen wir den Filterausdruck von der restlichen SQL-Anweisung (<b>SqlText_VBA_Stufe2a<\/b>). Desweiteren speichern wir den Filterausdruck in einer zus&auml;tzlichen Variablen ab und verketten diese Variable mit dem restlichen SQL-Ausdruck (<b>SqlText_VBA_Stufe2b<\/b>). Zus&auml;tzlich zur Variable f&uuml;r den gesamten Filterausdruck k&ouml;nnen wir den Filterwert (im SQL-Format) in einer Stringvariable speichern (<b>SqlText_VBA_Stufe2c<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe2a()\r\n     <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n     SqlText = \"SELECT * FROM tabTest WHERE \" & \"Textfeld LIKE ''abc*''\"\r\n     <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe2b()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n    SqlFilter = \"Textfeld LIKE ''abc*''\"\r\n    SqlText = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe2c()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>WertImSqlFormat<span style=\"color:blue;\"> As String<\/span>\r\n    WertImSqlFormat = \"''abc*''\"\r\n    SqlFilter = \"Textfeld LIKE \" & FilterWertImSqlFormat\r\n    SqlText = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: VBA-Ausbaustufe 2<\/span><\/b><\/p>\n<h2>Stufe 3: Filterwerte in passenden SQL-Text konvertieren<\/h2>\n<p>In den obigen Beispielen wurde der SQL-Text f&uuml;r den Filterwert im passenden SQL-Format in der Variable gespeichert.<\/p>\n<p>&uuml;blicherweise muss der Filterwert in SQL-Text konvertiert werden, weil die Werte zum Beispiel aus Steuerelementen in Formularen oder aus VBA-Variablen kommen, die nur den Wert und nicht dessen SQL-Ausdruck enthalten.<\/p>\n<p>Ablauf des Codes in Listing 4: Aus dem String <b>abc* <\/b>soll der SQL-Ausdruck <b>&#8220;abc*&#8220; <\/b>entstehen. Dazu werden die Hochkommata (<b>&#8220;<\/b>) mit dem Filterwert verkettet (<b>&#8222;&#8220;&#8220; &#038; &#8222;abc*&#8220; &#038; &#8222;&#8220;&#8220;<\/b>). Von den anfangs genannten Regeln wissen wir, dass die im Filterwert enthaltenen Hochkommata verdoppelt werden m&uuml;ssen. Das erledigt die <b>Replace<\/b>-Funktion.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe3()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>WertImSqlFormat<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>FilterWert<span style=\"color:blue;\"> As String<\/span>\r\n    FilterWert = \"abc*\"\r\n    WertImSqlFormat = \"''\" & <span style=\"color:blue;\">Replace<\/span>(FilterWert, \"''\", \"''''\") & \"''\"\r\n    SqlFilter = \"Textfeld LIKE \" & WertImSqlFormat\r\n    SqlText = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: VBA-Ausbaustufe 3<\/span><\/b><\/p>\n<p>Bei anderen Datentypen k&ouml;nnen Sie die gleiche Vorgehensweise anwenden.<\/p>\n<p>Sie m&uuml;ssen nur die Zeile <b>WertimSqlFormat = &#8230; <\/b>entsprechend anpassen, damit der Filterwert in das passende SQL-Format konvertiert wird.<\/p>\n<p>M&ouml;glicher Umwandlungscode f&uuml;r Text:<\/p>\n<pre>WertImSqlFormat = \"''\" & <span style=\"color:blue;\">Replace<\/span>(FilterWert, \"''\", \"''''\") & \"''\"<\/pre>\n<p>F&uuml;r Zahlen:<\/p>\n<pre>WertImSqlFormat = Str(FilterWert)<\/pre>\n<p>Die <b>Str<\/b>-Funktion nicht mit der <b>CStr<\/b>-Funktion verwechseln!<\/p>\n<p>F&uuml;r Datumsangaben:<\/p>\n<pre>WertImSqlFormat = Format(FilterWert, \"\\#yyyy-mm-dd\\#\")<\/pre>\n<p>F&uuml;r Ja\/Nein-Felder (<b>Boolean<\/b>):<\/p>\n<pre>WertImSqlFormat = IIf(FilterWert = True, \"True\", \"False\")<\/pre>\n<h2>Stufe 4: Filter kombinieren<\/h2>\n<p>Im n&auml;chsten Code-Beispiel (s. Listing 5) erstellen wir SQL-Filtertexte f&uuml;r verschiedene Datentypen und f&uuml;gen sie zu einem kombinierten Filterausdruck zusammen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe4()\r\n     <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>    \r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilterAusdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>WertImSqlFormat<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>TextWert<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>DoubleWert<span style=\"color:blue;\"> As Double<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>DatumsWert<span style=\"color:blue;\"> As Date<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>BooleanWert<span style=\"color:blue;\"> As Boolean<\/span>\r\n     ''Text\r\n     TextWert = \"abc*\"\r\n     WertImSqlFormat = \"''\" & <span style=\"color:blue;\">Replace<\/span>(TextWert, \"''\", \"''''\") & \"''\"\r\n     SqlFilterAusdruck = \"Textfeld LIKE \" & WertImSqlFormat\r\n     SqlFilter = SqlFilterAusdruck\r\n     ''Zahlen\r\n     DoubleWert = 1.23\r\n     WertImSqlFormat = <span style=\"color:blue;\">Trim<\/span>(Str(DoubleWert))\r\n     SqlFilterAusdruck = \"DoubleZahlenfeld &gt; \" & WertImSqlFormat\r\n     SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n     ''Datum\r\n     DatumsWert = Date\r\n     WertImSqlFormat = Format(DatumsWert, \"\\#yyyy-mm-dd\\#\")\r\n     SqlFilterAusdruck = \"Datumsfeld &lt;= \" & WertImSqlFormat\r\n     SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n     ''Ja\/Nein (Boolean)\r\n     BooleanWert = <span style=\"color:blue;\">True<\/span>\r\n     WertImSqlFormat = IIf(BooleanWert = True, \"True\", \"False\")\r\n     SqlFilterAusdruck = \"JaNeinFeld = \" & WertImSqlFormat\r\n     SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n     ''gesamten SQL-Text zusammenstellen\r\n     SqlText = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n     <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: VBA-Ausbaustufe 4<\/span><\/b><\/p>\n<h2>Stufe 5: Filterwerte aus Formular-Steuerelementen<\/h2>\n<p>H&auml;ufig werden Formulare zum Filtern von Datenmengen verwendet. In diesen Formularen befinden sich Steuerelemente, in die der Anwender Werte eingeben kann. Wenn in einem Steuerelement ein Wert enthalten ist, sollen die Datens&auml;tze entsprechend gefiltert werden. Ist im Steuerelement kein Wert enthalten, soll dieser Filter ignoriert werden.<\/p>\n<p>Typisches Code-Ger&uuml;st im Formular-Modul mit den Filtersteuerelementen:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> Me.Steuerelement\r\n     If <span style=\"color:blue;\">Not<\/span> IsNull(.Value) then\r\n         '' Filterausdruck erstellen\r\n     <span style=\"color:blue;\">End If<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Im Code in Listing 6 werden die Werte aus den Formular-Steuerelementen auf vorhandene Filterwerte gepr&uuml;ft, aus den vorhandenen Eintr&auml;gen Filterausdr&uuml;cke erstellt und zu einem kombinierten Filterstring zusammengesetzt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe5()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilterAusdruck<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>WertImSqlFormat<span style=\"color:blue;\"> As String<\/span>\r\n    ''Text\r\n    <span style=\"color:blue;\">With<\/span> Me.txtTextFilter\r\n       <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(.Value) &gt; 0<span style=\"color:blue;\"> Then<\/span> '' Null und Leerstring ignorieren\r\n          WertImSqlFormat = \"''\" & <span style=\"color:blue;\">Replace<\/span>(.Value, \"''\", \"''''\") & \"''\"\r\n          SqlFilterAusdruck = \"Textfeld LIKE \" & WertImSqlFormat\r\n          SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n       <span style=\"color:blue;\">End If<\/span>\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    ''Zahlen\r\n    <span style=\"color:blue;\">With<\/span> Me.txtZahlenFilter\r\n       <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(.Value)<span style=\"color:blue;\"> Then<\/span>\r\n          WertImSqlFormat = <span style=\"color:blue;\">Trim<\/span>(Str(.Value))\r\n          SqlFilterAusdruck = \"DoubleZahlenfeld &gt; \" & WertImSqlFormat\r\n          SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n       <span style=\"color:blue;\">End If<\/span>\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    ''Datum\r\n    <span style=\"color:blue;\">With<\/span> Me.txtDatumsFilter\r\n       <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(.Value)<span style=\"color:blue;\"> Then<\/span>\r\n          WertImSqlFormat = Format(.Value, \"\\#yyyy-mm-dd\\#\")\r\n          SqlFilterAusdruck = \"Datumsfeld &lt;= \" & WertImSqlFormat\r\n          SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n       <span style=\"color:blue;\">End If<\/span>\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    ''Filterausdruck aufbereiten\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n       '' ersten \" And \"-Ausdruck wegschneiden\r\n       SqlFilter = <span style=\"color:blue;\">Mid<\/span>(SqlFilter, <span style=\"color:blue;\">Len<\/span>(\" And \") + 1)\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    ''gesamten SQL-Text zusammenstellen\r\n    SqlText = \"SELECT * FROM tabTest\"\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n       SqlText = SqlText & \" WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 6: VBA-Ausbaustufe 5<\/span><\/b><\/p>\n<p>Nach diesem Prinzip k&ouml;nnen Sie Ihre Filterbedingungen zusammenstellen. Einen Nachteil hat diese Vorgehensweise: Der Code wird bei mehreren Filter-Feldern schnell un&uuml;bersichtlich.<\/p>\n<p>Ein Refactoring dieses Codes f&uuml;hrt uns allerdings zu unserem Vorhaben, eine universell einsetzbare Code-Struktur zu gestalten, die statt dem Programmieren des Filtertextes ein Definieren der Filterbedingungen erlaubt und uns den fertigen SQL-Filtertext liefert.<\/p>\n<p>Zuvor sehen wir uns noch ein bereits in Access eingebautes Hilfsmittel zum Erzeugen eines Filterausdrucks an.<\/p>\n<h2>Hilfsfunktion Access.BuildCriteria<\/h2>\n<p>Die Methode <b>BuildCriteria <\/b>vom Access-Objekt erlaubt eine &uuml;bergabe der Filterwerte als String. Dabei m&uuml;ssen keine SQL-relevanten Zeichen zum Eingrenzen eines Textes oder Datums erg&auml;nzt werden. <b>BuildCriteria <\/b>erzeugt die Zeichen in Abh&auml;ngigkeit vom <b>FieldType<\/b>-Parameter selbst.<\/p>\n<p>Syntax: <b>BuildCriteria(Field, FieldType, Expression)<\/b><\/p>\n<p>Beispiele finden Sie in Listing 7.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BuildCriteriaBeispiele()\r\n    <span style=\"color:blue;\">Dim <\/span>SqlAnweisung<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n    ''Text\r\n    SqlFilter = BuildCriteria(\"Textfeld\", dbText, \"LIKE abc*\")\r\n    SqlAnweisung = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlAnweisung)\r\n    ''Zahlen\r\n    SqlFilter = BuildCriteria(\"DoubleZahlenfeld\", dbDouble, \"&gt; 1,23\")\r\n    SqlAnweisung = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlAnweisung)\r\n    ''Datum\r\n    SqlFilter = BuildCriteria(\"Datumsfeld\", dbDate, \"&lt;=\" & Date)\r\n    SqlAnweisung = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlAnweisung)\r\n    ''Ja\/Nein (Boolean)\r\n    SqlFilter = Access.BuildCriteria(\"JaNeinFeld\", dbBoolean, <span style=\"color:blue;\">True<\/span>)\r\n    SqlAnweisung = \"SELECT * FROM tabTest WHERE \" & SqlFilter\r\n    <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlAnweisung)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Einsatz von Access.BuildCriteria<\/span><\/b><\/p>\n<p>Ein Nachteil dieser Hilfsfunktion ist, dass die Funktion nur einen Filterausdruck f&uuml;r Jet\/DAO-SQL erzeugt. Falls Sie einen SQL-Text f&uuml;r den SQL-Server in T-SQL f&uuml;r eine Pass-Through-Abfrage ben&ouml;tigen, k&ouml;nnen Sie diese <b>BuildCriteria<\/b>-Funktion nicht verwenden. F&uuml;r unsere Klassenbibliothek k&ouml;nnen wir uns das Konzept dieser Funktion merken, um etwas &auml;hnliches zu erstellen.<\/p>\n<h2>Alternative zu dynamisch erzeugten SQL-Anweisungen<\/h2>\n<p>Wenn Sie auf das dynamische Erstellen von SQL-Anweisungen f&uuml;r Recordsets verzichten wollen, besteht die M&ouml;glichkeit, eine Parameterabfrage zu verwenden. Bei Parameterabfragen wird der Datentyp in der Parameter-Deklaration festgelegt und Sie m&uuml;ssen bei der &uuml;bergabe nicht auf die SQL-konforme Formatierung achten (s. Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Alternative_ParameterAbfrage()\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>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    ''1. Verwendung einer gespeicherten Abfrage\r\n    <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"ParameterAbfrageGrundlagenBeispiel\")\r\n    qdf.Parameters(\"TextFilter\").Value = \"abc*\"\r\n    qdf.Parameters(\"ZahlenFilter\").Value = 1.23\r\n    qdf.Parameters(\"DatumsFilter\").Value = Date\r\n    <span style=\"color:blue;\">Call<\/span> QueryDefAuswerten(qdf)\r\n    qdf.Close\r\n    ''2. Dynamische Parameterabfrage erstellen\r\n    <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n    SqlText = \"PARAMETERS TextFilter Text(255), ZahlenFilter Double,\" _\r\n        & \" DatumsFilter DateTime;\" _\r\n        & \" SELECT * FROM tabTest WHERE Textfeld LIKE [TextFilter]\" _\r\n        & \" AND DoubleZahlenfeld&gt;[ZahlenFilter] AND Datumsfeld&lt;=[DatumsFilter]\"\r\n    <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(\"\", SqlText)\r\n    qdf.Parameters(\"TextFilter\").Value = \"abc*\"\r\n    qdf.Parameters(\"ZahlenFilter\").Value = 1.23\r\n    qdf.Parameters(\"DatumsFilter\").Value = Date\r\n    <span style=\"color:blue;\">Call<\/span> QueryDefAuswerten(qdf)\r\n    qdf.Close\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Parameterabfrage<\/span><\/b><\/p>\n<p>Bei diesen Varianten ist sowohl der SQL-Code als auch die Wert&uuml;bergabe f&uuml;r die Filter in VBA relativ gut lesbar. F&uuml;r das Eintragen von Filterwerten in die Filter-Eigenschaft von Formularen m&uuml;ssen Sie trotzdem den Filterausdruck als Text &uuml;bergeben.<\/p>\n<h2>Refactoring<\/h2>\n<p>Im folgenden Abschnitt werden wir ein Refactoring vom Code der Prozedur <b>SqlText_VBA_Stufe5<\/b> durchf&uuml;hren und daraus Hilfsprozeduren und in weiterer Folge eine Klassenstruktur herausarbeiten (s. Listing 9).<\/p>\n<pre><span style=\"color:blue;\">With<\/span> Me.txtTextFilter\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(.Value) &gt; 0<span style=\"color:blue;\"> Then<\/span> '' Null und Leerstring ignorieren\r\n         WertImSqlFormat = \"''\" & <span style=\"color:blue;\">Replace<\/span>(.Value, \"''\", \"''''\") & \"''\"\r\n         SqlFilterAusdruck = \"Textfeld LIKE \" & WertImSqlFormat\r\n         SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n      <span style=\"color:blue;\">End If<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Auszug aus der Prozedur SqlText_VBA_Stufe5<\/span><\/b><\/p>\n<p>Die markierte Zeile zur Konvertierung der Filterwerte von einem bestimmten Datentyp in SQL-Text wird regelm&auml;&szlig;ig wiederholt und sollte daher in eine Prozedur ausgelagert werden. Wir wollen die Konvertierung f&uuml;r verschiedene SQL-Dialekte erstellen.<\/p>\n<p>Daher f&uuml;gen wir die Prozedur in die Klasse <b>SqlTools<\/b> ein, die verschiedene Hilfsmethoden zur Gestaltung von SQL-Text enthalten wird.<\/p>\n<h2>Filterwerte in SQL-Text konvertieren<\/h2>\n<p>Beispiel:<\/p>\n<pre>Filterwert = \"abc*\"\r\nWertImSqlFormat = SqlTools.TextToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; ''abc*''\r\nFilterwert = \"O''Neill\"\r\nWertImSqlFormat = SqlTools.TextToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; ''O''''Neill''<\/pre>\n<p>In Listing 10 sehen Sie die Umsetzung dieser Aufgabe mit der <b>SqlTools<\/b>-Methode <b>TextToSqlText<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>TextToSqlText(ByVal Value<span style=\"color:blue;\"> As Variant<\/span>, <span style=\"color:blue;\">Optional<\/span> ByVal Delimiter<span style=\"color:blue;\"> As String<\/span> = SQL_DEFAULT_TEXTDELIMITER, _\r\n         <span style=\"color:blue;\">Optional<\/span> ByVal WithoutLeftRightDelim<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>Result<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">If <\/span>IsNull(Value)<span style=\"color:blue;\"> Then<\/span>\r\n       TextToSqlText = ResultTextIfNull\r\n       <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    Result = Replace$(Value, Delimiter, Delimiter & Delimiter)\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> WithoutLeftRightDelim<span style=\"color:blue;\"> Then<\/span>\r\n       Result = Delimiter & Result & Delimiter\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    TextToSqlText = Result\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: SqlTools.TextToSqlText<\/span><\/b><\/p>\n<p>Die Parameter <b>Delimiter <\/b>und <b>With-out-LeftRightDelim <\/b>erm&ouml;glichen eine Anpassung des R&uuml;ckgabewertes. Falls vom Standard-Begrenzungszeichen, dem Hochkomma (<b>&#8220;<\/b>), abgewichen werden soll, kann das durch diesen Parameter ge&auml;ndert werden. Wenn Sie den R&uuml;ckgabewert ohne das linke und rechte Begrenzungszeichen ben&ouml;tigen, setzen Sie den Parameter <b>WithoutLeftRightDelim <\/b>auf <b>True<\/b>.<\/p>\n<p>F&uuml;r Datumsfelder, Zahlenfelder sowie Boolean-Felder erstellen wir ebenso eine Konvertierungsfunktion.<\/p>\n<p>Beispiele:<\/p>\n<pre>Filterwert = 1 \/ 2\r\nWertImSqlFormat = _\r\n     SqlTools.NumberToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; 0.5\r\nFilterwert = DateSerial(2015, 12, 24)\r\nWertImSqlFormat = SqlTools.DateToSqlText(Filterwert, _\r\n     \"\\#yyyy-mm-dd\\#\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; #2015-12-24#\r\nFilterwert = <span style=\"color:blue;\">True<\/span>\r\nWertImSqlFormat = _\r\n     SqlTools.BooleanToSqlText(Filterwert, \"True\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Bei den Methoden <b>DateToSqlText <\/b>und <b>BooleanToSqlText <\/b>werden Formatangaben als Parameter mitgegeben, um den zu erzeugenden SQL-Text an verschiedene SQL-Dialekte angepasst auszugeben.<\/p>\n<p>In der Praxis werden Sie nur wenige SQL-Dialekte in einer Anwendung ben&ouml;tigen, daher k&ouml;nnen Sie die ben&ouml;tigten Format-Angaben direkt an die <b>SqlTools <\/b>&uuml;bergeben und anschlie&szlig;end auf die <b>Format<\/b>-Parameter in den Konvertierungsfunktionen verzichten.<\/p>\n<pre><span style=\"color:blue;\">With<\/span> SqlTools\r\n    .SqlDateFormat = \"\\#yyyy-mm-dd\\#\"\r\n    .SqlBooleanTrueString = \"True\"\r\n    .SqlWildCardString = \"*\"\r\nEnd <span style=\"color:blue;\">With<\/span>\r\nFilterwert = DateSerial(2015, 12, 24)\r\nWertImSqlFormat = SqlTools.DateToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; #2015-12-24#\r\nFilterwert = <span style=\"color:blue;\">True<\/span>\r\nWertImSqlFormat = SqlTools.BooleanToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; <span style=\"color:blue;\">True<\/span> <\/pre>\n<p>Zur Vereinfachung in der Verwendung der SqlTools k&ouml;nnten Sie spezielle Factory-Funktionen einsetzen, die je SQL-Dialekt eine SqlTools-Instanz zur Verf&uuml;gung stellen. Diese Variante wird in den sp&auml;teren Beispielen verwendet werden.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>DaoSqlTools()<span style=\"color:blue;\"> As <\/span>SqlTools\r\n     <span style=\"color:blue;\">If <\/span>m_DaoSqlTools Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> m_DaoSqlTools = _\r\n             SqlTools.NewInstance(\"\\#yyyy-mm-dd\\#\", \"True\", \"*\")\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> DaoSqlTools = m_DaoSqlTools\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Damit erkennen Sie im Code sofort, welcher SQL-Dialekt &#8222;gesprochen&#8220; wird.<\/p>\n<pre>Filterwert = DateSerial(2015, 12, 24)\r\nWertImSqlFormat = DaoSqlTools.DateToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; #2015-12-24#\r\nWertImSqlFormat = TSqlTools.DateToSqlText(Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; ''20151224''<\/pre>\n<p>Wir k&ouml;nnen den Code noch weiter vereinheitlichen, wenn wir die Konvertierungsfunktionen in einer Funktion zusammenfassen. Damit die Funktion den ben&ouml;tigten Datentyp kennt, geben wir diesen als Parameterwert &uuml;ber eine <b>Enum<\/b>-Auswahl mit.<\/p>\n<pre>Filterwert = DateSerial(2015, 12, 24)\r\nWertImSqlFormat = _\r\n     DaoSqlTools.ConvertToSqlText(Filterwert, SQL_Date)\r\n<span style=\"color:blue;\">Debug.Print<\/span> WertImSqlFormat '' --&gt; #2015-12-24#<\/pre>\n<p><b>SQL_Date <\/b>ist ein Wert der Enumeration <b>SqlFieldDataType<\/b>, welche in der SqlTools-Klasse deklariert ist.<\/p>\n<p>Den angepassten Code der Prozedur <b>SqlText_VBA_Stufe5 <\/b>sehen Sie hier:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> Me.txtTextFilter\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(.Value) &gt; 0<span style=\"color:blue;\"> Then<\/span> '' Null und Leerstring ignorieren\r\n         WertImSqlFormat = _\r\n             DaoSqlTools.ConvertToSqlText(.Value, SQL_Text)\r\n         SqlFilterAusdruck = _\r\n             \"Textfeld LIKE \" & WertImSqlFormat\r\n         SqlFilter = SqlFilter _\r\n             & \" And \" & SqlFilterAusdruck\r\n     <span style=\"color:blue;\">End If<\/span>\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Wenn Sie den Code betrachten, ist zwar die Konvertierung nach SQL-Text etwas &uuml;bersichtlicher geworden, es werden aber immer noch mehrere Zeilen f&uuml;r ein einzelnes Kriterium ben&ouml;tigt. Nehmen wir uns nun die <b>BuildCriteria<\/b>-Funktion von Access als Beispiel und verk&uuml;rzen mit einer &auml;hnlichen Funktion die Erstellung des Filterausdrucks.<\/p>\n<h2>BuildCriteria-Methode<\/h2>\n<p>Die Methode <b>BuildCriteria <\/b>(s. Listing 11) aus der Klasse <b>SqlTools<\/b> erzeugt aus den Informationen der &uuml;bergebenen Parameterwerte einen Filterausdruck.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BuildCriteria(ByVal FieldName<span style=\"color:blue;\"> As String<\/span>, _\r\n         ByVal FieldDataType<span style=\"color:blue;\"> As <\/span>SqlFieldDataType, _\r\n         ByVal RelationalOperator<span style=\"color:blue;\"> As <\/span>SqlRelationalOperators, _\r\n         ByVal FilterValue<span style=\"color:blue;\"> As Variant<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> ByVal FilterValue2<span style=\"color:blue;\"> As Variant<\/span> = Null, _\r\n         <span style=\"color:blue;\">Optional<\/span> ByVal IgnoreValue<span style=\"color:blue;\"> As Variant<\/span> = Null)<span style=\"color:blue;\"> As String<\/span>\r\n     ...\r\n     Criteria = FieldName & \" \" & OperatorString & \" \" & FilterValueString\r\n     <span style=\"color:blue;\">If <\/span>(RelationalOperator And SQL_<span style=\"color:blue;\">Not<\/span>) = SQL_<span style=\"color:blue;\">Not<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        Criteria = \"<span style=\"color:blue;\">Not<\/span> \" & Criteria\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     BuildCriteria = Criteria\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: SqlTools.BuildCriteria<\/span><\/b><\/p>\n<p>Beispiel:<\/p>\n<pre>Filterwert = DateSerial(2015, 12, 24)\r\nFilterAusdruck = _\r\n     DaoSqlTools.BuildCriteria(\"Datumsfeld\", SQL_Date, _\r\n     SQL_LessThan + SQL_Equal, Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> FilterAusdruck '' --&gt; Datumsfeld &lt;= #2015-12-24#<\/pre>\n<p>Innerhalb der <b>BuildCriteria<\/b>-Funktion wird der Filterausdruck als Text zusammengesetzt. Dabei werden aus dem Parameter <b>RelationalOperator <\/b>die Vergleichszeichen ermittelt. Die Konvertierung des Filterwertes erfolgt wieder &uuml;ber die Konvertierungsfunktionen.<\/p>\n<p>Die <b>BuildCriteria<\/b>-Funktion ist eine Kernfunktion der <b>SqlTools <\/b>und allen davon abh&auml;ngigen Klassen. Neben der Konvertierung einzelner Filterwerte k&ouml;nnen an diese Funktion auch Werte in einem Array &uuml;bergeben werden, um ein <b>IN<\/b>-Statement zu erzeugen.<\/p>\n<pre>Filterwert = Array(1, 3, 5, 7)\r\nFilterAusdruck = DaoSqlTools.BuildCriteria(\"IntZahlenfeld\", _\r\n     SQL_Numeric, SQL_In, Filterwert)\r\n<span style=\"color:blue;\">Debug.Print<\/span> FilterAusdruck ''-&gt; IntZahlenfeld In (1, 3, 5, 7)<\/pre>\n<p>Nat&uuml;rlich k&ouml;nnen Sie auch einen <b>BETWEEN<\/b>-Ausdruck erzeugen:<\/p>\n<pre>FilterAusdruck = DaoSqlTools.BuildCriteria(\"IntZahlenfeld\", _\r\n     SQL_Numeric, SQL_Between, 1, 5)\r\n<span style=\"color:blue;\">Debug.Print<\/span> FilterAusdruck ''-&gt; IntZahlenfeld Between 1 And 5<\/pre>\n<p><b>BuildCriteria <\/b>bietet noch weitere Features zum Erzeugen von Filterausdr&uuml;cken an. Einige dieser M&ouml;glichkeiten werden wir im Praxisbeispiel sehen. <\/p>\n<p>Sehen wir uns nun den angepassten Code der Prozedur <b>SqlText_VBA_Stufe5<\/b> mit der <b>BuildCriteria<\/b>-Funktion aus der SqlTools-Klasse an (s. Listing 12).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe5_Mit_SqlToolsBuildCriteria()\r\n     <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilterAusdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">With<\/span> DaoSqlTools\r\n         ''Text\r\n         SqlFilterAusdruck = .BuildCriteria(\"Textfeld\", SQL_Text, SQL_LIKE, Me.txtTextFilter.Value)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilterAusdruck)&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n         End If \r\n         ''Zahlen\r\n         SqlFilterAusdruck = .BuildCriteria(\"DoubleZahlenfeld\", SQL_Numeric, SQL_GreaterThan, Me.txtZahlenFilter.Value)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilterAusdruck)&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         ''Datum\r\n         SqlFilterAusdruck = .BuildCriteria(\"Datumsfeld\", SQL_Date, SQL_Equal + SQL_LessThan, Me.txtDatumsFilter.Value)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilterAusdruck)&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\n         End If \r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ''Filterausdruck aufbereiten\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         ''ersten \" And \"-Ausdruck wegschneiden\r\n         SqlFilter = <span style=\"color:blue;\">Mid<\/span>(SqlFilter, <span style=\"color:blue;\">Len<\/span>(\" And \") + 1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ''gesamten SQL-Text zusammenstellen\r\n     SqlText = \"SELECT * FROM tabTest\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         SqlText = SqlText & \" WHERE \" & SqlFilter\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Code aus der Prozedur SqlText_VBA_Stufe5 mit SqlTools.BuildCriteria<\/span><\/b><\/p>\n<p>Dieser Code ist bereits &uuml;bersichtlicher als der urspr&uuml;ngliche Code. Allerdings ist das Zusammenf&uuml;gen der einzelnen Filterkriterien noch verbesserungsf&auml;hig.<\/p>\n<p>Im n&auml;chsten &uuml;berarbeitungsschritt werden wir daher das Zusammensetzen des Strings optimieren.<\/p>\n<h2>Hilfsklasse StringCollection<\/h2>\n<p>Wenn Sie den Code der Prozedur <b>SqlText_VBA_Stufe5_Mit_SqlToolsBuildCriteria<\/b> betrachten, wird Ihnen folgendes Prinzip auffallen: Die einzelnen Filterkriterien werden zu einem String mit dem SQL-Bindewort <b>AND<\/b> verkettet.<\/p>\n<p>Allerdings wird der Filterausdruck nur dann ber&uuml;cksichtigt, wenn der Filtertext kein Leerstring ist.<\/p>\n<p>Die folgenden Zeilen wiederholen sich bei jedem Filterkriterium:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilterAusdruck)&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     SqlFilter = SqlFilter & \" And \" & SqlFilterAusdruck\r\nEnd If <\/pre>\n<p>Die Aufgabe dieser Zeilen ist das Zusammenf&uuml;gen von Textbl&ouml;cken unter der Bedingung, dass keiner dieser Bl&ouml;cke leer ist.<\/p>\n<p>F&uuml;r diese Aufgabe erstellen wir die Klasse <b>StringCollection<\/b>.<\/p>\n<p>Anwendungsbeispiel:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> <span style=\"color:blue;\">New<\/span> StringCollection\r\n     .Add \"Feld1 LIKE ''abc*''\"\r\n     .Add \"\"\r\n     .Add \"Feld2 = 1.23\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> .ToString(Delimiter:=\" And \", _\r\n         IgnoreEmptyValue:=<span style=\"color:blue;\">True<\/span>)\r\n     '' --&gt; Feld1 LIKE ''abc*'' And Feld2 = 1.23\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Unter Verwendung der <b>StringCollection<\/b>-Klasse ergibt sich der Code in Listing 13 f&uuml;r die Prozedur <b>SqlText_VBA_Stufe5<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe5_mit_BuildCriteria_und_StringCollection()\r\n     <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">With<\/span> <span style=\"color:blue;\">New<\/span> StringCollection\r\n         ''Text\r\n         .Add DaoSqlTools.BuildCriteria(\"Textfeld\", SQL_Text, SQL_LIKE, Me.txtTextFilter.Value)\r\n         ''Zahlen\r\n         .Add DaoSqlTools.BuildCriteria(\"DoubleZahlenfeld\", SQL_Numeric, SQL_GreaterThan, Me.txtZahlenFilter.Value)\r\n         ''Datum\r\n         .Add DaoSqlTools.BuildCriteria(\"Datumsfeld\", SQL_Date, SQL_Equal + SQL_LessThan, Me.txtDatumsFilter.Value)\r\n         SqlFilter = .ToString(Delimiter:=\" And \", IgnoreEmptyValue:=<span style=\"color:blue;\">True<\/span>)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ''gesamten SQL-Text zusammenstellen\r\n     SqlText = \"SELECT * FROM tabTest\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         SqlText = SqlText & \" WHERE \" & SqlFilter\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 13: Code der Prozedur SqlText_VBA_Stufe5_Mit_SqlToolsBuildCriteria mit StringCollection<\/span><\/b><\/p>\n<p>Neben dem &uuml;bersichtlicheren Code hat diese Variante einen weiteren wesentlichen Vorteil: F&uuml;r die Filtertext-Erstellung ist kein &#8222;Logik&#8220;-Code erforderlich.<\/p>\n<p>Der Code besteht nur noch aus Anweisungen an die Klassen, ben&ouml;tigt aber keine <b>If<\/b>-Anweisungen, Schleifen oder &auml;hnliches. Das hat zur Folge, dass keine Logik-Fehler im Code-Ablauf entstehen k&ouml;nnen.<\/p>\n<p>Sie m&uuml;ssen nur noch die richtigen Parameter &uuml;bergeben, und den Rest erledigen die Klassen. Nat&uuml;rlich setzt das voraus, dass die Klassen ihre Aufgabe richtig erf&uuml;llen. Die Funktionsweise der Klassen kann zum Beispiel mit Unit-Tests &uuml;berpr&uuml;ft werden.<\/p>\n<p>Entscheidend ist, dass in der Verwendung keine Fehler entstehen, weil Sie bestimmte Regeln zur Konvertierung eines Filterwertes in Text et cetera nicht vergessen k&ouml;nnen, da diese Regeln innerhalb der Klassen beachtet werden und nicht im restlichen Code angegeben werden.<\/p>\n<p>Was man nicht angeben muss, kann man nicht falsch machen oder &uuml;bersehen.<\/p>\n<h2>Klasse FilterStringBuilder<\/h2>\n<p>Den Code der Prozedur <b>SqlText_VBA_Stufe5_Mit_SqlToolsBuildCriteria<\/b> k&ouml;nnen wir noch weiter vereinfachen. Im Code werden zwei Klassen verwendet, um zwei Aufgaben durchzuf&uuml;hren:<\/p>\n<ul>\n<li>Filterkriterium erstellen (SqlTools-Klasse)<\/li>\n<li>Filterkriterium zusammenf&uuml;gen (StringCollection-Klasse)<\/li>\n<\/ul>\n<p>Wenn wir diese beiden Aufgaben in einer weiteren Klasse kombinieren, erwarten wir einen k&uuml;rzeren und &uuml;bersichtlicheren Code, wie in Listing 14 gezeigt wird. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SqlText_VBA_Stufe5_mit_FilterStringBuilder()\r\n     <span style=\"color:blue;\">Dim <\/span>SqlText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>SqlFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">With<\/span> <span style=\"color:blue;\">New<\/span> FilterStringBuilder\r\n         ''SQL-Verarbeitung festlegen (SqlTools f&uuml;r den jeweiligen SQL-Dialekt)\r\n         <span style=\"color:blue;\">Set<\/span> .SqlTool = DaoSqlTools\r\n         ''Filterbedingungen festlegen:\r\n         ''Text\r\n         .Add \"Textfeld\", SQL_Text, SQL_LIKE, Me.txtTextFilter.Value\r\n         ''Zahlen\r\n         .Add \"DoubleZahlenfeld\", SQL_Numeric, SQL_GreaterThan, _\r\n         Me.txtZahlenFilter.Value\r\n         ''Datum\r\n         .Add \"Datumsfeld\", SQL_Date, SQL_Equal + SQL_LessThan, _\r\n         Me.txtDatumsFilter.Value\r\n         ''SQL-Filter-Text ausgeben:\r\n         SqlFilter = .ToString(SQL_And)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ''gesamten SQL-Text zusammenstellen\r\n     SqlText = \"SELECT * FROM tabTest\"\r\n   <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(SqlFilter) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n     SqlText = SqlText & \" WHERE \" & SqlFilter\r\n   End If   \r\n   <span style=\"color:blue;\">Call<\/span> SqlAnweisungAuswerten(SqlText)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 14: Code der Prozedur SqlText_VBA_Stufe5_mit_BuildCriteria_und_StringCollection mit FilterStringBuilder<\/span><\/b><\/p>\n<p>In der Klasse <b>FilterStringBuilder <\/b>sollen die Filterbedingungen wie in <b>BuildCriteria <\/b>&uuml;bergeben und der zusammengesetzte Filterausdruck aus der Klasse abgerufen werden k&ouml;nnen.<\/p>\n<p>Im Prinzip &uuml;bernehmen wir die Funktionsweise von <b>StringCollection <\/b>und erg&auml;nzen die F&auml;higkeiten von <b>SqlTools<\/b>, indem wir in der neuen Klasse diese beiden Klassen nutzen.<\/p>\n<p>Damit die Klasse <b>FilterStringBuilder <\/b>vom SQL-Dialekt unabh&auml;ngig bleiben kann, besteht die M&ouml;glichkeit, eine <b>SqlTools<\/b>-Instanz an die Eigenschaft <b>SqlTool<\/b> zu &uuml;bergeben oder die Text-Formate mit der Methode <b>ConfigSqlFormat <\/b>einzustellen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Bei der Konvertierung von Filterwerten in SQL-Text ist auf die passende Umwandlung in Text in Abh&auml;ngigkeit vom Datentyp und vom verwendeten SQL-Dialekt zu achten.<\/p>\n<p>Die in diesem Beitrag beschriebenen Refactoring-Schritte zeigen den Weg von einem fehleranf&auml;lligen Code zu einem in Klassen ausgelagerten Code, der das Definieren der Filterbedingungen statt dem Programmieren der Filterlogik erm&ouml;glicht.<\/p>\n<p>Der Beitrag <b>Komfortabel filtern in Formularen <\/b>(<b>www.access-im-unternehmen.de\/1011<\/b>) zeigt, wie der Filter in einem Praxisbeispiel funktioniert. Der Beitrag <b>Der ACLib-FilterForm-Wizard <\/b>(<b>www.access-im-unternehmen.de\/1020<\/b>) zeigt, wie Sie die ben&ouml;tigten Klassen einfach per Add-In in die aktuelle Datenbank einbauen und diese mit den gew&uuml;nschten Filterkriterien ausstatten. Schlie&szlig;lich beschreibt der Beitrag <b>Filterbedingungen mit Klasse <\/b>(<b>www.access-im-unternehmen.de\/1021<\/b>), wie die Klasse <b>FilterStringBuilder <\/b>funktioniert.&nbsp;&nbsp;&nbsp;&nbsp;[JP]<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Suedsturm-FilterForm.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{67B87246-80DF-4657-AB20-C5F56AD357F2}\/aiu_1015.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erstellen Sie in Ihren Anwendungen mit VBA Filterausdr&uuml;cke, um Formulare zu filtern oder Recordsets mit einer gefilterten Datenherkunft zu &ouml;ffnen Sind Ihnen dabei schon Fehler passiert, weil Sie die Werte nicht richtig konvertiert haben Oder finden Sie den Code zum Filtern zu aufwendig und suchen eine M&ouml;glichkeit, die Erstellung des Filtertextes zu vereinfachen Im vorliegenden Beitrag werden Sie verfolgen, wie eine Code-Struktur entsteht, die alle notwendigen Konvertierungsregeln ber&uuml;cksichtigt und trotzdem in der Anwendung &uuml;bersichtlich ist und Programmierfehler vermeidet.<\/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":[662015,66062015,44000025],"tags":[],"class_list":["post-55001015","post","type-post","status-publish","format-standard","hentry","category-662015","category-66062015","category-VBA_und_Programmiertechniken"],"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>Filterbedingungen einfach zusammenstellen - 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\/Filterbedingungen_einfach_zusammenstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filterbedingungen einfach zusammenstellen\" \/>\n<meta property=\"og:description\" content=\"Erstellen Sie in Ihren Anwendungen mit VBA Filterausdr&uuml;cke, um Formulare zu filtern oder Recordsets mit einer gefilterten Datenherkunft zu &ouml;ffnen Sind Ihnen dabei schon Fehler passiert, weil Sie die Werte nicht richtig konvertiert haben Oder finden Sie den Code zum Filtern zu aufwendig und suchen eine M&ouml;glichkeit, die Erstellung des Filtertextes zu vereinfachen Im vorliegenden Beitrag werden Sie verfolgen, wie eine Code-Struktur entsteht, die alle notwendigen Konvertierungsregeln ber&uuml;cksichtigt und trotzdem in der Anwendung &uuml;bersichtlich ist und Programmierfehler vermeidet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:09:15+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c\" \/>\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=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Filterbedingungen einfach zusammenstellen\",\"datePublished\":\"2020-05-22T19:09:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/\"},\"wordCount\":2575,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8b92cdcf58d1460abdbfc943198fdb8c\",\"articleSection\":[\"2015\",\"6\\\/2015\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/\",\"name\":\"Filterbedingungen einfach zusammenstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8b92cdcf58d1460abdbfc943198fdb8c\",\"datePublished\":\"2020-05-22T19:09:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8b92cdcf58d1460abdbfc943198fdb8c\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/8b92cdcf58d1460abdbfc943198fdb8c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filterbedingungen_einfach_zusammenstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Filterbedingungen einfach zusammenstellen\"}]},{\"@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":"Filterbedingungen einfach zusammenstellen - 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\/Filterbedingungen_einfach_zusammenstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Filterbedingungen einfach zusammenstellen","og_description":"Erstellen Sie in Ihren Anwendungen mit VBA Filterausdr&uuml;cke, um Formulare zu filtern oder Recordsets mit einer gefilterten Datenherkunft zu &ouml;ffnen Sind Ihnen dabei schon Fehler passiert, weil Sie die Werte nicht richtig konvertiert haben Oder finden Sie den Code zum Filtern zu aufwendig und suchen eine M&ouml;glichkeit, die Erstellung des Filtertextes zu vereinfachen Im vorliegenden Beitrag werden Sie verfolgen, wie eine Code-Struktur entsteht, die alle notwendigen Konvertierungsregeln ber&uuml;cksichtigt und trotzdem in der Anwendung &uuml;bersichtlich ist und Programmierfehler vermeidet.","og_url":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:09:15+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Filterbedingungen einfach zusammenstellen","datePublished":"2020-05-22T19:09:15+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/"},"wordCount":2575,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c","articleSection":["2015","6\/2015","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/","url":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/","name":"Filterbedingungen einfach zusammenstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c","datePublished":"2020-05-22T19:09:15+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/8b92cdcf58d1460abdbfc943198fdb8c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Filterbedingungen_einfach_zusammenstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Filterbedingungen einfach zusammenstellen"}]},{"@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\/55001015","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=55001015"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001015\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}