【问题标题】:Crystal Reports formula: IsNull + Iif水晶报表公式:IsNull + Iif
【发布时间】:2009-02-10 20:04:18
【问题描述】:

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

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

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

【问题讨论】:

  • 我今天手边没有 CRXI,但是第一个有什么不工作的呢?它只是间距错误(这是代码中的逻辑错误 - 你有一个额外的 Trim() 在那里)还是以其他方式失败?
  • 对于 .Middle 为 NULL 的记录,CR 无法评估 Trim(.Middle) 中的字符串值,并决定 Iif 的值为 NULL,即使我在那里进行了显式测试.

标签: crystal-reports isnull iif-function


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 请注意,即使您将多个字段连接在一起,语法也不会太糟糕,因为 Crystal 支持这样的事情: (if IsNull({Col1}) then 0 else {Col1}) + ( if IsNull({Col12}) 然后 0 否则 {Col2})
    【解决方案3】:

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

    【讨论】:

    • 是的,但我试图找出它在血腥文档中的哪个位置,而不是让遇到它的每个人都谷歌寻找答案。毕竟,我们中的一两个人知道代码应该如何工作......
    • 来自 CR 帮助:在返回结果之前评估 IIF 函数的每个参数。因此,在使用 IIF 时应注意不良副作用。例如,如果 falsePart 导致被零除,则会发生错误,即使表达式为 True 并返回 truePart。
    【解决方案4】:

    试试这个:

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

    【讨论】:

    • 这应该回答什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多