2009-02-10 156 views
5

在这个网站上,这里和那里有关于这个问题的答案有一些提示,但我提出了一个稍微不同的问题。水晶报告公式:IsNull + Iif

Crystal Reports如何证明此语法不起作用?

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

我知道解决的办法是

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

但我们应该如何找出我们不能使用第一个版本?

为ISNULL文档说

  • 评估了当前记录中指定的字段,如果该字段包含空值

返回TRUE和IIF给

  • [返回]如果表达式为True,则truePart,如果expression为False,则为falsePart。返回值的类型与truePart和falsePart的类型相同。

我想,如果你盯着这行约“类型的返回值”你可以得到它,但是......

+0

我没有CRXI今天简洁,但是并不了解的第一个工作?它是否会让间距错误(这是代码中的逻辑错误 - 您有一个额外的Trim())或者以其他方式失败? – Stobor 2009-02-10 22:58:57

+0

对于.Middle为NULL的记录,CR无法评估Trim(.Middle)中的字符串值,并且决定Iif的值为NULL,即使我在那里有显式测试。 – SarekOfVulcan 2009-03-04 17:30:29

回答

5

我觉得CR会评估综合投资框架真假零件。因为您有“Trim({PatientProfile.Middle})”部分,那么将评估aganst null值,CR公式评估程序看起来只是失败。

+1

是的,但我试图找出它在血腥文档中的位置,而不是让所有遇到Google的人都能找到答案。毕竟,我们中有一两个人知道代码是如何工作的... – SarekOfVulcan 2009-03-04 17:31:33

+2

来自CR帮助: 在返回结果之前评估IIF函数的每个参数。因此,使用IIF时应注意不良副作用。例如,如果falsePart导致除零,即使表达式为True,也会发生错误,因此返回truePart。 – Arvo 2009-03-04 22:25:53

10

Crystal Reports如何证明此语法不起作用?

我怀疑有任何地方在整个宇宙中记录并不在Crystal Reports工作一切足够大......

+0

大声笑,感谢让我在这个美好的星期五笑了) – contactmatt 2012-06-08 20:18:45

5

我知道我多年来就这一个晚了,但我来了在试图弄清楚同样的事情的同时,在这个问题上。有趣的是,我甚至无法在Crystal Reports文档中找到答案,而是在link to IBM中找到答案。

如果您使用Crystal Reports 8.x或10.x,则和IIF不能一起使用。从网站:

原因

有在Crystal Reports 8.x和10.x中的缺陷,其防止在上式无法正常运作。 'IIF'和'IsNull'命令不能一起工作,包括尝试使用“Not”修改IsNull命令;例如,IIF(Not IsNull())。

解决问题

的解决方法是使用一个 “IF-THEN-ELSE” 语句。例如,

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

所以,如果你正在使用CR 8.x的或10.x的(我们是),你的运气了。当您将多个字段连接在一起时,它会变得非常有趣,其中一个字段可能为NULL。

-3

试试这个:

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 ';