5

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

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 的类型相同。

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

4

4 回答 4

11

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

我怀疑整个宇宙中是否有足够大的地方来记录所有在 Crystal Reports 中不起作用的东西......

于 2011-01-07T16:07:49.997 回答
6

我知道我在这个问题上迟到了几年,但我在试图弄清楚同样的事情时遇到了这个问题。有趣的是,我什至在 Crystal Reports 文档中都找不到答案,而是在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 时,它会变得非常有趣。

于 2011-05-19T13:07:07.593 回答
5

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

于 2009-02-11T22:27:15.847 回答
-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 ';
于 2011-06-28T20:27:18.213 回答