2009-02-10 17 views
5

Il y a des indices de réponse à cette question ici et là sur ce site, mais je pose une question légèrement différente. Où Crystal Reports documente-t-il que cette syntaxe ne fonctionne pas? Où?Formule Crystal Reports: IsNull + Iif

Trim({PatientProfile.First}) + " " 
    + Trim(Iif(
     IsNull({PatientProfile.Middle}) 
     , Trim({PatientProfile.Middle}) + " " 
     , " " 
     ) 
    ) 
+ Trim({PatientProfile.Last}) 

Je sais que la solution est

If IsNull({PatientProfile.Middle}) Then 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Last}) 
Else 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Middle}) 
     + " " + Trim({PatientProfile.Last}) 

mais comment sommes-nous censés comprendre que nous ne pouvons pas utiliser la première version?

La documentation IsNull dit

  • Évalue le champ spécifié dans l'enregistrement en cours et retourne TRUE si le champ contient une valeur null

et Iif donne

  • [retour ] truePart si l'expression est True et falsePart si l'expression est False. Le type de la valeur renvoyée est le même que le type de truePart et falsePart.

Je suppose que si vous regardez à cette ligne de « type de la valeur de retour » vous pouvez l'obtenir, mais ...

+0

Je n'ai pas CRXI aujourd'hui à portée de main, mais ce qui ne fonctionne pas sur le premier? Est-ce que l'espacement est juste incorrect (ce qui est une erreur logique dans le code - vous avez un Trim() supplémentaire) ou échoue-t-il d'une autre manière? – Stobor

+0

Pour les enregistrements où .Middle est NULL, CR ne peut pas évaluer la valeur de chaîne dans Trim (.Middle), et décide que la valeur de Iif est NULL, même si j'ai ce test explicite. – SarekOfVulcan

Répondre

5

Je pense que CR évalue à la fois des pièces IIF vrai et faux. Parce que vous avez "Trim ({PatientProfile.Middle})" partie là, qui sera évaluée aganst valeur nulle, l'évaluateur de formule CR semble juste échouer.

+1

Oui, mais j'essaie de comprendre où dans la documentation sanglante il _says_ ceci, au lieu de faire tout le monde qui s'y heurte Google pour la réponse. Après tout, un ou deux d'entre nous savent comment le code est _supposed_ pour fonctionner ... – SarekOfVulcan

+2

De CR help: Chaque argument de la fonction IIF est évalué avant que le résultat soit retourné. Ainsi, vous devriez faire attention aux effets secondaires indésirables lors de l'utilisation IIF. Par exemple, si falsePart entraîne une division par zéro, une erreur se produira, même si l'expression est True et que truePart est renvoyé. – Arvo

10

Où Crystal Reports documente-t-il que cette syntaxe ne fonctionne pas?

Je doute qu'il y ait tout lieu assez grand dans l'univers entier pour documenter tout ce qui ne fonctionne pas dans Crystal Reports ...

+0

lol, merci de me faire rire ce beau vendredi;) – contactmatt

5

Je sais que je suis en retard années celui-ci, mais je suis sur cette question en essayant de comprendre la même chose. Assez drôle, je ne pouvais même pas trouver la réponse dans la documentation de Crystal Reports, mais plutôt dans un link to IBM. Baiscally, si vous utilisez Crystal Reports 8.x ou 10.x, ISNULL et IIF ne fonctionnent pas ensemble. Sur le site:

cause

Il y a un défaut dans Crystal Reports 8.x et 10.x qui empêche la formule ci-dessus de fonctionner correctement. Les commandes 'IIF' et 'IsNull' ne peuvent pas fonctionner ensemble, et cela inclut d'essayer d'utiliser "Non" pour modifier la commande IsNull; par exemple, IIF (Not IsNull()).

Résoudre le problème

La solution consiste à utiliser une instruction "If-Then-Else".Par exemple,

If IsNull({~CRPT_TMP0001_ttx.install_date}) Then "TBD" Else "In Progress" 

Donc, si vous utilisez CR 8.x ou 10.x (que nous sommes), vous êtes hors de la chance. Cela rend vraiment amusant quand vous concaténer plusieurs champs ensemble et l'un d'entre eux pourrait être NULL.

+1

Notez que même si vous concaténéz plusieurs champs ensemble, la syntaxe n'est pas trop mauvaise, puisque Crystal supporte les choses comme ceci: (si IsNull ({Col1}) alors 0 else {Col1}) + (si IsNull ({Col12}) puis 0 sinon {Col2}) – JoshL

-3

essayez ceci:

currencyvar tt; 
currencyvar dect; 
tt :={ship.comm_amount}; 
dect := tt - Truncate(tt); 
tt := truncate(tt); 
dect := dect * 100; 
if dect = 0 then 
UPPERCASE('$ ' + ToWords (tt,0)) + ' ONLY' 
else 
UPPERCASE('$ ' + ToWords (tt,0) + ' And ' + ToWords(dect,0)) + ' ONLY '; 
+4

Quelle question est-ce censé répondre? – SarekOfVulcan