【问题标题】:SSRS 2008r2 Using Aggregate on field with an ExpressionSSRS 2008r2 使用带有表达式的字段聚合
【发布时间】:2015-03-18 15:29:03
【问题描述】:

SSRS 2008r2

我正在尝试对包含表达式的 GROUPing 中的字段执行聚合(求和)。

我希望 SUM 出现的字段在不同的 GROUPing 中。

我在报表属性中创建了以下函数

Dim public tot_OT_Hrs As Decimal 

Public Function Add_OT_Hrs(ByVal OT_Hrs As Decimal) AS Decimal 

    tot_OT_Hrs = tot_OT_Hrs + OT_Hrs 

    return OT_Hrs 

End Function 

Public Function GetTotal() 
    return tot_OT_Hrs 
End Function

我在表达式所在的字段中添加了对“Add_OT_Hrs”函数的调用,这工作正常。

=Code.Add_OT_Hrs(
    IIF(Sum(Fields!HrsWorked.Value) > Parameters!StdWorkingHrs.Value, 
        Sum(Fields!HrsWorked.Value) - Parameters!StdWorkingHrs.Value + Sum(Fields!Rate1Hrs.Value)
            , Sum(Fields!Rate1Hrs.Value ) 
        )
    )

Fields!Rate1Hrs.Value 是表达式所在的字段,Fields!HrsWorked.Value 是相邻字段

但是,我想总计出现的字段我添加了以下内容

=Code.GetTotal()

在 GROUPing 的每一行中返回的都是 0(零)。如果我将 Dim public tot_OT_Hrs As Decimal 变量初始化为 1.2,那么 GROUPing 中的每一行都会返回 1.2。 Add_OT_Hrs 函数未按预期工作。

我哪里错了?

提前致谢。

【问题讨论】:

  • 您能否发布您用于 Add_OT_Hrs 字段的表达式
  • 我已经用表达式@SFrejofsky 更新了这个问题。 Fields!Rate1Hrs.Value 是表达式所在的字段,Fields!HrsWorked.Value 是相邻字段
  • 尝试将总和和值隐式转换为十进制。那里可能会出现错误,因为 SSRS 并不总是正确处理转换,尤其是当您的文本框设置为通用而不是特定数据类型时。您还可以删除 iif 语句并仅使用 sum 并查看返回的值是什么。
  • 我已将文本框属性更改为数字,它已设置为常规。我已经删除了 IIF 语句并将总和留在原处 =Code.Add_OT_Hrs(Format(CDbl(Sum(Fields!Rate1Hrs.Value)),"00.00")) 并且我仍然得到零。
  • 如果我像public tot_OT_Hrs As Decimal = 1.2 那样初始化tot_OT_Hrs 变量,那么GetTotal() 函数的返回值为1.2。看来Add_OT_Hrs 函数工作正常。有什么想法吗?

标签: reporting-services sql-server-2008-r2 ssrs-2008-r2


【解决方案1】:

在我看来,您转换的顺序错误,数据类型也错误。在您使用的代码示例中,您将 sum 转换为不是正确数据类型的 double。使用自定义函数时,双精度和小数之间存在显着差异。

我用一个非常小的数据集进行了如下测试

select '1.2'
union all 
select '1.8'

然后应用以下自定义代码

Dim public total as decimal
Public Function AddTotalr(ByVal r AS decimal) AS decimal
            total = total + r
            return r

End Function

Public Function GetTotalr()
            return total
End Function

显式转换的顺序至关重要。您必须在对总数求和之前转换值,以便使用一致的数据类型。

=code.addtotalr(sum(cdec(Fields!ID.Value)))

即使使用正确的数据类型,这也会产生错误,因为您试图对最有可能被解释为字符串的内容求和。

=code.addtotalr(cdec(sum(Fields!ID.Value)))

-----------编辑 ------------

作为测试,看看函数的返回是什么,将你的函数更改为

Dim public total as decimal
Public Function AddTotalr(ByVal r AS decimal) AS decimal
        total = total + r
        return total

这应该会为您提供已处理项目的运行总数,并且列表中的最后一个值应该与您的总数相匹配。

【讨论】:

  • 我对表达式=Code.Add_OT_Hrs( IIF(Sum(cdec(Fields!HrsWorked.Value)) > cdec(Parameters!StdWorkingHrs.Value), Sum(cdec(Fields!HrsWorked.Value)) - cdec(Parameters!StdWorkingHrs.Value) + Sum(cdec(Fields!Rate1Hrs.Value)) , Sum(cdec(Fields!Rate1Hrs.Value ) ) ) )做了如下修改,返回的值还是0.00..
  • 您是否确认如果您删除 code.add_ot_hrs(),此 IIF 语句将返回每个字段的正确值
  • 是的。无论是否使用 code.add_ot_hrs(),IIF 语句都会返回正确的值。是否因为字段位于可能导致问题的不同组中?
  • 这不应该是因为您使用自定义函数来规避分组。您是否偶然使用了多个自定义函数?
  • 不,这些是报告中唯一的自定义函数。
【解决方案2】:

我决定在 proc 中执行此操作。 现在效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多