2010-05-06 10 views
8

In SSRS 2008 sto cercando di mantenere una SUM di SUM su un gruppo utilizzando il codice personalizzato. Il motivo è che ho una tabella di dati, raggruppati e restituendo SUM dei dati. Ho un filtro sul gruppo per rimuovere le righe in cui le somme di gruppo sono pari a zero. Tutto funziona eccetto che sto incontrando problemi con i totali del gruppo: dovrebbe sommare i totali del gruppo visibile ma sommare l'intero set di dati. Ci sono un sacco di articoli su come aggirare questo, di solito usando un codice personalizzato. Ho fatto funzioni personalizzate e variabili per mantenere un contatore:Ripristino della variabile di codice SSRS nella nuova pagina

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 

Fondamentalmente CalcMedTotal viene alimentata una somma di un gruppo, e mantiene un totale parziale di tale somma. Quindi nella riga del gruppo I restituisco ReturnMedSubtotal che dovrebbe darmi il totale accumulato e resettarlo per il gruppo successivo. Questo funziona davvero bene, AD ECCEZIONE: sta ripristinando il valore GroupMedTotal in ogni interruzione di pagina. Non ho impostato le interruzioni di pagina in modo esplicito, è solo la naturale interruzione nel visualizzatore SSRS. E se esporto i risultati in Excel tutto funziona e sembra correttamente.

Se output Code.GroupMedTotal su ogni riga di gruppo, vedo che il conteggio è corretto, quindi se un gruppo si estende su più pagine nella pagina successiva, GroupMedTotal viene reimpostato e inizia nuovamente il conteggio da zero.

Qualsiasi aiuto su cosa sta succedendo o su come aggirare questo problema? Grazie!

+0

Ho lo stesso problema. Buon vecchio Microsoft di nuovo. –

risposta

19

Finalmente trovato la soluzione da solo. Eccolo, aggiungi Condiviso alle dichiarazioni delle variabili:

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

Questo dovrebbe essere contrassegnato come soluzione perché funziona. Per qualche motivo, le dll di riferimento vengono ripristinate anche quando vengono utilizzate variabili e metodi condivisi/statici su ogni nuova pagina. Tuttavia, i blocchi di codice inline non lo sono. Quindi, se non altro, puoi impostare variabili condivise per salvare i totali pagina per pagina e lasciare che tutte le altre funzionalità rimangano nelle tue DLL. –

+0

Questa risposta non è corretta. Prova ad eseguire il rapporto, quindi esporta in PDF. Vedrai che GrandMedTotal è effettivamente raddoppiato. – ScottRFrost

+0

Questo è sbagliato. La variabile condivisa aumenterà ad ogni chiamata. –

-2

Non so dove lo usi. ma nel tuo caso, se fossi in te, mi basta usare l'espressione semplice per controllare la visibilità di SUM

per esempio userei Right Click On Sum Box \ Select Expression \ then use IIF(SUM <> 0, sum. "")

Ha funzionato su ogni reset, dove e di solito, nel tuo caso si ha un Regione e il tuo codice verrà reimpostato in ogni regione, così potrai sfogliare serios isses se non cambierai la tua strada.

5

La semplice modifica delle variabili in condivisione non funzionerà. Se li imposti a condividere saranno DOUBLED quando esporti in PDF/XLS/etc (perché ha continuato ad aggiungere alla var esistente). Devi fare qualcosa del genere:

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

Questo ha funzionato per me. Il solo uso di Shared causa il problema del raddoppiamento discusso sopra. Notare l'uso della funzione Shared sulla funzione Initialize in modo che venga chiamata una sola volta. –

+1

Come e quando si chiama Initialize() ?? –

+0

Ho chiamato l'inizializzazione nella funzione GetGrandTotal(), che lo ha fatto per me – asmgx

Problemi correlati