<< Klicken um das Inhaltsverzeichnis anzuzeigen >> Filterbedingung Crash-Kurs für Expertenmodus |
Crash-Kurs für die Syntax von Filterbedingungen |
|
Filterbedingungen stellen logische Ausdrücke dar. In der Regel handelt es sich um Vergleichsoperationen nach dem Schema Feldname Operator Wert wie z.B. Rind > 0 für ein numerisches Feld oder Name = 'Meier' für ein Zeichenkettenfeld. Abhängig vom Typ des betreffenden Feldes (Zeichen, Numerisch, Logisch oder Datum) sind einige Besonderheiten bei der Notation der Bedingungen zu beachten. Des weiteren können mehrere Teilbedingungen angegeben werden, die dann durch logische Operatoren (.and. bzw. .or.) verknüpft werden wir z.B. Rind > 0 .or. Schwein > 0.
Der kleine Crash-Kurs in in folgende Abschnitte unterteilt:
•Übersicht Vergleichsoperatoren
•Verknüpfungen - Logische Operatoren
Vergleichsoperatoren sind das A und O bei der Definition von Bedingungen für Filterausdrücke. Die folgende Tabelle enthält eine Übersicht. Beachten Sie, dass die konkrete Anwendung eines Vergleichsoperators häufig vom Typ des jeweiligen Feldes abhängig ist.
Vergleichsoperatoren |
|
< |
kleiner |
= |
gleich |
== |
genau gleich (exakter Vergleichsoperator Zeichenfelder) |
> |
größer |
<= |
kleiner (oder) gleich |
<> |
ungleich (alternativ können # oder != verwendet werden) |
>= |
größer (oder) gleich |
$ |
"Enthalten"-Operator für Zeichenfelder |
Numerische Felder enthalten ausschließlich Zahlen (ggf. Komma und Vorzeichen). Vergleiche folgen den Regeln der Mathematik, d. h., es werden immer alle Ziffern als Gesamtheit entsprechend ihres Zahlenwertes betrachtet und in Relation zu anderen Zahlen gesetzt wie 1,3 < 5 < 199 usw.
Beispiele:
Rind > 0 findet alle Einträge mit Rindern!
Rind <> 0 findet alle Einträge mit Rindern!
Schwein > 100 findet alle Einträge mit mehr als 100 Schweinen!
Schwein >= 100 findet alle Einträge mit 100 oder mehr Schweinen!
Außerdem kann man mit numerischen Felder selbstverständlich rechnen, was für Ihre Fälle durchaus von Bedeutung sein könnte. So kann man für den Filter "Klauentiere" notieren: Rind+Schaf+Ziege+Schwein+Gatterwild>0. Alternativ kann man aber auch mit Teilbedingungen und Verknüpfungen arbeiten wie Rind>0 .or. Schaf>0 .or. Ziege>0 .or. Schwein>0 .or. Gatterwild>0.
numerische Operatoren (Auszug) |
|
+ |
Addition |
- |
Subtraktion |
* |
Multiplikation |
/ |
Division |
^ |
Potenzieren |
wichtige Funktionen |
|
Min |
Min( Zahl1, Zahl2 ) → Zahl ... ermittelt das Minimum zweier Zahlen |
Max |
Max( Zahl1, Zahl2 ) → Zahl ... ermittelt das Maximum zweier Zahlen |
Val |
Val( Text ) → Zahl ... wandelt eine Zeichenkette in eine Zahl um |
•Werte sind in einfache Hochkommata einzuschließen, wie z.B. Name = 'Meier' oder Name = "Meier"
•Es wird zwischen dem Vergleichsoperator (=) und dem exakten Vergleichsoperator (==) unterschieden. Der Vergleichsoperator (=) vergleicht "zeichenweise". Der Vergleich wird spätestens beendet, wenn das Ende der rechten Zeichenkette erreicht ist. Damit liefert 'ABCDE' = 'ABC' logisch "Wahr". Wollen Sie jedoch ermitteln, ob ein Ausdruck auf der linken Seite exakt mit dem auf der rechten Seite übereinstimmt (Wert und Länge), verwenden Sie den exakten Vergleichsoperator (==), bei dem der Ausdruck 'ABCDE' == 'ABC' logisch "Falsch" und nur 'ABCDE' == 'ABCDE' logisch "Wahr" ergibt.
•Groß-/Kleinschreibung ist für Werte signifikant! Das bedeutet 'A' ist nicht gleich 'a'. Wenn Sie Vergleiche unabhängig von Groß- und Kleinschreibung machen wollen, verwenden Sie die Funktionen Upper() oder Lower(), die den Text wahlweise in Groß- bzw. Kleinbuchstaben umwandeln wie Upper(Ort) = 'WUSTERHAUSEN'.
•Um zu ermitteln, ob eine Zeichenkette leer ist, verwenden Sie z.B. den Ausdruck Name = " " (mit einem Leerzeichen zwischen den Anführungszeichen!). Alternativ kann auch Len( Trim( Name ) = 0 verwendet werden.
Demzufolge ermittelt der Ausdruck Name != " " (mit einem Leerzeichen zwischen den Anführungszeichen!), ob das Feld Name nicht leer ist. Alternativ kann auch Len( Trim( Name ) > 0 verwendet werden.
•Zeichenfelder können Buchstaben, Ziffern und Sonderzeichen enthalten. Die Vergleichsoperationen können angewendet werden, arbeiten jedoch nicht wie bei numerischen Feldern. Bei Zeichenketten werden Zeichen von links beginnend stellenweise verglichen. Ausschlaggebend dabei ist der Wert des Zeichens in der Zeichentabelle (so genannte ASCII-Tabelle).
Es gilt:
'A' < 'B', weil 'A' in der ASCII-Tabelle vor dem 'B' steht!
'1' < 'C', weil Ziffern in der ASCII-Tabelle vor Buchstaben stehen!
'139' < '9', weil stellenweise verglichen wird und '1' < '9' ist!
Bespiele:
Name > 'D' findet alle Einträge die mit 'E', 'F' .. 'Z' beginnen!
Name < 'D' findet alle Einträge die mit '', 'A', 'B', 'C' beginnen!
•Der $-Operator ermittelt, ob eine Zeichenkette in einer anderen enthalten ist. Dabei spielt die Position keine Rolle. So liefert "Stone" $ "Rolling Stones" logisch "Wahr".
Beispiele:
Name == 'Meier' - Name muss exakt Meier sein!
Name = 'Meier' - Name muss mit Meier beginnen!
'Meier' $ Name - Name muss (irgendwo) Meier enthalten!
wichtige Funktionen |
|
Left |
Left( Text, Anzahl ) → Zeichen ... ermittelt den linken Teil einer Zeichenkette |
Right |
Right( Text, Anzahl ) → Zeichen ... ermittelt den rechten Teil einer Zeichenkette |
Substr |
Substr( Text, Startposition, Anzahl ) → Zeichen ... gibt die gewünschte Anzahl der Zeichen ab der Startposition zurück |
Str |
Str( Zahl ) oder Str( Zahl, Länge, Dezimal ) → Zeichen ... wandelt eine Zahl in eine Zeichenkette um. Optional können Länge (inklusive Dezimalpunkt und Nachkommastellen) und Anzahl der Nachkommastellen angegeben werden |
At |
At( Suchtext, Text ) → Zahl ... ermittelt die Position des Auftretens von Suchtext im Text und gibt sie zurück (0, wenn nicht gefunden) |
Upper |
Upper( Text ) → Zeichen ... wandelt Text in Großbuchstaben um |
Lower |
Lower( Text ) → Zeichen ... wandelt Text in Kleinbuchstaben um |
Len |
Len( Text ) → Numerisch ... ermittelt die Länge einer Zeichenkette |
LTrim |
LTrim( Text ) → Zeichen ... entfernt führende Leerzeichen |
Trim |
Trim( Text ) → Zeichen ... entfernt Leerzeichen am Ende |
AllTrim |
AllTrim( Text ) → Zeichen ... entfernt führende Leerzeichen und Leerzeichen am Ende |
Zeichenkettenoperatoren |
|
+ |
fügt 2 Zeichenketten zusammen |
- |
fügt 2 Zeichenketten zusammen und entfernt abschließende Leerzeichen in der ersten |
•Werte vom Typ Datum, wie sie z.B. für Vergleichsoperationen benötigt werden, können mit der Funktion CtoD() generiert werden, wie z.B. CtoD( '31.08.2003' ).
•Alle Vergleichsoperatoren wie =, ==, <>, #, !=, und Ordnungsoperatoren wie <, >, <=, >= können auf den Typ Datum angewendet werden, wie z.B. Datum < CtoD( '01.01.2003' ).
•Um zu ermitteln, ob eine Datumsangabe leer ist, kann die Funktion Empty() oder die Notation CtoD("") verwendet werden.
Demzufolge ist der Test auf ein leeres Datum über Empty( Datum ) oder Datum = CtoD("") möglich.
• Tage können addiert und subtrahiert werden. Für 01.01.2003 - 1 ist das Ergebnis 31.12.2002 und 01.01.2003 + 31 ergibt sich 01.02.2003.
•Die Differenz zwischen Kalenderdaten kann durch Subtraktion von 2 Datumswerten ermittelt werden.
wichtige Funktionen |
|
Empty |
Empty( Datum ) → Logisch ... ermittelt, ob ein Datum leer ist |
Today |
Today() → Datum ... gibt das Tagesdatum zurück |
CtoD |
CtoD( Zeichenkette ) → Datum ... wandelt eine Zeichenkette in ein Datum um |
DtoC |
DtoC( Datum ) → Zeichen ... wandelt ein Datum in eine Zeichenkette um |
Year |
Year( Datum ) → Zahl ... ermittelt die Jahreszahl aus einem Datum |
Month |
Month( Datum ) → Zahl ... separiert die Nummer des Monats aus einem Datum |
Day |
Day( Datum ) → Zahl ... separiert den Tag aus einem Datum |
Min |
Min( Datum1, Datum2 ) → Datum ... ermittelt das Minimum zweier Datumswerte |
Max |
Max( Datum1, Datum2 ) → Datum ... ermittelt das Maximum zweier Datumswerte |
Datumsoperatoren |
|
+ |
Datum + Zahl → Datum ... addiert n Tage zu einem Datum |
- |
•Datum - Zahl → Datum ... subtrahiert n Tage von einem Datum •Datum1 - Datum2 → Zahl ... ermittelt die Differenz aus 2 Datumswerten |
Logische Felder sind Datenbankfelder, die genau zwei Zustände annehmen können nämlich die Wahrheitswerte "Wahr" oder "Falsch". Diese Werte werden durch .T. oder .F. (auch .t. oder .f.) definiert.
Um zu ermitteln, ob ein Feld "Wahr" oder "Falsch" ist, kann der Vergleichsoperator = oder != (auch # oder <>) verwendet werden wie z.B. Untersucht = .t. oder Untersucht = .f.
Es ist jedoch eine leichtere Notation möglich, indem man lediglich notiert Untersucht (gleich bedeutend mit Untersucht = .t.) oder !Untersucht (gleich bedeutend mit Untersucht = .f., das Ausrufungszeichen steht für die Negation).
Eng verwandt mit logischen Feldern sind logische Ausdrucke wie Vergleiche (z.B. Rind > 10) die ebenfalls einen Wahrheitswert .t. oder .f. für "wahr" oder "falsch" liefern.
Logische Operatoren kommen dann ins Spiel, wenn mehrere Teilbedingungen zu verknüpfen sind.
logische Operatoren |
|
.and. |
verknüpft Teilbedingungen mit einem logischen UND, so dass jede Teilbedingung erfüllt sein muss |
.or. |
verknüpft Teilbedingungen mit einem logischen ODER, so dass mindestens eine Teilbedingung erfüllt sein muss |
.not. oder ! |
negiert eine Bedingung |
Feldname1 Operator1 Wert1 .or. Feldname2 Operator2 Wert2
Feldname1 Operator1 Wert1 .and. Feldname2 Operator2 Wert2
Beispiel |
Wirkung |
Rind > 0 .and. Schwein > 0 |
Alle Tierhalter, die sowohl Rinder als auch Schweine besitzen, werden verarbeitet. |
Rind > 0 .or. Schwein > 0 |
Alle Tierhalter, die entweder Rinder oder Schweine (oder beides) besitzen, werden verarbeitet. |
Rind > 0 .and. Schwein = 0 |
Alle Tierhalter, die Rinder und keine Schweine besitzen, werden verarbeitet. |
Nicht unerwähnt bleiben soll, dass bei der Formulierung mehrer Teilbedingungen ein Problem auftritt, das Sie aus der Mathematik kennen. Erinnern Sie sich: (3+5)*3 = 24 und 3+5*3=18. Wenn Sie komplizierte Bedingungen mit mehreren "And" und "Or" verwenden und sich nicht sicher sind, in welcher Reihenfolge sie abgearbeitet werden, dann setzen Sie sicherheitshalber Klammern ().