Crystal Reports公式:IsNull + Iif

时间:2009-02-10 20:04:18

标签: crystal-reports isnull iif-function

在这个网站上有这个问题的答案提示,但我问的是一个稍微不同的问题。

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给出

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

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

4 个答案:

答案 0 :(得分:10)

  
    

Crystal Reports在哪里记录此语法不起作用?

  

我怀疑在整个Universe中有足够大的空间可以记录在Crystal Reports中无效的所有内容......

答案 1 :(得分:5)

我认为CR会评估两个IIF的真假部分。因为那里有“Trim({PatientProfile.Middle})”部分,它将被评估为aganst null值,CR公式评估器似乎只是失败。

答案 2 :(得分:5)

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

通过Baiscally,如果您使用的是Crystal Reports 8.x或10.x,则ISNULLIIF无法一起使用。来自网站:

  

<强>原因

     

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 :(得分:-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 ';