Newsgroup: it.comp.lang.delphi
Titolo: Report: creare tabella con colonne e righe invertite

Magari qualcuno di voi ci ï¿œ giï¿œ passato: dal mio programma delphi devo 
stampare un report con una griglia particolare, una griglia dove le 
colonne sono dinamiche.
Vale a dire che le colonne potrebbero essere 1, 2.. 10 in funzione di 
un filtro impostato dall'utente. Mentre le righe sono sempre fisse.
Es.
----------------------------------------
       | Cli_1 | Cli_2 | ..... | Cli_n |
----------------------------------------
Media  | 123.2 |125.2  |       |  129.2|
Var    |  21   | 33    |       |       |
Scost  |   3   |  2    |       |       |
Incid  |   0   |  0    |       |       |
Secondo voi come si puï¿œ impostare questa cosa? Vorrei evitare di 
scrivere codice nel report.. ï¿œ la prima volta che devo fare una cosa 
simile.
Non ditemi che si potrebbe scambiare righe con colonne perchï¿œ ci ho giï¿œ 
provato io ma il committente non ne vuole sapere: per lo stesso 
coefficiente, lui vuole leggere la sequenza da sinistra a destra.
Sto usando: delphi 5 + ReportBuilder 7.04
Grazie
Ciao
-- 
Morde

Morde ha scritto:

non uso reportbuilder ma, per logica, quante sono le colonne max?
se sono N ï¿œ un conto
se il numero ï¿œ finito ï¿œ un'altro
comunque la vedo dura senza scrivere codice nel report..

 colonne sono dinamiche.
Presumo che con rb tu possa crearle a runtime...
A.

 
Senza scrivere codice ... non so :(
Io per un esigenza simile mi sembra di aver fatto:
Ho creato un subreport dove deve essere stampata la tabella e 
nell'evento beforeprint (mi sembra non ho sottomano il progetto) conto i 
campi nella mia pipeline e creo al volo i componenti pplabel e 
ppDBText,(ovviamente puoi immaginare tutte le varie imprecazioni dovute 
al posizionamento e alla width del campo :P ) e a questi ultimi ci 
attacco la pipeline e lascio che RB faccia il resto.
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 Presumo che con rb tu possa crearle a runtime...
Ho dimenticato di specificare che la struttura del report, il file rtm, 
deve essere statica perchï¿œ viene poi passata ai responsabili della 
traduzione e quindi non posso alterarla runtime.
Ciao
-- 
Morde

 comunque la vedo dura senza scrivere codice nel report..
E' questo quello che temo.. per questo ho cercato consiglio qui.
Al momento non ho trovato ancora una soluzione.
Vedremo..
Ciao
-- 
Morde

 Senza scrivere codice ... non so :(
[CUT]
E' questo quello che temo.
Purtroppo non e' una soluzione facilmente percorribile perchï¿œ il file 
dovrï¿œ essere sottoposto a traduzione pertanto tutte le label dovranno 
giï¿œ essere presenti nell'RTM al momento del rilascio.
Ciao
-- 
Morde

 
Forse dico una cosa nota (alias cavolata), ma non puoi mettere le label 
con la proprietà visible a False e attivarle all'occorenza ??
... sempre via codice :)


 ... sempre via codice :)
Guarda, francamente non capisco come si possa fare in modo rapido e 
indolore.
Una classica tabella la realizzo mettendo i ppDBText nella riga,e 
quelli ti mostreranno riga per riga tutti i dati del ppDBPipeline, 
usando ppLabel come intestazioni di colonna (quelli che vengono 
tradotti dai traduttori). Ma le colonne sono fisse.
Il mio problema ï¿œ che non riesco a trovare una soluzione per fare 
questo in modo invertito.
Il flusso dei dati che alimentano la tabella sul report ha uno sviluppo 
per sua stessa natura di tipo verticale.. riga per riga viene disegnata 
dal motore, ed io non riesco a capire come farlo espandere in 
orizzontale.. e se questo e' possibile. stiamo parlando di colonne 
dinamiche :-?
Ciao
-- 
Morde

Morde ha scritto:

la butto lï¿œ, una view invertita sui dati e passi quella al report?


Usare un file di appoggio temporaneo con N colonne e 4 righe precaricato 
prima di stampare
e poi stampare questo file ?
C. 

Morde ha scritto:

Non ho mai usato ReportBuilder pero' penso che tu ti debba rassegnare ad 
usare ppLabel al posto di ppDBText per i dati delle righe. Per ogni riga 
cicli per tutti i record prendendo il campo che t'interessa (Media, Var, 
Scost, Incid) e assegnando il valore, opportunamente formattato, alla 
ppLabel.
Si possono creare al volo le ppLabel? Se si' e' abbastanza semplice 
crearle, assegnare loro il valore del campo e posizionarlo nella riga. 
Io avevo fatto una cosa simile in QuickReport per stampare una qualunque 
TDBGrid. Non avevo il problema della tabella "invertita", ma ho dovuto 
creare delle TQRDBLabel al volo e assegnarle alla banda del dettaglio.
Il problema che mi viene in mente e' un altro. Come vuole comportarsi il 
tuo committente se la somma delle larghezze delle colonne eccede la 
larghezza del foglio? Stampa in landscape o stampa su un altro foglio?
Che committente complicato che ti sei cercato, pero'. :)

Grazie a tutti per i feeds.
Il problema ï¿œ che lo sviluppo di questo tipo di lettura dati che si 
vuole avere ï¿œ orizzontale, e questo non e' un approccio ammesso dal 
motore del report. Come tutti ben sappiamo il motore del report viene 
alimentato dall'alto al basso, riga per riga, e le bande si sviluppano 
per l'appunto in verticale.
Attualmente ho scelto un'alternativa che e' rappresentata dalla lettura 
verticale. Mostro dati omogenei nella stessa colonna.
Se poi il committente non accetta la soluzione e vuole per forza 
leggere gli stessi dati che gli propongo in verticale nell'altro 
senso.. allora passerï¿œ a soluzioni di differente natura visto che il 
motore del report non e' in grado di sviluppare una pipeline in 
orizzontale.
Tra queste soluzioni c'ï¿œ l'esportazione in un file excel (e poi se la 
vede office), un file di testo e poi viene stampato quello, e cosï¿œ via.
Grazie a tutti.
Ciao
-- 
Morde

> Sto usando: delphi 5 + ReportBuilder 7.04
Ciao,
che db utilizzi?
Io ci sono passato con Oracle e in qualche modo l'ho risolto.
Una alternativa è utilizzare il componente cxPivotGrid di DevExpress:
http://www.devexpress.com/Products/VCL/ExPivotGrid/
Costoso ma molto bello.
Io l'avevo valutato tempo fa e mi era piaciuto molto.
Dalla grid puoi esportare i dati, anche in excel. A quel punto ci fai
quello che vuoi...
Matteo

 Io ci sono passato con Oracle e in qualche modo l'ho risolto.
Uso oracle ma il report in questione si alimenta con soli 
clientdataset.
Ti ringrazio per il suggerimento, darï¿œ un'ochio al componente 
devxpress, non lo conosco.
ciao
-- 
Morde

 clientdataset.
Se usi oracle devi generare una stored procedure che genera
dinamicamente una view come vuoi tu.
A quel punto essendo una banale vista la tratti come tabella.
Io alla fine ho fatto cosi...
Matteo

 A quel punto essendo una banale vista la tratti come tabella.
si..ok..ma il suo problema non è come preparare i dati... Per quello
esistono n tecniche diverse...
Mi azzardo a dire che *forse* usando papa' oracle potresti fare tutto
con una sola query utilizzando il rollup...
Il casino grosso è la c@@@o della banda del report....
Tutti gli strumenti di report che ho usato (qr, fast e crystal..) si
basano sull'implicito presupposto che i dati sono in formato tabellare
con numero di righe variabile e numero di colonne *fisso*.
Ma questo presupposto, nel caso specifico, viene violato..
A.

 quello che vuoi...
Anche la quantumgrid prevede l'export in excel, oltre ai formati txt,
xml (che  pero' aveva qualche problema..) e html.
La cosa carina è che non va via ole automation.
Ergo, non ti serve che sul pc sia installato excel, cosa non da poco
visti i costi delle licenze di office.
A.

 FALLO STUDIARE O MANDALO A CAGARE !!!!!!
Io non sarei cosi drastico.
Il cliente, giustamente, SE NE FOTTE, di cosa succede dietro le
quinte: a lui interessa ottenere cio' che gli serve.
Spesso dimentichiamo che non siamo artisti ma fornitori di soluzioni a
problemi.
In molti casi, le richieste sono senza senso, ok.
Credo che ognuno di noi potrebbe citare almeno 3 episodi paradossali
per ogni anno di lavoro...
In un posto dove ho lavorato proposi l'istituazione del PSS (premio
settimanale di stupidita') da assegnare alla cosa detta o alla
richiesta piu assurda...e sarebbero stati in tanti, a contendersi
questo triste premio..
Ma ogni tanto, tra tanti utOnti, spunta un UTENTE che ha qualche
neurone e ti fa una richiesta perfettamente logica e sensata.
Imho, dovremmo essere piu flessibili, e non dare per scontato che
l'organizzazione tabellare su cui si basa un db relazionale sia
l'unica esistente e/p l'unica da utilizzare.
Oltre al relazionale, esiste ad esempio il modello gerarchico, su cui
si basa xml..
Infine, se organizzare i dati in questo modo fosse una cosa poco
comune o campata per aria col cazzo che una societa come quella che
produce i developer express avrebbe investito tempo (=soldi!) per
mettere in piedi la vertical grid citata in un altro post di quest
thread.
Pax vobiscum.
A.

 con una sola query utilizzando il rollup...
No, con oracle bisogna passare per le stored procedure, quella
dell'inversione righe-colonne è una faq che attualmente ha questa come
soluzione.
In questo caso SQL Server (e anche access) con le sue "tabelle pivot"
risulta essere più comodo.
Matteo

 soluzione.
Saresti cosï¿œ gentile da darmi un link a questa faq? Mi incuriosisce :-)
Grazie
ciao
-- 
Morde

 risulta essere più comodo.
Access *non funziona*.
Ho pianto sui dts di SqlServer2000...
Figlio di zoccola che ti dice "ok ho importato tutto"...
e poi dopo una nottata di bestemmie a fare debug scopri che il 20%
delle righe non sono state importate.
Se le tabelle pivot funzionano come i dts buonanotte.
Poi se scrivo che le cose microsoft non funzionano mi accusano di
essere talebano, o, peggio che mai, "no...lo devi conoscere..."
A.

 ciao
Urca! Che domanda difficile. Devo andare indietro nella memoria..
Se vai qui: 
http://asktom.oracle.com/
  e fai una ricerca per "pivot"
vedrai molte discussioni, alcune iniziate oltre 9 anni fa...
Io il problema l'ho risolto diversi anni fa utilizzando quanto
spiegato qui:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:124812348063#41097616566309
o qui:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:31263576751669#76663048528720
La soluzione è la stessa ed è riportata dal suo libro.
Io ho adattato quello che lui ha fatto alla mia situazione, generando
una view e visualizzandola tramite grid.
Matteo

 soluzione.
Ho appena visto sul sito oracle che in realtà la versione 11g ha la
possibilità di generare direttamente tabelle pivot:
http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-pivot.html
è una feature nuova che non conoscevo e che mi sembra piuttosto
interessante.
scusate la precedente informazione inesatta...
Matteo

> scusate la precedente informazione inesatta...
sarai frustato a sangue fino a capodanno! :-D
A.