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 时进行计算。
希望更有经验的人可以 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 时进行计算。