矩阵的奇数行包含表示整数的字符串。偶数行包含字符串,以mm / dd / yyyy格式表示日期。订单无法保证,如果有人更改了类别名称,则可能是另一种方式。
必须将总行添加到此矩阵中,但以下表达式会引发#Error:
=Sum(Iif(IsDate(Fields!Data.Value), 0, CInt(Fields!Data.Value)))
=Sum(Iif(InStr(Fields!Data.Value, "/"), 0, CInt(Fields!Data.Value)))
将0和字段值转换为其他一些数字数据类型也不起作用。
有趣的是,表达式部分适用于总计列,即它们计算数字的行总数,但是计算日期行的#Error。
保护行总计如下如下:
=Iif(Fields!Results.Value = "# of items", CStr(Sum(CInt(Fields!Data.Value))), "")
实施数据驱动的条件总计的正确方法是什么? 我可以在纯SQL中执行此操作并转储到心跳中的Tablix中,但这必须包含在SSRS中并与现有矩阵一起使用,否则不得更改。
答案 0 :(得分:3)
您在日期行上获得的#ERROR
是由于CInt
转换失败所致。
这是因为IIF
是一个函数,而不是一个语言构造,所以无论boolean condition参数的值如何,在传递给函数之前,都会对进行真值和误参数的计算。 。这意味着:
=Sum(Iif(IsDate(Fields!Data.Value), 0, CInt(Fields!Data.Value)))
无论IsDate
函数的结果如何,总是会尝试转换为整数。
尝试使用Val
代替CInt
。 CInt
的问题是当要转换的字符串是不合适的表单时出错; Val
没有那个问题 - 它只是抓住它可以的任何数字。所以你可以使用表达式:
=Sum(Iif(IsDate(Fields!Data.Value), 0, Val(Fields!Data.Value)))
然后简单地将其格式化为整数。
请注意,即使字段不是数字,Val
函数仍在运行,但此表达式成功,因为Val
函数不会引发Cint
之类的错误。我们只是进行计算,并在字段为日期时丢弃结果。
答案 1 :(得分:0)
此表达式将两个答案的提示与其他保护相结合,起作用:
=Iif(
IsNumeric(Fields!Data.Value),
Sum(Val(Iif(InStr(Fields!Data.Value, "/"), "", Fields!Data.Value))),
0
)