Somma di totali gruppo

venerdì 09 ottobre 2009 - 11.00

massimo_dt Profilo | Newbie

Buongiorno a tutti,
ho creato un report in SQL Reporting con un datatable che ha un raggruppamento e nel footer della table non riesco a sommare i subtotals dei gruppi.

In pratica ho una struttura fatta pressapoco così:
Row Subrow Qty Price
1 0 3 10,00
1 1 1 5,00
1 2 1 3,00
1 3 2 1,00
2 0 1 20,00
2 1 1 4,00

Ho creato un gruppo nella table che mi raggruppa le righe per il campo Row, nel footer del gruppo ho una formula che mi somma i prezzi per la quantità della prima riga e altre cose (sconti ecc...)
La mia esigenza adesso è quella di recuperare e raggruppare i footer dei gruppi in maniera tale da visualizzare il totale del documento, ma se creo un formula nel footer della table così:
=Sum(Fields!Prezzo.Value, "table1_Group1")
oppure
=RunningValue(Fields!Prezzo.Value, Sum, "table1_Group1")

Ma in tutti e 2 i casi mi ritorna un errore che non può valutare l'espressione perchè la funzione di aggregazione è fuori dallo scope.
Dove sto sbagliando?
Grazie
Massimo Dal Toso
.Net Developer

freeteo Profilo | Guru

Ciao Massimo,
il tuo problema appunto come ti eri accorto è relativo allo scope, ossia al "set di dati" che deve essere considerato, quindi di fatto la DataSource che hai agganciato alla tabella (la trovi selezionando la tabella intera->proprietà->DataSetName).

Ad esempio, se la datasource impostata alla tabella è "NorthwindDatasource " puoi mettere nel footer della tabella una textBox con questa Expression:
=Sum(Fields!Numero.Value,"NorthwindDatasource")
mentre per il footer del gruppo, appunto la Sum(...) senza "scope" tanto è per forza relativa al gruppo e quindi si arrangia ad azzerarla al cambio, mentre quel totale finale, viene calcolato su quella datasource "NorthwindDatasource" che lui chiama appunto "scope" dell'operazione.

Se ne hai di annidate, ovviamente devi mettere il nome corretto di quella che vuoi in gerarchia.

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

massimo_dt Profilo | Newbie

Ciao Matteo,
è corretto quello che dici, che puoi impostare lo scope nella formula della textbox all'interno del footer, ma non è quello che intendevo. In pratica facendo così fa la somma dei campi senza considerare la "separazione" in gruppi, giusto? Ho fatto un test veloce e mi sembra sia così. Quello che mi rimane poco chiaro è come posso sommare SOLO i campi dei footer dei totali di ogni gruppo, perchè al loro interno ci sono delle formule, ho provato anche una formula di questo tipo:

=Sum(ReportItems!txtSubTotalGrp.Value)

ma probabilmente non è la strada giusta, perchè mi ritorna un errore e chiaramente mi dice che la textbox in questione (che è quella del totale del gruppo) è fuori dallo scope del footer totale.

Scusa se sono stato un po' contorto nella spiegazione...
Massimo Dal Toso
.Net Developer

freeteo Profilo | Guru

mmm...forse il tuo caso è complesso, puoi inviarmi il report via email? Provo a darci un'occhiata appena riesco.
Grazie.

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

massimo_dt Profilo | Newbie

Inviato, grazie.

Intanto sto tentando varie strade, per esempio quella di creare una colonna calcolata con una formula per ogni riga e andarla a sommare nel footer generale.
Massimo Dal Toso
.Net Developer

freeteo Profilo | Guru

Ciao,
grazie per il report, ho avuto modo di capire meglio il tuo problema, ossia che nel footer del gruppo la somma che fai usa un "First" relativo al gruppo stesso, quindi non riesci a replicare la stessa formula nel footer della table, quindi a livello generale.

Puoi però usare un trucchetto, ossia usare il codice vb.net che il report ti permette di scrivere "behind", in maniera analoga a quanto spiegavo tempo fa qui: http://www.dotnethell.it/forum/messages.aspx?ThreadID=8171

Infatti puoi aggiungere una sezione aggiuntiva nel footer del gruppo (tasto Dx->Insert Section Below) e mettere la chiamata a quel codice (che tiene in memoria la somma del valore che gli passi ad ogni chiamata), mettendo il campo con l'expression:
=Code.Somma(Sum(Fields!Prezzo.Value) * First(Fields!Quantita.Value)

Chiaramente devi nasconderla sempre e visualizzarla solo quando sei sull'ultima riga, quindi nella riga aggiunta metti un'expression nella proprietà "Visibility.Hidden":
=RowNumber("#datasource#") <> Count(Fields!Quantita.Value,"#datasource#")
così capisci se sei nell'ultima riga (e quindi visualizzi questa riga aggiuntiva, che ti fa da "TableFooter").

L'unico inconveniente è che per ogni somma devi fare una funzione diversa, ma penso tu non ne abbia da fare tante, e cmq puoi passare alla funzione "Somma" qualsiasi valore numerico, quindi senza preoccuparti di "scope" o Aggregazioni, tu sai che gli passi il valore e lei la tiene in memoria sommandola ad ogni chiamata...


Ciao.

Matteo Raumer
[MCAD, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5