【问题标题】:SSRS #Error in combination with IIF and CdblSSRS #Error 与 IIF 和 Cdbl 结合使用
【发布时间】:2018-11-08 22:12:40
【问题描述】:

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

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 对这些函数的解释来看,它们应该返回一个布尔值,但不知何故我得到了 #Error :)

【问题讨论】:

  • 您是否尝试过删除最后一位数字之后的任何内容以删除欧元或英镑等内容。之后,您应该只剩下数值,因此您应该能够在不弹出 #Error 的情况下继续。
  • 我无法预测用户是否会输入一个整数(以及多少位数)和/或十进制数以及多少个小数位数。还有其他功能可以帮助我吗?

标签: reporting-services ssrs-2008


【解决方案1】:

只需将字段转换为数字使用

VAL(Fields!RSP.Value)

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

在您的情况下,使用单个 IIF,SWITCH 无关紧要,但在使用嵌套 IIF 或您可能遇到除以零错误的情况下,SWITCH 通常更易于阅读/调试。所以像这样的情况,我们有一个假设的情况,我们想要测试除以零并返回零,或者如果我们要除以的东西是负的,我们想要返回 -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
    )

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

【讨论】:

  • 感谢 Alan,VAL() 将其转换为数值,我会将其标记为答案,因为它解决了我的问题。如果您在此处给我一个 SWITCH 示例以供将来使用,我也将不胜感激:)
  • 这可能与您的情况无关,您通常会使用它来代替嵌套的 IIF。它通常用于避免在第一个表达式中测试零的情况下除以零。无论如何我都会用一个例子来更新答案。
  • 很好,很高兴知道VAL() 函数真的很有用。我以前从未听说过这个功能。
  • 是的,SSRS 使用(我认为是 vb.Net 的一个子集),并且有很多老式的 vb 函数可用。
【解决方案2】:

您可以使用此表达式来提取数值:

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

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

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

【讨论】:

  • Regex 在我的最后不起作用,在 System.Text 之后无法识别
  • 嗯,我认为这也存在于ssrs-2008 中。那么你可以使用这种方法:stackoverflow.com/questions/7608128/…
  • 哇,用这种方法我必须嵌套尽可能多的函数,因为我需要替换的字符。前任。 26个嵌套的Replace()只替换小写字母,另外26个替换大写字母+所有特殊字符和符号等。
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多