Raggruppare date in un report rdlc

venerdì 04 aprile 2008 - 10.19

Anubis Profilo | Junior Member

ciao a tutti,

io ho un report rdlc, con un grafico che viene disegnato in base a una query dinamica che io gli passo nel dataset...questa query effettua una ricerca per data, dandomi come risultato tutte le righe aventi la data compresa nel range che gli specifico:

select * from TABLE
where (to_date(TIME_APPL,'DD-MON-YY hh24:mi'))
between (to_date('3/04/2008 10:00:00','DD/MM/YYYY hh24:mi:ss')) and (to_date('3/04/2008 10:30:00','DD/MM/YYYY hh24:mi:ss'))
order by TIME_APPL

finché il range di date è piccolo il grafico mi risulta leggibile, ma se metto un range di date ampio il grafico diventa illeggibile, con troppi dati...

quello che volevo sapere è questo: si può visualizzare il grafico con le date raggruppate per mesi ad esempio??

freeteo Profilo | Guru

>quello che volevo sapere è questo: si può visualizzare il grafico
>con le date raggruppate per mesi ad esempio??
certo, quando sei in design del report, nel campo data che visualizzi, invece di usarlo diretto, passa attraverso una "Expression" dove prendi il "Month(...)" di quel campo:

=Month(Fields!data.Value)

cosi' i valori verranno raggruppati per mese


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Anubis Profilo | Junior Member

ok questo si può fare in fase di design...ma io avrei bisogno di farlo dal codice, ovvero poter dare la possibilità all'utente di visualizzare il grafico con le date raggruppate per mesi, o per giorni...

si può fare anche da codice??

freeteo Profilo | Guru

ciao,
per farlo da codice devi passare attraverso i parametri, ovvero passare un "booleano" al report da codice, il quale servo poi per essere la discriminante per farlo vedere in mesi oppure no.

Percio':
- aggiungi al report un parametro di tipo bool ad esempio "inMesi"
- nel report al posto dell'expression "month(..)" che ti ho consigliato prima, usa un "IIF" verificando il parametro:
=IIF(Parameters!inMesi.Value , Month(Fields!data.Value) , Fields!data.Value)

- passagli il valore del parametro scelto dall'utente, da codice:
.... carico il report LocalReport report = this.reportViewer1.LocalReport; report.ReportPath = "rdlc\\Report1.rdlc"; ..... gli passi i dati.... ..... passo il parametro... List<ReportParameter> parametri = new List<ReportParameter>(); parametri.Add(new ReportParameter("inMesi", "True")); report.SetParameters(parametri); this.reportViewer1.RefreshReport();



ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Anubis Profilo | Junior Member

Ok concettualmente ho capito...
l'unica cosa che non ho afferrato è cosa intendi con:

List<ReportParameter> parametri = new List<ReportParameter>();

o meglio, con List<ReportParameter>

(la mia applicazione è scritta in C#)

io ho come tipo "ReportParameter", e nel metodo Add dell'oggetto parametri mi dice che vuole 2 stringhe:

ReportParameter parametri = new ReportParameter(); parametri.Values.Add(new ReportParameter("mesi", true)); report.SetParameters(parametri); this.ReportViewer1.DataBind();

_The best overloaded method match for 'Microsoft.Reporting.WebForms.ReportParameter.ReportParameter(string, string)' has some invalid arguments

_Argument '2': cannot convert from 'bool' to 'string'


freeteo Profilo | Guru

>Ok concettualmente ho capito...
>l'unica cosa che non ho afferrato è cosa intendi con:
>
>List<ReportParameter> parametri = new List<ReportParameter>();
>
>o meglio, con List<ReportParameter>
>
>(la mia applicazione è scritta in C#)
che versione di Framework stai usando? quello che ti ho postato io è 2.0 ed è una Collection Tipizzata (di tipo "List" ) del framework, niente di particolare, solo che puoi sapere gia' in fase di definizione che tipo conterra'.
Se usi la versione 2003, non c'e'...sono stati introdotti con la 2005 (fmw 2.0) se invece lavori con 2.0 ma non la conosci, ti do questo link che ti illustra la tecnologia:
http://msdn2.microsoft.com/en-us/library/ms379564(VS.80).aspx

Io l'ho usanta perche' con il metodo "SetParameters" del report, accetta un "IEnumerable<T>" ovvero una collection.Io ho scelto un List, ma andava bene anche un array di ReportParameter, l'ho usata per abitudine (oramai diventata il default )



>io ho come tipo "ReportParameter", e nel metodo Add dell'oggetto
>parametri mi dice che vuole 2 stringhe:
>ReportParameter parametri = new ReportParameter();
>parametri.Values.Add(new ReportParameter("mesi", true));
>report.SetParameters(parametri);
>this.ReportViewer1.DataBind();
si, la classe base "ReportParameter" è di default stringa, poi ho visto che si arrangia lui dentro al report a farsi la conversione sua.
Altre classi "precise" per le tipologie diverse di parametri non ne ho trovate, ho sempre usato questa passando quello che serviva in stringa.



>_The best overloaded method match for 'Microsoft.Reporting.WebForms.ReportParameter.ReportParameter(string,
>string)' has some invalid arguments
>
>_Argument '2': cannot convert from 'bool' to 'string'
appunto come ti dicevo sopra vuole una stringa, tu passagli il valore "True"


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Anubis Profilo | Junior Member

ho guardato il link che mi hai dato e sono riuscito a sistemare il codice:

List<ReportParameter> parametri = new List<ReportParameter>(); parametri.Add(new ReportParameter("mesi", "true")); report.SetParameters(parametri); this.ReportViewer1.DataBind();

nel grafico ho sostituito con l'espressione che usavo prima quella che mi hai suggerito tu:

=IIF(Parameters!mesi.Value , Month(Fields!TIME_APPL.Value) , Fields!TIME_APPL.Value)

ora però mi da questo errore in fase di compilazione:

_The Group expression for the grouping ‘chart1_CategoryGroup1’ refers to a non-existing report parameter ‘mesi’

questo significa che devo fare qualcosa anche in fase di design?? cioé aggiungere il parametro mesi anche dalla parte di design??

freeteo Profilo | Guru

>ora però mi da questo errore in fase di compilazione:
>
>_The Group expression for the grouping ‘chart1_CategoryGroup1’
>refers to a non-existing report parameter ‘mesi’
>
>questo significa che devo fare qualcosa anche in fase di design??
>cioé aggiungere il parametro mesi anche dalla parte di design??
certo!
Apri il file RDLC, si attiva un Menu Report->Report Parameter e li aggiungi il parametro, a cui devi dare il nome "mesi" dato che poi è quello
che utilizzi per il grafico (e poi gli passi tramite codice)

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Anubis Profilo | Junior Member

ok sono riuscito a gestire il parametro dei mesi

ora però non riesco a gestire più parametri...ti spiego...io avrei bisogno di far vedere il grafico in 3 modi:
1. Raggruppando per mesi
2. Raggruppando per giorni
3. Senza raggruppare le date

per fare questo ho aggiunto 1 altro parametro e ho messo nell'Expression del grafico 2 espressioni, una per i mesi e l'altra per i giorni...in questo modo:


484x433 36Kb


nel codice quando passo i parametri imposto a "true" solo il parametro "mesi" o il parametro "day", impostando a false l'altro, così:

if (Bmesi) { parametri.Add(new ReportParameter("mesi", "true")); parametri.Add(new ReportParameter("day", "false")); } else { if(Bgiorni) { parametri.Add(new ReportParameter("day", "true")); parametri.Add(new ReportParameter("mesi", "false")); } else { parametri.Add(new ReportParameter("day", "false")); parametri.Add(new ReportParameter("mesi", "false")); } }

il grafico per mesi viene disegnato correttamente, il problema è che non raggruppa le date per giorni, cioé mi fa vedere il grafico dei giorni nello stesso modo di quello normale (senza raggruppamenti).
se io metto una sola espressione, (o quella dei mesi o quella dei giorni), il grafico viene disegnato correttamente...
appena metto le 2 espressioni non raggruppa più per giorni...

freeteo Profilo | Guru

ciao,
credo proprio che quelle righe di raggruppamento che hai messo, siano gerarchiche, ovvero vanno in cascata e non "insieme".
Devi fare tutto su un'unica espressione, facendo tu il "nesting" dei vari "IIF", in modo da fare cmq tornare un solo campo per cui raggruppare, discriminato da codice "Expression". Ad esempio:

=IIF(Parameters!mesi.Value , Month(Fields!data.Value) , IIF(Parameters!giorni.Value, Days(Fields!data.Value),Fields!data.Value) )

una cosa di questo genere...come vedi dentro ad una condizione dell'IIF, c'e' un altro IIF...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Anubis Profilo | Junior Member

si infatti dovevo mettere come dicevi tu gli IF annidati in un'unica espressione ...

grazie mille 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