2009-02-10 7 views
5

Es gibt Hinweise auf die Antwort auf diese Frage hier und da auf dieser Website, aber ich frage eine etwas andere Frage.Crystal Reports-Formel: IsNull + Iif

Wo dokumentiert Crystal Reports, dass diese Syntax nicht funktioniert?

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

Ich weiß, dass die Lösung

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

ist aber wie sollen wir uns die erste Version nicht, um herauszufinden, verwenden können?

Die Dokumentation für IsNull sagt

  • das Feld im aktuellen Datensatz angegeben Wertet und gibt TRUE zurück, wenn das Feld einen Nullwert

und Iif gibt

  • [Returns enthält ] truePart, wenn Ausdruck True und falsePart ist, wenn Ausdruck False ist. Der Typ des zurückgegebenen Werts entspricht dem Typ von truePart und falsePart.

Ich nehme an, wenn Sie in dieser Zeile über „Typ des Rückgabewert“ starren Sie es bekommen können, aber ...

+0

Ich habe CRXI nicht praktisch, heute, aber was nicht über die erste nicht funktioniert? Wird der Abstand nur falsch angezeigt (was ein logischer Fehler im Code ist - Sie haben ein zusätzliches Trim() drin) oder schlägt es auf andere Weise fehl? – Stobor

+0

Für Datensätze, in denen .Middle NULL ist, kann CR den Zeichenfolgenwert in Trim (.Middle) nicht auswerten und entscheidet, dass der Wert von Iif NULL ist, obwohl ich diesen expliziten Test dort habe. – SarekOfVulcan

Antwort

5

Ich denke, CR beide IIFs wahre und falsche Teile auswertet. Da Sie dort einen Teil "Trim ({PatientProfile.Middle})" haben, der gegen einen Nullwert ausgewertet wird, scheint der CR-Formel-Evaluator einfach fehlzuschlagen.

+1

Ja, aber ich versuche herauszufinden, wo in der verdammten Dokumentation es _says_ dies, anstatt jeden, der darauf hereinkommt, Google für die Antwort zu machen. Schließlich wissen ein oder zwei von uns, wie der Code _supposed_ funktioniert ... – SarekOfVulcan

+2

Von CR-Hilfe: Jedes Argument der IIF-Funktion wird ausgewertet, bevor das Ergebnis zurückgegeben wird. Daher sollten Sie bei der Verwendung von IIF auf unerwünschte Nebenwirkungen achten. Wenn zum Beispiel falsePart zu einer Division durch Null führt, tritt ein Fehler auf, selbst wenn der Ausdruck True ist und truePart zurückgegeben wird. – Arvo

10

Wo dokumentiert Crystal Reports, dass diese Syntax nicht funktioniert?

Ich bezweifle, dass es im ganzen Universum überall groß genug ist, alles zu dokumentieren, die nicht in Crystal Reports funktioniert ...

+0

lol, danke, dass du mich an diesem schönen Freitag zum Lachen gebracht hast;) – contactmatt

5

Ich weiß, ich bin spät dran Jahre auf diesem, aber ich kam auf diese Frage beim Versuch, das gleiche herauszufinden. Lustigerweise konnte ich die Antwort nicht einmal in der Crystal Reports-Dokumentation finden, sondern stattdessen in einer link to IBM. Wenn Sie Crystal Reports 8.x oder 10.x verwenden, arbeiten ISNULL und IIF nicht zusammen. Von der Website:

Ursache

Es ist ein Defekt in Crystal Reports 8.x und 10.x, die von der Arbeit richtig mit der obigen Formel verhindert. Die Befehle 'IIF' und 'IsNull' können nicht zusammen funktionieren, und dazu gehört auch der Versuch, 'Not' zu verwenden, um den IsNull-Befehl zu ändern. zum Beispiel IIF (Not IsNull()).

Problemlösung

Die Abhilfe ist es, eine "If-Then-Else" Anweisung zu verwenden.Zum Beispiel

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

Also, wenn Sie CR 8.x oder 10.x verwenden (was wir sind), sind Sie kein Glück. Es macht REAL Spaß, wenn Sie mehrere Felder miteinander verketten und einer davon NULL sein kann.

+1

Beachten Sie, dass selbst wenn Sie mehrere Felder miteinander verketten, die Syntax nicht zu schlecht ist, da Crystal Dinge wie diese unterstützt: (wenn IsNull ({Col1}) dann) 0 else {Col1}) + (wenn IsNull ({Col12}) dann 0 else {Col2}) – JoshL

-3

versuchen Sie dies:

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

Welche Frage soll das beantworten? – SarekOfVulcan