2010-05-06 106 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

相關問題