SQL-Text für Filterbedingungen mit Klasse

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

SQL-Text für Filterbedingungen mit Klasse

Mit dem Einsatz von Klassen können Sie Ihren Programmcode übersichtlich gestalten. Wenn Sie konkrete Aufgaben mittels wiederverwendbarer Klassen umsetzen, erhalten Sie zusätzlich eine Code-Sammlung, die die Code-Qualität erhöht, weil Sie Korrekturen im Code nur noch an einer Stelle umsetzen müssen. Die in diesem Beitrag beschriebenen Klassen sind wiederverwendbare Klassen für die Erstellung eines Filterausdrucks, die Sie ohne Änderung in Ihre Anwendung importieren und nutzen können.

Ziel

Das Erstellen von SQL-Filterausdrücken soll standardisiert und ohne hohen Programmieraufwand für unterschiedliche SQL-Dialekte anwendbar werden.

Ausgangssituation

SQL-Text zum Filtern von Formulardaten oder als Bestandteil von SQL-Anweisungen für Recordsets wird regelmäßig benötigt. Beim Zusammenstellen der SQL-Anweisungen muss auf die passende Konvertierung in Text geachtet werden. Die Konvertierung sowie das Zusammenfügen mehrerer Filter-Kriterien können zu schlecht lesbarem Code führen. Eine Sammlung von Hilfsprozeduren und Klassen soll diese Aufgaben vereinfachen.

Anforderungen

Die Lösung stellt die folgenden Anforderungen:

  • Unterstützung für verschiedene SQL-Dialekte
  • Unterschiedliche Einsatzmöglichkeiten - von der Konvertierung eines Wertes zu SQL-Text über das Erstellen eines einzelnen Kriteriums bis zur automatischen Filterung in Formularen, wenn Werte in Filter-Steuerelementen geändert werden.
  • Definieren statt programmieren
  • Übersichtlicher Code in den Prozeduren, die die Klassen verwenden
  • Wiederverwendbarer Code

Lösungsansatz

Der Lösungsansatz beinhaltet die folgenden Elemente:

  • Klassen mit konkreten Aufgaben (Single-Responsibility-Prinzip)
  • Austauschbare Klassen – falls spezielle Anforderungen benötigt werden
  • Anforderungen für unterschiedliche SQL-Dialekte über Parameter/Eigenschaften einstellbar

Klasse SqlTools

Die Klasse SqlTools stellt Methoden zum Erstellen eines SQL-Ausdrucks bereit. Die Methoden TextToSqlText, NumberToSqlText, DateToSqlText und BooleanToSqlText konvertieren Werte mit einem bestimmten Datentyp in einen SQL-konformen Text.

Damit diese Konvertierungsfunktion Text für verschiedene SQL-Dialekte erzeugen können, müssen Sie die gewünschten Formate als Parameter an die Konvertier-Funktionen weitergeben oder Sie stellen die Formate mit den Eigenschaften SqlDateFormat, SqlBooleanTrueString und SqlWildCardString für die Klassen-Instanz ein. Die Methode ConvertToSqlText bildet einen zentralen Einstiegspunkt dieser Konvertierungsfunktionen. In Listing 1 sehen Sie Auszüge aus der Beispiele-Datei SqlTools_Beispiele.mdb.

Private Sub DatentypToSqlText()
     [...]
     FilterWert = DateSerial(2015, 12, 24)
     SqlText = SqlTools.DateToSqlText(FilterWert, "#yyyy-mm-dd#")
     Debug.Print "Aus "; FilterWert; " wird "; SqlText
     ' --> Aus 24.12.2015  wird #2015-12-24#
     [...]
End Sub
Private Sub ConvertToSqlText_JetDaoDialekt()
     [...]
     'SQL-Formate einstellen
     With SqlTools
         .SqlDateFormat = "#yyyy-mm-dd#"
         .SqlBooleanTrueString = "True"
     End With
     [...]
     FilterWert = DateSerial(2015, 12, 24)
     SqlText = SqlTools.ConvertToSqlText(FilterWert, SQL_Date)
     Debug.Print "Aus "; FilterWert; " wird "; SqlText
     [...]
End Sub

Listing 1: Einsatz der Konvertierungsfunktionen

Zum Erstellen eines Filterausdrucks übergeben Sie den Datenfeldnamen, den Datentyp, den gewünschten Vergleichsausdruck und den Wert an die Methode BuildCriteria. Innerhalb der Methode wird der Wert über die Konvertierungsfunktion für den jeweiligen Datentyp in SQL-Text umgeformt. Aus den Enum-Werten vom RelationalOperator-Parameter wird der Vergleichsausdruck erstellt.

Diese Texte werden mit dem Feldnamen zu einem Filterausdruck zusammengefügt und als Funktionsergebnis zurückgegeben. Die Beispiele in Listing 2 zeigen übliche Varianten für Vergleichsausdrücke.

Private Sub BuildCriteria_EqualGreaterThan()
     [...]
     FilterWert = "O'Neill"
     SqlText = SqlTools.BuildCriteria("Textfeld", SQL_Text, SQL_Equal + SQL_GreaterThan, FilterWert)
    Debug.Print "SQL_Text:", SqlText
    ' --> Textfeld >= 'O''Neill'
     [...]
End Sub
Private Sub BuildCriteria_Like()
     [...]
    FilterWert = "abc"
    SqlText = SqlTools.BuildCriteria("Textfeld", SQL_Text, SQL_Like, FilterWert)
    Debug.Print "SQL_Text:", SqlText
    ' --> Textfeld Like 'abc'
    FilterWert = "a"
    SqlText = SqlTools.BuildCriteria("Textfeld", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, FilterWert)
    Debug.Print "SQL_Text:", SqlText
    ' --> Textfeld Like 'a*'
    FilterWert = "c"
    SqlText = SqlTools.BuildCriteria("Textfeld", SQL_Text, SQL_Like + SQL_Add_WildCardPrefix, FilterWert)
    Debug.Print "SQL_Text:", SqlText
    ' --> Textfeld Like '*c'
End Sub

Listing 2: BuildCriteria-Beispiele

Für Between-Filterbedingungen gibt es spezielle Features in der SqlTools-Klasse. Wenn Sie beispielsweise einen Datumsfilter erzeugen wollen und in den zu filternden Werten auch die Uhrzeit enthalten ist, können Sie SQL_Add_WildCardSuffix verwenden, um den ganzen Tag des Ende-Datums anzugeben. Der Between-Ausdruck wird zu einem Feld >= Startdatum And Feld < (EndDatum+1)-Ausdruck umgeschrieben.

Übergeben Sie Null an einen der Wert-Parameter, wird der Between-Ausdruck wieder umgeformt, da Null standardmäßig als Filterwert nicht berücksichtigt werden soll. Beispiele zu diesen Features sehen Sie in Listing 3.

Private Sub BuildCriteria_Between_Features()
     [...]
     'Datum + SQL_Add_WildCardSuffix:
     ErsterWert = DateSerial(2015, 12, 1)
     ZweiterWert = DateSerial(2015, 12, 31)
     SqlText = SqlTools.BuildCriteria("Datumsfeld", SQL_Date, _
         SQL_Between + SQL_Add_WildCardSuffix, ErsterWert, ZweiterWert)
     Debug.Print "SQL_Date + SQL_Add_WildCardSuffix: zwischen "; _
         ErsterWert; "und "; ZweiterWert; "ergibt:"; vbNewLine; SqlText
     ' --> Datumsfeld >= #2015-12-01# And Datumsfeld < #2016-01-01#
     'Nullwerte:
     ErsterWert = 1
     ZweiterWert = Null
     SqlText = SqlTools.BuildCriteria("Zahlenfeld", SQL_Numeric, _
         SQL_Between, ErsterWert, ZweiterWert)
     Debug.Print "ZweiterWert = Null: "; SqlText

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]