Crystal Reports  

Variables globales (syntaxe Crystal)

Les variables globales utilisent le même bloc de mémoire pour stocker une valeur sur l'ensemble de l'état principal. Cette valeur est alors utilisable par toutes les formules qui déclarent la variable, à l'exception de celles situées dans les sous-états. Vous déclarez une variable globale comme dans l'exemple suivant :

Global StringVar y;

Vous pouvez également omettre le mot clé Global, car, par défaut, la variable créée est globale :

StringVar y; //Identique à: Global StringVar y;

Cependant, même si les variables globales sont faciles à déclarer, il est préférable de ne les utiliser que lorsque les variables locales ne sont pas suffisantes.

Etant donné que les variables globales partagent leurs valeurs sur l'ensemble de l'état principal, vous ne pouvez pas déclarer une variable globale dans une formule avec un type puis déclarer une variable globale portant le même nom dans une formule différente avec un type différent.

Exemple

//Formule A
Global DateVar z;
z := CDate (1999, 9, 18)
//Formule B
NumberVar z;
z := 20

Dans ce cas, si vous entrez et enregistrez la formule A en premier, Crystal Reports émettra un message d'erreur lorsque vous vérifierez ou essaierez d'enregistrer la formule B. Ceci est dû au fait que la déclaration de la variable globale z en tant que valeur numérique entre en conflit avec sa précédente déclaration dans la formule A en tant que date.

Utilisation des variables globales

Les variables globales sont souvent utilisées pour effectuer des calculs complexes lorsque le résultat d'une formule dépend du groupement et de la disposition de page de l'état imprimé réel. Ceci est obtenu en créant plusieurs formules, en les plaçant dans différentes sections de l'état et en faisant interagir les différentes formules par le biais de variables globales.

Exemple

//Formule C
Global NumberVar x;
x := 10;
//Formule D
//Appelle la fonction WhileReadingRecords
WhileReadingRecords;
Global NumberVar x;
x := x + 1

Si la formule C est placée dans l'en-tête d'état et que la formule D est placée dans une section Détails, la formule C sera évaluée avant la formule D. La formule C sera évaluée une fois puis la formule D sera évaluée pour chaque enregistrement apparaissant dans la section Détails. La formule C renvoie 10. Pour le premier enregistrement de détail, la formule D renvoie 11. Ceci est dû au fait que la valeur 10 de x est conservée depuis le moment où elle a été définie par la formule C. La formule D ajoute alors 1 à cette valeur, en donnant à x la valeur 11, puis renvoie 11. Pour le deuxième enregistrement de détail, la formule D renvoie 12, en ajoutant 1 à la valeur précédente de x qui était 11. Ce processus se poursuit sur les autres enregistrements de détail restants.

L'appel de la fonction WhileReadingRecords demande à Crystal Reports de réévaluer la formule D au fur et à mesure qu'elle est lue dans chaque enregistrement de l'état. Sinon, étant donné que la formule ne contient aucun champ de base de données, le programme l'évalue une fois pour toutes avant de lire les enregistrements de la base de données. La formule renverra alors toujours la valeur 11 et non pas 11, 12, 13, ... au fur et à mesure du traitement des enregistrements successifs.

Si l'expression x := x + 1 est remplacée par x := x + {Détails des commandes.Quantité}, vous créez l'effet d'un total cumulé fondé sur {Détails des commandes.Quantité}, bien qu'il commence à 10 et non à 0 à cause de la formule C. Dans ce cas, vous pouvez omettre l'appel à la fonction WhileReadingRecords, car, étant donné que la formule contient un champ de base de données, l'appel se fera automatiquement.

Voir aussi

Etendue de variables | Variables locales | Variables partagées | Présentation générale des sections d'état