SSRS中的iif函数是否同时计算两个路径,还是会短路?

20

我正在尝试根据产品销售情况评估每千克的价格($/Kg)。如果在指定的时间段内未实际销售该产品,则会出现除以0(分母为千克)的错误,导致错误结果。我尝试了以下方法:

=iif(KgSold=0,0,Revenue/KgSold)

看起来,iif 函数正在计算 true 和 false 的结果。我该如何避免这种情况?

我应该使用 switch 函数吗?

=switch(KgSold=0,0
        KgSold<>0,Revenue/KgSold)
3个回答

17

你说得对,它不会短路。这很糟糕。

你需要做类似于这样的事情:

= Iif(KgSold = 0, 0, Revenue) / Iif(KgSold = 0, 1, KgSold )

开关功能也应该正常工作。


谢谢Robert。那确实有效。我仍然遇到了除以零的错误,所以现在只是要找出错误的原因。 - Nathan Fisher
我找到了错误发生的地方。它在 SQL 中而不是报告中。 - Nathan Fisher
尝试使用switch函数解决我的困境,但它似乎也会评估所有语句。 - Bill Blankenship
@UserSmith:那么使用我在这里发布的另一个变体。 - Robert Harvey
我的解决方案比上面的要复杂得多。尽管我发现这个解决方案......运行得相当不错。= REPLACE(Fields!MYFIELD_CONCAT.Value&" ",",","") - Bill Blankenship

6
这是因为在VBScript中,IIF中的所有条件都会先被评估,然后才会执行任何功能。

谢谢Brian。我想那就是情况了。我怀疑这对所有版本的VB都是适用的。 - Nathan Fisher
注意:完整的VB.NET现在具有IF()三元运算符,可以进行短路计算;但是正如所暗示的那样,SSRS使用的是VB脚本或“应用程序的VB”子集,并且没有这个功能。 - gremlin

0
将以下内容添加到您的代码中:
Public Function SafeDiv(byval num as double, byval den as double) as object

    If den = nothing then return nothing
    If den = 0 then return nothing

    return num / den

End Function

然后调用

=Code.SafeDiv(Revenue,KgSold) 

在文本框中输入表达式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接