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

时间:2012-12-11 15:08:41

标签: reporting-services ssrs-2008 dynamics-crm-2011 ssrs-expression

我正在针对某些列中包含空值的数据存储库编写报告。问题是建立表达与激素老太太一样气质,不喜欢我的功能混合。

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

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

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

看起来非常直截了当。并且表达的各个部分独立工作。 IE:IsNumeric(),DatePart()等。但是当我把它们放在一起时,表达式会抛出一个错误。

我试图对上面显示的内容进行每一种排列,但都无济于事。 Fields!ADataField.Value中的空值会导致错误。

生成的具体错误:

  

“textrun的值表达式”使用了   非数字数据的数字聚合函数。数字   聚合函数(Sum,Avg,StDev,Var,StDevP和VarP)只能   汇总数字数据。“

思想?

4 个答案:

答案 0 :(得分:1)

尝试使用:

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

答案 1 :(得分:1)

您可以使用以下方法处理发生的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
    )
)

答案 2 :(得分:1)

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字段在第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)
)

答案 3 :(得分:0)

大家好。我找到了解决方案。非常感谢所有伟大的建议。在我决定发布之前,我已经尝试了大部分内容。因此,理智检查非常有价值!

无论出于什么不合逻辑的原因,修复此问题的方法是将字段包裹在CInt()中甚至 后确认该字段已经是数字。如果没有它,它将不允许Sum()针对该字段运行。这是最终采用的代码:

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

我们在这里尝试过的任何和所有其他排列,包括那些使用RunningValue()的排列,都是在用CInt()包装IIF()的“真实”部分之后都能正常工作。

请不要斧头我为什么这样做,但它没有没有它。除了最基本的表达之外的任何东西似乎总是非常易变。

再次感谢大家。回答问题是GShenanigan在聊天期间加倍努力。希望我能把它交给每个人。你们真棒。