Gruppierungsausdrücke (Crystal-Syntax)

Der If-Ausdruck ist ein Ausdruck. Das heißt, er liefert als Ergebnis einen Wert eines gegebenen Typs. Wenn es keinen Else-Satz gibt und die Bedingung nicht wahr ist, wird der Standardwert des gegebenen Typs zurückgegeben. Beispiel:

If Length ({Employee.First Name}) < 5 Then
"short"

Dieser If-Ausdruck gibt einen Zeichenfolgewert zurück. Dieser Zeichenfolgewert ist "kurz", wenn der Vorname des Mitarbeiters weniger als 5 Buchstaben hat. Andernfalls ist es die leere Zeichenfolge "".

Hier noch ein anderes Beispiel für eine Formel:

If Year({Orders.Order Date}) >= 1995 Then
{Orders.Order Date}

Bei Bestelldaten vor dem Jahr 1995 gibt dieser If-Ausdruck den DateTime-Nullwert zurück. Hier handelt es sich um einen DateTime-Wert und nicht um einen Date-Wert, da {Bestellungen.Bestelldatum} ein DateTime-Datenbankfeld ist. Der DatumUhrzeit-Nullwert wird von Crystal Reports nicht gedruckt. Wenn also die oben stehende Formel in einen Bericht gestellt wird, ist das Formelfeld bei Bestelldaten vor 1995 leer. Uhrzeit- und Datum-Nullwerte verhalten sich auf ähnliche Weise.

Uhrzeit-Nullwerte und Datum-Nullwerte verhalten sich ähnlich. Hier ist ein Beispiel, das die Verwendung von Klammern verdeutlicht, damit mehr als ein Ausdruck als Ergebnis einer If-Bedingung ausgeführt wird. Ein Unternehmen erhebt eine Gebühr von 5Prozent, wenn Bestellungen innerhalb von drei Tagen versandt werden, andernfalls eine Gebühr von 2Prozent. Es sollen nach Bedarf Nachrichten wie beispielsweise "Eilversand kostet € 100,-" oder "Normaler Versand kostet € 20,-" gedruckt werden.

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
//Ein Semikolon am Ende der nächsten Zeile ist optional.
ship := {Orders.Order Amount} * 0.05
) //Hier darf kein Semikolon gesetzt werden.
Else
(
message := "Regular";
ship := {Orders.Order Amount} * 0.02;
);
//Das vorangestellte Semikolon ist erforderlich, um den If-Ausdruck vom letzten Ausdruck unten zu trennen.
message & " shipping is " & CStr (ship)

Wenn Ausdrücke mit Klammern zusammen gruppiert werden, wird die gesamte Gruppe als ein einziger Ausdruck angesehen. Seinen Wert und Typ erhält er vom Wert und Typ des letzten Ausdrucks in den Klammern.

//Die Gruppe in Klammern als Ganzes hat den Typ "Currency".
(
//Der erste Ausdruck in den Klammern hat den Typ "String".
message := "Rush";
//Der zweite und letzte Ausdruck in Klammern hat den Typ "Currency".
ship := {Orders.Order Amount} * 0.05;
)

So gibt die folgende Formel beispielsweise einen Fehler aus, weil der Then-Teil des If-Ausdrucks einen Währungswert zurückgibt, während der Else-Teil einen Zeichenfolgenwert zurückgibt. Dies ist nicht zugelassen, da es sich bei dem If-Ausduck um einen Ausdruck handelt und er daher einen Wert von nur einem Typ zurückgeben muss.

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05
)
Else
(
//Die folgenden zwei Zeilen wurden untereinander ausgetauscht.
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
);
message & " shipping is " & CStr (ship)

Eine Möglichkeit, wie die fehlerhafte Formel korrigiert werden kann, ohne der Reihenfolge der Ausdrücke große Beachtung schenken zu müssen, besteht darin, den If-Ausdruck in jedem Zweig einen konstanten Wert desselben Typs zurückgeben zu lassen. Jetzt gibt der If-Ausdruck beispielsweise den Zahlwert 0 zurück:

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05;
0
)
Else
(
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
0
);
message & " shipping is " & CStr (ship)