[ReportViewer] Ripetere vari elementi nelle pagine successive

martedì 04 maggio 2010 - 19.38

alsatan Profilo | Newbie

Ciao a tutti, sono passato da poco dal Crystal al ReportViewer perchè avevo bisogno di stampare delle immagini in formato a4 come sfondo del report r Crystal "sfuoca" tutte le immagini.

Ora... ho creato una matrice che si trova nel centro del corpo del report, ho settato l'interruzione ogni 5 riche della matrice, ma mi si presenta questo problema:
Quando si passa alla pagina successiva la tabella non si trova più al centro del corpo ma si riallinea in alto, come posso fare per mantenere la posizione della tabella in tutte le pagine?

Avrei poi bisogno di ripetere anche altri dati nelle pagine seguenti, ovvero 2 textbox e 1 immagine.
Non posso metterli nell'header in quanto l'immagine stessa deve fungere da sfondo del report e non posso nemmeno metterla come backgroundimage in quanto come tale non posso poi regolare le dimensioni dell'immagine, ma la inserisce nelle sue dimensioni originali che essendo in 150dpi per stamparla meglio, me la fa vedere ingrandita, invece se la metto come "elemento immagine" e la porto in secondo piano, la posso poi regolare come meglio credo.

Grazie in anticipo

freeteo Profilo | Guru

Ciao,
perdona il ritardo nella risposta, probabilmente hai già risolto cmq ti rispondo lo stesso.
Il fatto che si sposta tra una pagina e l'altra mi fa pensare che possa essere un problema di pageHeader.

Altrimenti io proverei a mettere la matrice dentro ad una list, in modo che sia posizionata sempre nella stessa posizione, e alla list mettere il salto pagina ogni x valori...chiaramente devi avere una seconda datasource etc...quindi riprogettare un attimo il report.

Ciao.

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

alsatan Profilo | Newbie

ma non credo che sia l'header in quanto non lo uso proprio, ho eliminato sia header che piè di pagina...

Cmq non ho ancora risolto :) ma il problema ho capito qual'e'.... ovvero nella prima pagina ho i seguenti campi

------------------------------------------------
- TEXT BOX TEXT BOX TEXT BOX -
- TEXT BOX -
- -
- -
- -
- MATRICE (dalla riga 1 alla 5) -
- -
- -
- -
- -
------------------------------------------------

La seconda pagina diventa cosi



------------------------------------------------
- MATRICE (dalla riga 6 all 10) -
- -
- -
- -
- -
- -
- -
- -
- -
- -
------------------------------------------------

Quindi mi sa che ho dei problemi a creare i "gruppi"

Ne ho creato 1 nella matrice dove ho settato il gruppo per essere visto ogni 5 righe alla cui fine metto un interruzione di pagina...

Ma come faccio a dire che quando arriva alla riga 5 e passa alla pagina successiva, che mi ripeta anche la textbox1 textbox2 e textbox3?

freeteo Profilo | Guru

>Ma come faccio a dire che quando arriva alla riga 5 e passa alla
>pagina successiva, che mi ripeta anche la textbox1 textbox2 e
>textbox3?
Queste textbox sono su un gruppo? (in particolare nell'header del gruppo)
Se sì, allora nelle proprietà del gruppo imposti che l'header si ripeta ad ogni pagina: tasto DX sull'header->format group->repeat group header on each page.

Ciao.

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

alsatan Profilo | Newbie

Mi sa che io non ho ben capito il concetto di gruppo.... oppure come crearlo...

Io per gruppo intendo il "ragruppare" dei dati che ho dal mio dataset e dividerli per esempio per 5 righe in una tabella.

Cosi vado nella tabella poi proprietà poi sezione gruppi, ne creo uno e nell'espressione metto =Int((RowNumber(Nothing)-1)/5)

Cosi mi raggruppa i dati della tabella di 5 in 5.

Fino a qua ci siamo...

Ma come posso creare poi un "macro Gruppo" che quando si passa alla pagina 2 la tabella ricopi anche le textbox?

facciamo un esempio pratico...

Dal mio dataset leggo la tabella ORDINI e nelle proprietà dell origine dati già lo filtro con un paramentro per l'ordine che mi interessa visualizzare, cosi che ho un set di dati fatto cosi:

N° Ordine - Nome Cliente - Articolo - qta - prezzo

1 - Mario Rossi - 000001 - 2 - 25
1 - Mario Rossi - 000034 - 1 - 10
1 - Mario Rossi - 000005 - 3 - 50
1 - Mario Rossi - 000008 - 4 - 60
1 - Mario Rossi - 000002 - 3 - 30
1 - Mario Rossi - 000006 - 3 - 45
1 - Mario Rossi - 000022 - 1 - 15
1 - Mario Rossi - 000040 - 2 - 35


Ok .. io voglio che il report risulti cosi:

**********
*PAGINA 1*
**********

CLIENTE: MARIO ROSSI
ORDINE n: 1
ARTICOLI ORDINATI:8

RIEPILOGO ORDINE:

000001 - 2 - 25
000034 - 1 - 10
000005 - 3 - 50
000008 - 4 - 60
000002 - 3 - 30


**********
*PAGINA 2*
**********

CLIENTE: MARIO ROSSI
ORDINE n: 1
ARTICOLI ORDINATI:8

RIEPILOGO ORDINE:

000006 - 3 - 45
000022 - 1 - 15
000040 - 2 - 35

Quindi per le prime righe metto delle textbox con il valore

=First(Fields!cliente.Value)
=First(Fields!nOrdine.Value)
=Count(Fields!ID_Ordine.Value, "OrdiniDataSet_Ordine")

Poi inserisco una tabella che mi legge i campi Articolo - qta - prezzo ed ogni 5 righe mette un interruzione di pagina

Come faresti tu?

freeteo Profilo | Guru

Ciao,
forse la cosa è più semplice se alleghi il report, te lo modifico io e te lo modifico...basta solo il file .rdlc.
Grazie

Ciao.

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

alsatan Profilo | Newbie

ok...te lo allego subito, intanto direi che se hai qualche link di manuali su rdlc è la miglior cosa...qui mi mancano proprio le basi...

Cmq eccotelo in allegato, come vedrai c'e' una serie di text box e sotto una tabella, le textbox si devono ripete ad ogni pagina assieme all'immagine, l'importante è che sia tutto fatto nel BODY, senza usare header e piè di pagina del documento perchè li ci devo mettere altra roba, anzi te le metto già cosi ci capiamo meglio.

Grazie

freeteo Profilo | Guru

Ciao,
ok, ho visto il report, ti allego una gif animata che ti mostra i passi da fare:

640x480 711Kb

il campo su cui raggruppare sceglilo tu, io non avendo i dati non posso saperlo...inoltre non ho potuto provarlo a runtime, però quello che mi interessava era farti vedere il concetto.

Per quanto riguarda avere delle info, i posti migliori dove guardare sono:
http://www.gotreportviewer.com
http://www.microsoft.com/sqlserver/2008/en/us/reporting.aspx

Ciao.

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

alsatan Profilo | Newbie

Sei un grande... finalmente ho capito!! ci rimane una piccola cosa.... ovvero

Adesso mi fa quello che voglio a livello di dati, mi rimane solo 1 cosa sull'immagine:

Devo mettere un immagine che è il modulo di sfondo che il report in pratica compila e ho 2 problemi:
(metto l'immagine non come backgroudn della tabella, ma come oggetto immagine portato in secondo piano)

1)Mentre lavoro non vedo l'immagine completa, ovvero la tabella anche se settata come background transparent, in lavorazione la vedo bianca e ho difficoltà a posizionare i campi correttamente perchè non la vedo, poi quando compilo invece la vedo ok..c'e' soluzione o devo andare a naso?

2)Non riesco a far ripetere anche l'immagine nella seconda pagina...ho fatto proprietà dell'immagine e REPEAT WITH Table1 ma nella seconda pagina non la mette..

Qualche consiglio? Intanto ti accetto la risposta per il problema del thread

Grazie davvero intanto

freeteo Profilo | Guru

Ciao,
come hai portato dentro l'immagine, come "Embedded" come hai fatto con il logo di destra?
Dovrebbe essere di quel tipo perchè "faccia parte" del report (viene aggiunta al file che vedrai si ingrandisce della dimensione dell'immagine stessa) e in quel caso dovresti vederla sia a design, che a runtime...

Casomai posta un'immagine (o il report intero) per vedere come l'hai fatto e vedo di capire il motivo dell'errore...

Ciao.

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

alsatan Profilo | Newbie

Si l'immagine è embedded, cmq ho rifatto un report semplificato per farti capire il problema, vedrai l'immagine in design (l'immagine viene ricoperta dalla tabella con proprieta backgroundcolor = transparent)

poi le 2 pagine in runtime del report
( qui l'immagine si vede correttamente ma poi non viene ripetuta nella pagina 2)


1425x857 466Kb

1281x708 201Kb

1275x708 132Kb


ti allego anche l' rdlc di questo esempio

Mi viene il dubbio se usare sqlreporting con rdl che per quanto ho capito è fatto un po meglio (anteprima report etc etc) e poi convertirlo in rdlc....

freeteo Profilo | Guru

>poi le 2 pagine in runtime del report
>( qui l'immagine si vede correttamente ma poi non viene ripetuta
>nella pagina 2)
prova a mettere tutto dentro ad una List (quindi mettere i campi dentro ad essa, ed anche l'immagine) e dovrebbe venire ripetuta ogni pagina.



>Mi viene il dubbio se usare sqlreporting con rdl che per quanto
>ho capito è fatto un po meglio (anteprima report etc etc) e poi
>convertirlo in rdlc....
mi è capitato di farlo, proprio perchè si ha l'anteprima senza dover ogni volta debuggare/compilare l'applicazione...effettivamente è sempre codice "RDL" (quindi xml formattato secondo le specifiche del Report Definition Language)

Ciao.

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

alsatan Profilo | Newbie

Confermo che con sqlreporting anche in design si vede tutto perfettamente, è un bug del rdlc, speriamo esca qualche aggiornamento per risolvere questo errore.

Per la list ora provo... mi sa che avevo gia provato ma poi mi dava un errore con i campi di raggruppamento... eheh non riesco a entrare nella mentalità giusta su questi gruppi :) e cmq anche per i gruppi in sqlreporting è tutto più chiaro e accessibile!

Faccio delle prove con la List...se ho problemi ti seccherò di nuovo :)

Grazie sempre!

alsatan Profilo | Newbie

Ecco esatto se metto tutto dentro ad una list, mi da il seguente errore:

"Un'espressione di raggruppamento per l'oggetto ‘table1’ di tipo table utilizza la funzione RowNumber con un parametro di ambito che non è valido. Se utilizzato in un'espressione di raggruppamento, il valore del parametro di ambito di RowNumber deve essere uguale al nome del gruppo che contiene direttamente il gruppo corrente."

Perchè nell'espressione di raggruppamento della tabella utilizzo la seguente formula per dividere i dati in 5 elementi per pagina:

"=Int((RowNumber(Nothing)-1)/5)"

Come posso risolvere?

alsatan Profilo | Newbie

Allora...ho risolto l'errore sostituendo
"=Int((RowNumber(Nothing)-1)/5)"
con
"=Int((RowNumber("table1")-1)/5)"

Ma il risultato non cambia... cioè lui mette tutto nella prima pagina poi quando raggiunge l'espressione di raggruppamento della tabella "=Int((RowNumber("table1")-1)/5)" passa alla seconda pagina ma continua solo la table1 , la list nella seconda pagina sparisce...

alsatan Profilo | Newbie

RISOLTO!!!!
Ho tolto il raggruppamento "=Int((RowNumber("table1")-1)/5)" nella tabella e messo il raggruppamento

"=Int((RowNumber(Nothing)-1)/5)" nella lista!!

Cioè in pratica anche se nella lista in realtà è come se caricasse 1 record solo, poi al suo interno c'e' una tabella che carica 5 righe di record(con interruzione pagina sul gruppo della tabella) lui la conta comunque come se ci fossero 5 record nella lista e quindi passa alla pagina sucessiva con tutta la list...
Bho per me il ragionamento dei gruppi non è molto lineare cmq per lo meno sto entrando un pò nella mentalità...

Grazie di nuovo per tutto!

freeteo Profilo | Guru

>RISOLTO!!!!
>Ho tolto il raggruppamento "=Int((RowNumber("table1")-1)/5)"
>nella tabella e messo il raggruppamento
>"=Int((RowNumber(Nothing)-1)/5)" nella lista!!
esatto è quella il tuo "template" da ripetere, puoi anche fare a meno di usare la tabella dentro ad essa, puoi posizionare i campi direttamente liberi.



>Grazie di nuovo per tutto!
di niente, casomai accetta una risposta se ti è stata utile così marchiamo il thread come risolto.

Ciao.

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

alsatan Profilo | Newbie


>esatto è quella il tuo "template" da ripetere, puoi anche fare
>a meno di usare la tabella dentro ad essa, puoi posizionare i
>campi direttamente liberi.

No perché in alto nella list ho messo per esempio una textbox con ragionesociale, se metto tutti i campi liberi poi mi ripete anche quella 5 volte invece utilizzando la table e' come se caricasse 1 solo record nella list ma 5 record solo dentro la tabella, ma per lui essendo la tabella incorporata nella list ha soddisfatto comunque la condizione di Avere 5 record al suo interno... E' un po' contorto ma penso proprio che ragioni così....
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