Report con elenchi 'orizzontali' con Reporting Service

mercoledì 05 marzo 2008 - 15.07

intelinside Profilo | Newbie

Salve a tutti,

sto impazzendo con un report che in pratica serve per stampare delle etichette su un foglio A4.
Questo report deve stampare 3 colonne x 8 righe quindi in totale 24 etichette.

Ho creato un report con all'interno un ELENCO e dentro l'elenco vari campi che in pratica compongono l'etichetta.
Gestisco solo il corpo del report, e nel corpo ho definito 3 colonne.
La dimensione del corpo è ovviamente della singola etichetta che corrisponde all'intero elenco.

Il tutto funziona perfettamente: quando stampa in effetti vengono renderizzati N elenchi con all'interno i vari campi definiti.

Il problema è che l'ordine delle etichette non è orizzontale ma verticale jn pratica se si devono stampare 5 etichette ora stampa in questo modo:

1
2
3
4
5


Invece dovrebbe stampare in quest'altro modo:

1 2 3
4 5

Come faccio a cambiare l'ordine di stampa delle etichette ?

Grazie per l'aiuto !

freeteo Profilo | Guru

ciao,
purtroppo a differenza di Crystal Report,il pacchetto SqlReporting non ha una funzionalita' gia integrata che ti permetta di fare stampe orizzontali, tipicamente usate per stampare etichette.
La cosa pero' è fattibile ugualmente, sfruttando alcune sue caratteristiche e combinandole insieme:
- Nella sezione "Body" del report è possibile mettere diversi elementi "ripetitori" (List/Table) che ripetono i dati verticalmente indipendentemente gli uni dagli altri

- Gli elementi che ripeti sono oscurabili tramite la proprieta' "Visibility.Hidden" dove è possibile usare delle formule per discriminarne a runtime il comportamento

- La funzione "RowNumber(...)" mi dice all'interno dei "ripetitori" che record del datasource sta visualizzando

- La funzione "mod" mi da il resto di un'operazione di divisione

Combinando insieme queste features è possibile fare delle stampe di etichette, perche' basta dire al primo ripetitore di visualizzare solo i record 1, 4, 7... il secondo il record 2, 5, 8... il terzo i record 3,6,9... e via cosi'. E questo lo raggiungi lavorando con il resto che ti torna il "mod" perche' matematicamente:

1 mod 3 = 1 4 mod 3 = 1 .... 2 mod 3 = 2 5 mod 3 = 2 .... 3 mod 3 = 0 6 mod 3 = 0 ....

Dove "3" è il numero di colonne che vuoi, e il primo valore è il numero di record che deve visualizzare.
Discriminando questi valori per le liste che ci sono nel Body hai una "finta" ripetizione orizzontale dei record.


Un esempio è sicuramente piu' chiaro:

Es 3 colonne:
- Metti 3 List (o 3 Table) nel body
- Le agganci tutte e 3 alla stessa datasource (proprieta' DataSourceName)
- I Componenti li nascondi (visibility-Hidden) secondo queste formule:

1a Lista => iif(RowNumber(Nothing) mod 3 = 1, false , true)
2a Lista => iif(RowNumber(Nothing) mod 3 = 2, false , true)
3a Lista => iif(RowNumber(Nothing) mod 3 = 0, false , true)

il "false e il true" sono invertiti perche' la proprieta' è "visibility-Hidden" e quindi va al girata.
Ti ho allegato un esempio da cui puoi partire.

ciao.

Matteo Raumer
[MCAD .net]
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-2020
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5