1

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

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

=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 '' 的 Value 表达式对非数字数据使用数字聚合函数。数字聚合函数(Sum、Avg、StDev、Var、StDevP 和 VarP)只能聚合数字数据。”

想法?

4

4 回答 4

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)
)))
于 2012-12-11T15:33:43.220 回答
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
    )
)
于 2012-12-11T15:35:26.520 回答
1

SSRS 中表达式中的 VB 不做短路评估。也就是说,一条语句的所有三个参数IIF都被求值,如果其中任何一个引发异常 ( #Error),那么整个表达式都会引发错误。)

所以无论 ADataField 的值是什么,这部分都会被评估:

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

即使代码无法返回结果(例如 whenIsNumeric(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)
)
于 2012-12-11T15:49:17.923 回答
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 在聊天期间加倍努力。希望我可以把它送给每个人。你们真棒。

于 2012-12-11T18:57:54.580 回答