L'expression If est une expression. En d'autres termes, elle est évaluée sous la forme d'une valeur d'un type donné. S'il n'y a pas de clause Else et que la condition n'est pas vraie, la valeur est la valeur par défaut du type. Par exemple :
If Length ({Employee.First Name}) < 5 Then
"short"
L'expression If ci-dessus renvoie une valeur de type chaîne. La valeur de la chaîne est "court" si le prénom de l'employé comporte moins de 5 lettres ou la chaîne vide "" dans le cas contraire.
Observez la formule :
If Year({Orders.Order Date}) >= 1995 Then
{Orders.Order Date}
Pour les dates de commande antérieures à 1995, l'expression If ci-dessus renvoie la valeur de type date/heure nulle. C'est une valeur de type date/heure et non une valeur de date puisque {Commandes.Date de commande} est un champ de base de données de type date/heure. Crystal Reports n'imprime pas cette valeur nulle et, ainsi, si la formule ci-dessus est utilisée dans un rapport, le champ de formule sera vierge pour les dates de commande antérieures à 1995. Il en va de même pour les valeurs nulles d'heure et de date.
Voici un exemple illustrant l'utilisation de parenthèses pour que le résultat d'une condition If débouche sur l'exécution de plusieurs expressions. Une société facture des frais de port de 5 % pour les commandes livrées sous trois jours, et de 2 % dans les autres cas. Elle souhaite imprimer des messages tels que "Frais de port pour livraison express : 100 €" ou "Frais de port pour livraison normale : 20 €" selon les cas.
Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
//A semicolon at the end of the next line
//is optional
ship := {Orders.Order Amount} * 0.05
) //A semicolon cannot be placed here
Else
(
message := "Regular";
ship := {Orders.Order Amount} * 0.02;
);
//The preceding semicolon is required to separate the
//If expression from the final expression below
message & " shipping is " & CStr (ship)
Lorsque des expressions sont regroupées à l'aide de parenthèses, le groupe tout entier est considéré comme une seule expression, et sa valeur et son type sont ceux de l'expression finale entre parenthèses.
//The parentheses group expression as a whole has
//Currency type
(
//The first expression in the parentheses has
//String type
message := "Rush";
//The second and final expression in parentheses
//has Currency type
ship := {Orders.Order Amount} * 0.05;
)
Ainsi, par exemple, la formule suivante produit une erreur. C'est parce que la partie Then de l'expression If renvoie une valeur monétaire alors que la partie Else renvoie une valeur de type chaîne. Ce n'est pas autorisé, car l'expression If est une expression et en tant que telle doit toujours renvoyer une valeur d'un seul type.
//An erroneous formula
Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05
)
Else
(
//The following 2 lines were interchanged
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
);
message & " shipping is " & CStr (ship)
Un moyen de mettre au point la formule erronée sans avoir à se préoccuper de l'ordre de l'expression consiste simplement à faire en sorte que l'expression If renvoie une valeur constante du même type dans chaque branche. Par exemple, l'expression If renvoie maintenant la valeur numérique 0:
//Repaired the erroneous formula
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)