这个网站上到处都有这个问题答案的提示,但我问的问题略有不同。

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;如果表达式为 False,则返回 falsePart。返回值的类型与truePart和falsePart的类型相同。

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

有帮助吗?

解决方案

我认为 CR 评估 IIF 的正确部分和错误部分。因为你有“Trim({PatientProfile.Middle})”部分,它将根据空值进行评估,CR 公式计算器似乎失败了。

其他提示

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

我怀疑整个宇宙中是否有足够大的地方来记录水晶报表中不起作用的所有内容......

我知道我在这个问题上迟到了好几年,但我在试图弄清楚同样的事情时遇到了这个问题。有趣的是,我什至无法在 Crystal Reports 文档中找到答案,而是在一个 链接至 IBM.

基本上,如果您使用的是 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 时,这会变得非常有趣。

尝试这个:

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 ';
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top