如何在复杂的SSRS表达式中混合函数



我正在针对某些列中具有null值的数据存储库编写报告。问题是,构建表情就像一个荷尔蒙分泌旺盛的老太太一样喜怒无常,不喜欢我把各种功能混合在一起。

下面是我写的一个表达式,如果字段中的数据为空/无,它就不起作用:

=IIF(
IsNumeric(Fields!ADataField.Value),
RunningValue(
IIF(
DatePart("q", Fields!CreatedOn.Value) = "2",
Fields!ADataField.Value,
0
),
Sum,
Nothing
),
Sum(0)
)

(伪码)如果数据有效,并且数据是在今年第二季度创建的,则将其添加到总总和中,否则,将零添加到总和中。

看起来很直。而表达的各个片段是自己发挥作用的。IE:IsNumeric()、DatePart()等。但当我把它们放在一起时,表达式会抛出一个错误。

我已经尝试了上面显示的每一种排列,但都无济于事。字段中有空值!ADataField.Value导致错误。

生成的特定错误:

"textrun"的Value表达式使用对非数字数据执行数字聚合函数。数字聚合函数(Sum、Avg、StDev、Var、StDevP和VarP)只能聚合数字数据。">

想法?

您可以使用处理出现的NULL值

Iif(Fields!ADataField.Value Is Nothing, 0, Fields!ADataField.Value)

通过这种方式,您可以将任何Null值替换为其他值(在上面的示例中为0)。要将其放在表达式的上下文中,它应该看起来像这样:

=Iif(Fields!ADataField.Value Is Nothing,0,
RunningValue(
IIF(
DatePart("q", Fields!CreatedOn.Value) = "2",
Fields!ADataField.Value,
0
),
Sum,
Nothing
)
)

尝试使用这个:

=SUM(IIF(ISNothing(Fields!ADataField.Value), 0, 
(IIF(IsNumeric(Fields!ADataField.Value), IIF(DatePart("q", Fields!CreatedOn.Value) = "2", Fields!ADataField.Value, 0), 0)
)))

SSRS中表达式中的VB不进行短路评估。也就是说,对IIF语句的所有三个参数进行求值,如果其中任何一个抛出异常(#Error),则整个表达式将抛出错误。)

因此,无论ADataField的值是多少,都将对这一部分进行评估:

RunningValue(
IIF(
DatePart("q", Fields!CreatedOn.Value) = "2",
Fields!ADataField.Value,
0
),
Sum,
Nothing
),

即使代码无法返回结果,也会发生这种情况,例如IsNumeric(Fields!ADataField.Value)为false时。

因此,您将始终执行RunningValue函数,如果CreatedOn字段在Quarter 2中时ADataField中有非数字数据,那么这将为每个调用生成一个错误。

试试这个作为替代方案:

=IIF(
IsNumeric(Fields!ADataField.Value),
RunningValue(
IIF(
DatePart("q", Fields!CreatedOn.Value) = "2"
AND IsNumeric(Fields!ADataField.Value),
Fields!ADataField.Value,
0
),
Sum,
Nothing
),
Sum(0)
)

大家好。我想出了解决办法。非常感谢你的建议。在我决定在这里发帖之前,我已经尝试过其中的大多数。因此,理智检查非常有价值!

无论出于何种不合逻辑的原因,修复此问题的方法是将字段包装在CInt()中,甚至在之后,该字段已被确认为数字。如果没有Sum(),它就不允许在球场上运行

=Sum(
IIF(
IsNumeric(Fields!ADataField.Value) And
DatePart("q", Fields!createdon.Value) = "1",
CInt(Fields!ADataField.Value),
0
)
)

我们在这里尝试过的任何其他排列,包括使用RunningValue()的排列,都是在用CInt()封装IIF()的"true"部分后工作的。

请不要责怪我为什么这是有效的,但没有它也不是。除了最基本的表达方式之外,任何东西似乎都是极其多变的。

再次感谢大家。GShenanigan在聊天过程中付出了额外的努力,回答了这个问题。希望我能把它送给每个人。你们太棒了。

最新更新