【问题标题】:Lazy evaluation in SSRSSSRS 中的惰性评估
【发布时间】:2008-12-23 12:18:57
【问题描述】:

我正在使用 SSRS 2005 生成报告,报告中的一列是简单的平均值计算。我不想除以零,所以对于我输入的文本框值:

=Switch(Fields!Count.Value=0,0,Fields!Count.Value>0,Fields!Sum.Value/Fields!Count.Value)

这仍然计算第二个表达式。

也是如此:

=IIF(Fields!Count.Value=0,0,Fields!Sum.Value/Fields!Count.Value)

我不希望我的报告显示错误。我该如何克服这个问题?

【问题讨论】:

  • 你可以在你引用的实际存储的proc或sql语句中执行计算吗?如果我能以某种方式在 SP 本身中做到这一点,我会尽量避免在 SSRS 中做任何不寻常的事情。
  • 我可以这样做...但我不想!
  • 我也在查询不用于其他目的的查询中执行此操作(即,它嵌入在报告中)。我只是觉得它更容易,更不可预测。

标签: vba reporting-services switch-statement iif


【解决方案1】:

不幸的是,因为 IIF 实际上只是一个函数,所有参数都会在函数被调用之前被评估(导致你被零除)。

在表达式中嵌入复杂逻辑的一种方法是在报表中嵌入函数。您可以编写一个 VB 函数,在报告属性的代码选项卡中返回您喜欢的任何内容。

Public Function GetMeanValue(ByVal Sum as Decimal, ByVal Count As Int) As Decimal
    'your logic in plain old vb syntax here

End Function

在文本框文本表达式属性中:

=Code.GetMeanValue(Fields!Sum.Value, Fields!Count.Value)

【讨论】:

    【解决方案2】:

    检查零时,我总是这样否定表达式:

    =IIF(Fields!Count.Value<>0,Fields!Sum.Value/Fields!Count.Value,0)
    

    如果Count 字段为空/null,则可以避免除法。

    【讨论】:

      【解决方案3】:

      试试这个:

      =IIf(Fields!Count.Value = 0, 0, Fields!Sum.Value / IIf(Fields!Count.Value = 0, 1, Fields!Count.Value))

      【讨论】:

        【解决方案4】:

        这是一直对我有用的解决方案: Avoiding Divide By Zero Errors.

        如果报告的部门太多,就会变得乏味。我更喜欢一些 vb 代码来进行除法并处理除以零。不确定过多的 vb 代码是否会降低报告的性能。

        这里是how to do it with vb 将他的链接替换为archive.org 链接。以下是该链接的相关内容:

        而不是将该计算放入所有文本框中 做部门我去报告>>报告属性>>代码和 输入以下代码:

        Public Shared Function Divide(Num1 as double, Num2 as double) AS 对象

            IF ISNOTHING(Num2) Or Num2 = 0 Then
                Divide = "n/a"
            ELSEIF Num1 = 0 THEN
                Divide = 0
            ELSE
                Divide = Num1  / Num2
            END IF
        End Function
        

        然后在我需要做的报告的每个文本框中 除法,我这样调用函数:

        =Code.Divide(1, 0)
        

        【讨论】:

        • 第二个链接失效了。
        猜你喜欢
        • 2015-05-29
        • 2014-02-08
        • 2013-03-11
        • 2017-01-18
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多