En général, lorsque Crystal Reports rencontre un champ de valeur nulle dans une formule, il arrête immédiatement l'évaluation de la formule et ne produit pas de valeur. Si vous voulez manipuler des valeurs nulles dans votre formule, vous devez le faire de façon explicite en utilisant l'une des fonctions spéciales conçues pour cela : IsNull, PreviousIsNull ou NextIsNull.
En ce qui concerne les opérateurs lorsque Crystal Reports évalue la condition :
IsNull({Produits.Couleur}) Or InStr({Produits.Couleur}, " ") = 0
L'évaluation de IsNull ({Produits.Couleur}) se fait en premier; si le résultat est déterminé comme étant vrai (True), il est certain qu'il en est de même pour l'ensemble de la condition, et il n'est donc pas nécessaire de vérifier si
InStr({Produits.Couleur}, " ") = 0
En d'autres termes, Crystal Reports arrête d'évaluer une expression booléenne quand il peut déduire le résultat de la totalité de l'expression. Dans l'exemple suivant, la formule surveille les tentatives de division par zéro dans le cas où le dénominateur serait égal à 0 :
Local NumberVar num; Local NumberVar denom; ... If denom <> 0 And num / denom > 5 Then ...
Exemple
Le champ {Produits.Couleur} contient des couleurs de base comme "rouge" et "noir" et des couleurs fantaisie dont le nom est en deux mots comme "satin acier" et "vert émeraude". Supposons que vous vouliez écrire une formule qui écrive "de base" pour les couleurs de base et "fantaisie" pour les autres.
If InStr({Produits.Couleur}, " ") = 0 Then "de base" Else "fantaisie"
L'appel de la fonction InStr recherche un espace dans la chaîne {Produits.Couleur}. S'il trouve un espace, il renvoie la position de celui-ci ; sinon il renvoie 0. Les couleurs de base étant représentées par un mot unique ne comportant pas d'espace, InStr renvoie 0 pour chacune de ces couleurs.
Pour certains produits, tels que l'antivol Guardian, aucune couleur n'a été enregistrée de sorte que le champ {Produits.Couleur} a une valeur nulle dans la base de données pour cet enregistrement. C'est pourquoi aucun mot n'est imprimé devant "antivol Guardian".
Voici comment mettre au point l'exemple précédent à l'aide de IsNull :
If IsNull({Produits.Couleur}) Or InStr({Produits.Couleur}, " ") = 0 Then "de base" Else "fantaisie"