Crystal Reports Designer  

Regroupement des expressions (syntaxe Crystal)

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 ({Employés.Prénom}) < 5 Then
   "court"

L'expression If ci-dessus renvoie une valeur de 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 Annee({Commandes.Date de commande}) >= 1995 Then
   {Commandes.Date de commande}

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 état, le champ de formule sera vierge pour les dates de commande antérieures à 1995. Il en va de même pour les valeurs d'heure et de date nulles.

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 expédition express : 100,00 €" ou "Frais de port pour expédition ordinaire : 20,00 €".

Local StringVar message;
Local CurrencyVar expédition;
If {Commandes.Date d'expédition} - {Commandes.Date de commande} <= 3 Then
(
   message := " express";
   //Un point-virgule à la fin de la ligne suivante
   //est facultatif
   expédition := {Commandes.Montant commande} * 0,05
) //Un point-virgule ne peut pas être placé ici
Else
(
   message := " normale";
   expédition := {Commandes.Montant commande} * 0,02;
);
//Le point-virgule précédent est nécessaire pour séparer
//l'expression If de l'expression finale ci-dessous
message & " Frais de port pour expédition " & message & CStr (expédition)

Lorsque des expressions sont groupé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.

//L'expression de tout le groupe entre parenthèses
//est du type monétaire
(
   //La première expression à l'intérieur des parenthèses
   //est du type chaîne
   message := " express";
   //La deuxième et dernière à l'intérieur des parenthèses
   //est du type monétaire
   expédition := {Commandes.Montant commande} * 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 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.

//Formule erronée
Local StringVar message;
Local CurrencyVar expédition;
If {Commandes.Date d'expédition} - {Commandes.Date de commande} <= 3 Then
(
   message := " express";
   expédition := {Commandes.Montant commande} * 0,05
)
Else
(
   //Les 2 lignes suivantes ont été interverties
   expédition := {Commandes.Montant commande} * 0,02;
   message := " normale";
);
message & " Frais de port pour expédition " & message & CStr (expédition)

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 :

//Rectifier la formule erronée
Local StringVar message;
Local CurrencyVar expédition;
If {Commandes.Date d'expédition} - {Commandes.Date de commande} <= 3 Then
(
   message := " express";
   expédition := {Commandes.Montant commande} * 0,05;
   0
)
Else
(
   expédition := {Commandes.Montant commande} * 0,02;
   message := " normale";
   0
);
message & " Frais de port pour expédition " & message & CStr (expédition)

Voir aussi

Expressions If | Expressions Select