Rund die Hälfte der in durchschnittlich komplexen Datenbankanwendungen eingesetzten Abfragen verwenden Funktionen und Operatoren. Da sie meistens auch einen Geschwindigkeitsverlust bei der Ausführung der Abfragen bedeuten, sollten Sie genau prüfen, ob der Einsatz tatsächlich notwendig ist.
Denn wie in vielen anderen Bereichen gilt auch hier: Viele Wege führen nach Rom! Die einen sind etwas länger, aber bequem, andere eher kurz und dafür umständlich. Bei der Analyse von Abfragen wird das besonders deutlich. Oftmals entsteht der Eindruck, der Entwickler der Abfrage war nur daraufbedacht, sie in möglichst kurzer Zeit und mit möglichst wenig Aufwand zu erstellen, ohne nach effektiveren Alternativen zu suchen.
Wir stellen im Folgen den eine Reihe regelmäßig verwendeter Funktionen und Operatoren vor und zeigen Alternativen, die nicht selten schneller ausgeführt werden können.
Zwischen-Operator statt „>“, „<“ und „>=“, „<=“
Um Datensätze abzufragen, die in einen vorgegebenen Wertebereich fallen, verwenden Sie meistens die Operatoren „>“ und „<“ oder „>=“ und „<=“.
Um beispielsweise alle Adressen aus dem Postleitzahlbereich 51000 zu selektieren, wer den Konstruktionen wie die folgende bei einem Feld „PLZ“ eingesetzt:
>=“51000″ Und <= „51999“
Oder
>“50999″ Und < „52000“
Für die Prüfung solcher Wertebereiche mit zwei Grenzwerten nutzen Sie besser die weitaus effektivere Konstruktion mit „Zwischen“ und „Und“:
„In()“-Funktion statt „Oder“-Operator
Wenn Sie Datensätze auswählen, die in einem bestimmten Feld einen von mehreren möglichen Werten enthalten, kommt meistens der „Oder“-Operator zum Einsatz.
Also zum Beispiel:
„Hamburg“ Oder „Köln“ Oder „Stuttgart
Eine wenig bekannte, aber sehr effektive Alternative ist die „In()“-Funktion. Hier übergeben Sie einfach die gewünschten Werte, getrennt durch ein Semikolon, als Argument:
In(„Hamburg“;“Köln“;“Stuttgart“)
Diese Variante ist einfacher einzugeben und auch übersichtlicher, vor allem bei einer großen Anzahl von Werten. Aber auch hier gibt es Grenzen. Wenn Sie 20 oder mehr Werte vorgeben möchten, sollten Sie diese besser in einer Tabelle verwalten, die dann mit der Abfrage verknüpft wird.
VBA-Funktion anstelle von „IIF()“
In Abfragen und SQL-Unterabfragen wird häufig die Funktion „If(Bedingung, True-Part, False-Part)“ bzw. „Wenn(Bedingung, True-Part, False-Part)“ verwendet, um abhängig von einem anderen Feld einen neuen Feldinhalt zusammenzusetzen:
„AnrBrief: IIF([AnrAdr]=“Herr“; „Sehr geehrter Herr“; „Sehr geehrte Frau“)
Hier wird abhängig vom Feldinhalt „AnrAdr“ die Anrede für den Brief mit „Sehr geehrter Herr“ oder „Sehr geehrte Frau“ generiert. Nachteil dieser Konstruktion ist, dass Access hier zunächst zwei Zeichenketten erzeugt: eine für den True- und eine für den False-Part. Erst dann wird eine der Zeichenketten abhängig von der Bedingung als Feldinhalt zugewiesen.
Schneller und flexibler ist der Einsatz einer benutzerdefinierten VBA-Funktion „AnrFuerBrief ()“:
Function AnrFuerBrief (strAnrAdr as String) As String
If strAnrAdr = „Herr“ Then
AnrFuerBrief = „Sehr geehrter Herr“
Else
if strAnrAdr = „Frau“ Then
AnrFuerBrief = „Sehr geehrte Frau“
Else
AnrFuerBrief = „Sehr geehrte Damen und Herren“
End If
In dieser Funktion wird zunächst die Bedingung geprüft und erst dann die benötigte Zeichenkette zusammengesetzt.
Außerdem erfolgt hier noch eine weitere Unterscheidung für den Fall, dass eine Anrede weder „Herr“ noch „Frau“ ist, und dementsprechend eine allgemeine Anrede wie „Sehr geehrte Damen und Herren“ für den Brief als Ergebnis geliefert werden soll.
„Links()“ und „Rechts()“ statt „Wie“
In Abfragekriterien oder SQL-Unterabfragen nutzen Sie regelmäßig die Funktion „Wie“ oder „Like“, um Datensätze zu selektieren, die in einem Feld gemeinsame Inhalte aufweisen.
Zum Beispiel:
Sie möchten alle Datensätze selektieren, bei denen das Feld „Ort“ Inhalte wie „Hamburg-Bahrenfeld“, „Hamburg-Blankenese“, „Hamburg-Winterhude“ usw. aufweist.
Dazu verwenden Sie zum Beispiel beim Feld „Ort“ das folgende Kriterium:
Wie „*Hamburg*“
Damit werden alle Datensätze selektiert, bei denen im Feld „Ort“ irgendwo die Zeichenkette „Hamburg“ vorkommt. Durch die Sternchen am Anfang und Ende teilen Sie Access mit, dass es keine Rolle spielt, welche Zeichen vor und nach dem betreffenden Begriff vorhanden sind. Prüfungen dieser Art benötigen viel Zeit, da Access jeden einzelne Feldinhalt Zeichen für Zeichen untersuchen muss.
Wenn, wie in diesem Beispiel, „Hamburg“ immer am Feldanfang steht, ist das folgende Kriterium wesentlich schneller zu prüfen:
Access muss hier nur die ersten sieben Zeichen aus dem Feld „Ort“ mit dem Begriff „Hamburg“ vergleichen. Da es dabei bereits abbricht und „False“ erkennt, wenn das erste Zeichen ungleich „H“ ist, können solche Prüfungen blitzschnell ausgeführt werden. Ähnliches gilt für Felder, deren gemeinsame Inhalte immer am Ende stehen, wie zum Beispiel in den Berufsbezeichnungen „Verkaufs-Assistent“, „Vertriebs-Trainee“, „Vorstands-Sekretärin“. Um eine Liste aller Assistenten zu erhalten, verwenden Sie nicht
Wie „*Assistent*“
sondern prüfen die entsprechende Anzahl von Zeichen rechts im Feldinhalt:
Rechts([Berufsbezeichnung];9) = „Assistent“
Feste Formatierung anstelle von „Format()“
Oftmals ist im Tabellenentwurf für ein Feld beispielsweise der Datentyp „Zahl“ mit Feldgröße „Double“ eingetragen, die Abfrage soll das Ergebnis aber im Format „Währung“ liefern.
Dazu wird häufig folgende Konstruktion eingesetzt:
BetragW: Format([Betrag];“Currency“) oder BetragW: Format([Betrag];“###,###,###.00″) & „Euro“
Access muss damit für jeden Datensatz eine Konvertierung per VBA-Funktion vornehmen.
Wesentlich schneller lässt sich das durch die interne Formatierung der Abfrage erledigen: Klicken Sie mit der rechten Maustaste in die Spalte des Feldes, dessen Format geändert werden soll, und wählen Sie EIGENSCHAFTEN im Kontextmenü an.
Im nachfolgenden Eigenschaftenfenster stellen Sie unter „Format“ den Eintrag „Währung“ oder „Euro“ ein.
Die Ergebnisse der betreffenden Spalte werden dann zukünftig im gewünschten Format ohne zeitraubende Aufrufe von VBA-Funktionen ausgegeben.