SSRS #Error 结合 IIF 和 Cdbl

SSRS #Error in combination with IIF and Cdbl

希望更有经验的人可以 answer/solution 解决我的问题。 在数据库中,我有两列,一列用于控制我们是否显示数据,要显示的数据在第二列中。 我有如下数据和表达式:

ShowPriceOnMatrix | RSP
-------------------------------
0                 | 1.48
1                 | 10.26 euro    -> This one fails with #Error
1                 | 4.59
0                 | 7.12


=IIF(Fields!ShowPriceOnMatrix.Value = 1, CDbl(Fields!RSP.Value), "")

这个表达式有时会给我#Error。 问题是 RSP 字段被定义为 nvarchar,我现在无法更改它,所以我正在尝试转换为数字并显示为。一些用户在输入价格时也会输入文本 ex。 “12.45 欧元”或类似名称。当表达式命中带有文本的值时,即使第一列声明不显示价格,整个 IIF 也会失败并显示#Error。

IIF 的问题在于,如果第一个参数的计算结果为 false,它不会跳过第二个参数 - 因此在我的例子中会产生 #Error。

我试过

IsNumeric(Cdbl(Fields!RSP.Value))

IsError(Cdbl(Fields!RSP.Value))

但他们都给出了#Error。从 SSRS 对这些函数的解释来看,它们应该 return 一个布尔值,但不知何故我得到了#Error :)

您可以使用这个表达式来提取您的数值:

=System.Text.RegularExpressions.Regex.Replace(Fields!RSP.Value, "[^0-9,]", "")

但是你必须照顾 1.48 中的 .。使用 , 和语言 DE 它对我有用。使用 . 它将是:

=System.Text.RegularExpressions.Regex.Replace(Fields!RSP.Value, "[^0-9.]", "")

只需使用

将字段转换为数字
VAL(Fields!RSP.Value)

此外,您可能要考虑使用 SWITCH 而不是 IIF。 SWITCH 在第一个计算结果为 True 的表达式处停止,而 IIF 将计算所有表达式,无论它们是否会被使用。

在您的情况下,对于单个 IIF,SWITCH 是不相关的,但在使用嵌套 IIF 的情况下或您可能出现被零除错误的情况下,SWITCH 通常更容易 read/debug。所以像这样的事情,我们有一个假设的情况,我们想要测试除以零和 return 零,或者如果我们除以的东西是负数,我们想要 return -1,否则做计算...

=IIF(Fields!MyDivisor.Value = 0, 0, IIF(Fields!MyDivisor.Value <0, -1,  Fields!MyNumber.Value/ Fields!MyDivisor.Value))

会变成

=SWITCH (
    Fields!MyDivisor.Value =0, 0,
    Fields!MyDivisor.Value <0, -1,
    True, Fields!MyNumber.Value/ Fields!MyDivisor.Value
    )

每个 expression/result 对按顺序计算,直到它达到第一个 True 表达式,所以如果 MyDivisor 为零,它将 return 0 并停止,如果它为负,它将 return -1 并停止。最后的 True 就像一个 else(因为 True 总是 returns True !)所以它只会在所有其他表达式 returned false 时进行计算。