2010-05-06 69 views
8

在SSRS 2008中,我尝试在使用自定义代码的组上维护SUM的SUM。原因是我有一个数据表,分组并返回数据的SUM。我在组上有一个过滤器来删除组合和为零的行。一切正常,除了我遇到组合总数问题 - 它应该总结可见组总数,而是总结整个数据集。有大量关于如何解决这个问题的文章,通常使用自定义代码。我做了自定义函数和变量保持计数器:在新页面上重置SSRS代码

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 

基本上CalcMedTotal被送入一组的总和,并保持运行总计那一笔。然后在组总计行I中输出ReturnMedSubtotal,它应该给我累积的总数并将其重置为下一组。这实际上效果很好,除了 - 它正在重置每个分页符上的GroupMedTotal值。我没有明确设置分页符,它只是SSRS查看器中的自然分页符。如果我将结果导出到Excel,一切正常并看起来正确。

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

在发生什么或如何解决此问题方面有什么帮助?谢谢!

+0

我有同样的问题。好的“微软再次。 – 2010-09-30 15:43:45

回答

19

终于找到了自己的解决方案。在这里,添加共享变量声明:

Public Shared Dim GroupMedTotal as Integer 
Public Shared Dim GrandMedTotal as Integer 
+3

这应该被标记为解决方案,因为它可以工作。由于某些原因,即使在每个新页面上使用共享/静态变量和方法时,也会重置引用的dll。但是,内联代码块不是。因此,如果没有别的,您可以设置共享变量来逐页保存总计,并让所有其他功能保留在您的dll中。 – 2011-09-16 21:35:00

+0

这个答案不正确。尝试运行报告,然后导出为PDF。你会看到GrandMedTotal实际上翻了一番。 – ScottRFrost 2013-06-04 12:45:07

+0

这是错误的。每次调用共享变量都会增加。 – 2015-01-22 08:29:03

-2

我不知道你在哪里使用这个。但在你的情况,如果我是你,我只是用简单的表达来检查SUM

的知名度比如我会用Right Click On Sum Box \ Select Expression \ then use IIF(SUM <> 0, sum. "")

它的工作的每一个地方,并不会复位,你的情况,你有一个区域和您的代码将在每个区域重置,所以如果您不改变方式,您将面对严重的问题。

5

只是将变量更改为共享将无法正常工作。如果将它们设置为共享,那么当您导出到PDF/XLS /等时(因为它只是添加到现有的变量),它们将会变成双倍。你必须这样做:

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 
+0

这个为我工作。只是使用Shared会导致上面讨论的加倍问题。注意在Initialize函数中使用Shared,所以它只被调用一次。 – 2016-02-21 22:24:02

+1

你如何以及何时调用Initialize()? – 2017-02-10 12:05:03

+0

我在GetGrandTotal()函数中调用了initialize,它为我做了 – asmgx 2017-05-12 03:47:25