SSRS代码变量在新页面上重置

Pet*_*ell 8 reporting-services ssrs-2008

在SSRS 2008中,我尝试使用自定义代码在组上维护SUM的SUM.原因是我有一个数据表,分组并返回数据的SUM.我在组上有一个过滤器,用于删除组总和为零的行.一切正常,除了我遇到组总数的问题 - 它应该是对可见组总数求和,而是对整个数据集进行求和.有很多关于如何解决这个问题的文章,通常使用自定义代码.我已经制作了自定义函数和变量来维护计数器:

Public Dim GroupMedTotal as Integer
Public Dim GrandMedTotal as Integer

Public Function CalcMedTotal(ThisValue as Integer) as Integer
    GroupMedTotal = GroupMedTotal + ThisValue
    GrandMedTotal = GrandMedTotal + ThisValue
    Return ThisValue
End Function

Public Function ReturnMedSubtotal() as Integer
    Dim ThisValue as Integer = GroupMedTotal
    GroupMedTotal = 0
    Return ThisValue
End Function
Run Code Online (Sandbox Code Playgroud)

基本上,CalcMedTotal以组的SUM形式提供,并保持该总和的运行总和.然后在组总线I中输出ReturnMedSubtotal,它应该给我累计的总数并将其重置为下一组.这实际上很有效,除了 - 它在每次分页时重置GroupMedTotal值.我没有明确设置分页符,它只是SSRS查看器中的自然中断.如果我将结果导出到Excel,一切正常并且看起来正确.

如果我在每个组行输出Code.GroupMedTotal,我看到它正确计数,然后如果一个组跨越下一页的多个页面,GroupMedTotal将被重置并再次从零开始计数.

任何有关正在发生的事情或如何解决这个问题的帮助?谢谢!

Joh*_*ler 20

终于找到了解决方案.在这里,将Shared添加到变量声明:

Public Shared Dim GroupMedTotal as Integer
Public Shared Dim GrandMedTotal as Integer
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为解决方案,因为它有效.由于某些原因,即使在每个新页面上使用共享/静态变量和方法时,也会重置引用的dll.但是,内联代码块不是.因此,如果没有别的,您可以设置共享变量以逐页保存总计,并让所有其他功能保留在您的dll中. (3认同)

Sco*_*ost 5

只是将变量更改为共享将无效.如果将它们设置为共享,则在导出到PDF/XLS/etc时它们将变为DOUBLED(因为它只是不断添加到现有的var中).你必须做这样的事情:

Public Shared Dim grandTotal as Decimal
Public Shared Dim costCenterTotal as Decimal
Public Shared Dim workerTotal as Decimal

Public Shared Function Initialize() 
    grandTotal = 0
    costCenterTotal = 0
    workerTotal = 0
End Function

Public Function AddTotal(ByVal b AS Decimal) AS Decimal
    grandTotal = grandTotal + b
    costCenterTotal = costCenterTotal + b
    workerTotal = workerTotal  + b
    return b
End Function

Public Function GetWorkerTotal()
    Dim ret as Decimal = workerTotal
    workerTotal = 0
    return ret
End Function 

Public Function GetCostCenterTotal()
    Dim ret as Decimal = costCenterTotal 
    costCenterTotal = 0
    return ret
End Function 

Public Function GetGrandTotal()
    Dim ret as Decimal = grandTotal
    grandTotal= 0
    return ret
End Function 
Run Code Online (Sandbox Code Playgroud)

  • 你怎么以及何时调用Initialize()? (2认同)