Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problema quickreport moduli multipli.

51 views
Skip to first unread message

mnoga

unread,
Dec 4, 2018, 6:05:31 AM12/4/18
to
Ciao a tutti,
devo creare con quickreport una stampa composta da quattro pagine a4,
quindi devo stampare in sequenza:
-record1pagina1
-record1pagina2
-record1pagina3
-record1pagina4
-record2pagina1
-record2pagina2
-record2pagina3
e così via.

Non riesco a ottenere questa cosa. Se provo col componente QrCompositeReport e 4 qrReport distinti (uno per pagina)mi stampa tutti le pagine 1 poi tutte le pagine 2 ecc.

Se provo con un Quickreport contenente una detailband e una childband riesco a ottenere
-record1pagina1
-record1pagina2
-record2pagina1
-record2pagina2

però se aggiungo altre childband per le due pagine rimanenti queste vengono ignorate...

Come devo fare?
Grazie a tutti anticipatamente.

--
mnoga

Giacomo Degli Esposti

unread,
Dec 4, 2018, 6:45:56 AM12/4/18
to
Il giorno martedì 4 dicembre 2018 12:05:31 UTC+1, mnoga ha scritto:
> Ciao a tutti,
> devo creare con quickreport una stampa composta da quattro pagine a4,
> quindi devo stampare in sequenza:
> -record1pagina1
> -record1pagina2
> -record1pagina3
> -record1pagina4
> -record2pagina1
> -record2pagina2
> -record2pagina3
> e così via.

ciao.

Non mi e' chiaro cosa stai cercando di ottenere: hai un daataset
con N record e devi fare 4 pagine, la prima con una parte dei campi
di tutti gli N record, poi una secondo con un'altra parte dei
campi degli stessi record, eccetera?


Che tipo di dataset stai usando: una table, una query, un clientdataset?
Se stai usando una query, puoi intervenire modificando il testo SQL ?

ciao
Giacomo

mnoga

unread,
Dec 4, 2018, 8:32:35 AM12/4/18
to
no, mi spiego meglio.
Ho un clientdataset riempito con 10 record.
Per ogni uno di quei record devo stampare 4 pagine diverse, cioè dei report diversi.
Se uso qrcompositereport e aggiungo i 4 report, lui mi stampa la prima pagina del record 1, la prima del record 2 ecc e poi la seconda pagina del record 1, la seconda del record 2 e così via, e non è quello che serve a me.

Il totale delle pagine deve essere Numrecord * 4(pagine) però l'ordinamento deve essere prima tutte le pagine del record 1, poi tutte quelle del record 2 ecc, e non riesco ad ottenderlo.

Sono riuscito ad ottenere circa quello che volevo creando un singolo report, mettendo una detail band, e a quella detail ho checkato haschild a true. Alla childband che appare ho messo a sua volta haschild a true e così via fino ad avere 4 band. A runtime ho messo l'altezza di ogni band pari ad un a4 e cosi ognuna mi occupa una pagina.
Così facendo però ho un bug e una scomodità: il bug è che per la prima pagina mi stampa solo la detail band, e dal secondo record in poi invece è tutto corretto. La scomodità è che per ora ho messo solo due label di test, poi quando riempirò le pagine(abbastanza complesse) dovrò ogni volta a design rimpicciolire la dimensione delle band che non mi interessano ed aumentare quella che mi serve, rendendo laboriosa la modifica.

--
mnoga

Daniele

unread,
Dec 5, 2018, 4:09:52 AM12/5/18
to
Ciao,

> no, mi spiego meglio.
> Ho un clientdataset riempito con 10 record.
> Per ogni uno di quei record devo stampare 4 pagine diverse, cioè dei
> report diversi.
> Se uso qrcompositereport e aggiungo i 4 report, lui mi stampa la prima
> pagina del
> record 1, la prima del record 2 ecc e poi la seconda pagina del record 1,
> la seconda
> del record 2 e così via, e non è quello che serve a me.

Scusa, non ho capito quello che devi fare .....
Comunque provo a darti una soluzione su quello che hai scritto tu.
Con QR devi costruirti 4 report differenti, ognuno dei quali ha le
caratteristiche che hai bisogno.
Qiesti report li chiami, per esempio QR1, QR2, QR3, QR4 dove hai le
procedure
LanciaQR1, LanciaQR2, LanciaQR3, LaciaQR4.
Poi nel pulsantino della tua form, dove hai provveduto a mettere un bella
stampantina, lanci la tua procedura tipo

Procedure PrintAll;
begin
TuoDataSet.first
While Not TuoDataSet.Eof Do
Begin
// Qui scorri tutto il tuo data set dal primo all'ultimo record.
// Qui chiami il tuo primo report dove tratti i dati
LanciaQr1; // Report1 sul primo record del to dataset
LanciaQr2; // Report2 sul primo Record del tuo dataset;
LanciaQr3;
LanciaQr4;
TuoDataSet.Next // Passa al record successivo e ripeti le stampe
End;
end;

Nella procedura sopra descritta hai le 4 pagine (diverse) per ogni record,
ma poi le devi sistemare per ovvi motivi.
Spero possa esserti utile.

Ciao

Daniele

PS: Per completezza .... ecco un esempio ...
La Unit dove crei il report la chiami Form_Report1.
La form la chiami FQR1 e qu dentro metti il TQuickRep e tutti i suoi
componenti di stampa.
Hai la famosa LanciaQr1 che sara' piu' o meno cosi'

Procdure LanciaQr1;
Begin
FQR1:=TFQR1.Create(Nil);
try
FQR1.QuickRep1.Preview;
Finally
Freeandnil(FQR1)
End;
End;

Nell'evento OnCreate sistemi tutti i dati che hai nel record, attuale, del
tuo dataset.
Questo per 4 (sempre se e' quello che cercavi).
Esiste anche l'altro caso dove, per esempio, vuoi i 4 report separati.
In questo caso devi fare 4 cicli ovvero

TuoDataSet.first
While Not TuoDataSet.Eof Do
Begin
LanciaQr1; // Report1, tutto il dataset
TuoDataSet.Next // Passa al record successivo e ripeti le stampe
End;
TuoDataSet.first
While Not TuoDataSet.Eof Do
Begin
LanciaQr2; // Report2, tutto il dataset
TuoDataSet.Next // Passa al record successivo e ripeti le stampe
End;
TuoDataSet.first
While Not TuoDataSet.Eof Do
Begin
LanciaQr3; // Report3, tutto il dataset
TuoDataSet.Next // Passa al record successivo e ripeti le stampe
End;
TuoDataSet.first
While Not TuoDataSet.Eof Do
Begin
LanciaQr4; // Report4, tutto il dataset
TuoDataSet.Next // Passa al record successivo e ripeti le stampe
End;


Giacomo Degli Esposti

unread,
Dec 5, 2018, 5:34:16 AM12/5/18
to
Il giorno martedì 4 dicembre 2018 14:32:35 UTC+1, mnoga ha scritto:
> Ho un clientdataset riempito con 10 record.
> Per ogni uno di quei record devo stampare 4 pagine diverse, cioè dei report diversi.
> Se uso qrcompositereport e aggiungo i 4 report, lui mi stampa la prima pagina del record 1, la prima del record 2 ecc e poi la seconda pagina del record 1, la seconda del record 2 e così via, e non è quello che serve a me.
>
> Il totale delle pagine deve essere Numrecord * 4(pagine) però l'ordinamento deve essere prima tutte le pagine del record 1, poi tutte quelle del record 2 ecc, e non riesco ad ottenderlo.

Adesso mi e' chiaro.

> Sono riuscito ad ottenere circa quello che volevo creando un singolo report, mettendo una detail band, e a quella detail ho checkato haschild a true. Alla childband che appare ho messo a sua volta haschild a true e così via fino ad avere 4 band. A runtime ho messo l'altezza di ogni band pari ad un a4 e cosi ognuna mi occupa una pagina.
> Così facendo però ho un bug e una scomodità: il bug è che per la prima pagina mi stampa solo la detail band, e dal secondo record in poi invece è tutto corretto. La scomodità è che per ora ho messo solo due label di test, poi quando riempirò le pagine(abbastanza complesse) dovrò ogni volta a design rimpicciolire la dimensione delle band che non mi interessano ed aumentare quella che mi serve, rendendo laboriosa la modifica.

Questo approccio mi sembra quello corretto. Se non ricordo male sulle
childband c'e' una proprieta' "ForceNewPage" che le manda "a capo"
indipendentemente dalle dimensioni. Prova a mettere quello e a usare
delle bande di altezza piu' piccola di A4 per una prima prova.

ciao
Giacomo



mnoga

unread,
Dec 5, 2018, 8:19:38 AM12/5/18
to
Si questa è la soluzione "disperata" che mi ero tenuto in canna anche io, il problema però è questo: se io stampo su pdf, o faccio una preview di tutto, mi vengono tutti file di una pagina,diviso, o altrimenti continuano ad apparirmi preview di ogni pagina.
no questo non mi serve, ad ogni modo non serve scorrere i record, assegnando al report il clientdataset si arrangia da solo a scorrerlo tutto

--
mnoga

mnoga

unread,
Dec 5, 2018, 8:27:50 AM12/5/18
to
si il forcenew page c'è su tutte, per eliminare il bug ho dovuto mettere nelle child il KeepOnOnePage a False, ma per il primo record tenerlo a true, e così mi funziona
Non so se devo segnalarlo o se sbaglio qualcosa io prima...

--
mnoga

Daniele

unread,
Dec 6, 2018, 4:25:49 AM12/6/18
to
Ciao,
quello che sto per scrivere .... e poco condivisibile ..... e mi preparo a
ricevere diverse "ammonizioni".
Sebbene esistono i componenti che si agganciano ai dataset, io preferisco
lavorare con i componenti normali.
La scelta puo' essere discutibile ed e' probabile che si perda anche in
velocita'.
Senza quotare tutto (perche' e' nei messaggi precedenti ...)

> Si questa è la soluzione "disperata" che mi ero tenuto in canna anche io,
> il problema però è questo: se io stampo su pdf, o faccio una preview di
> tutto,
> mi vengono tutti file di una pagina,diviso, o altrimenti continuano ad
> apparirmi preview
> di ogni pagina.

Io utilizzo questo approccio per visualizzare (in pdf) report
annui/mensili/settimanali.
Quindi preparo dei pdf che vanno da 1 a qualche centinaia di pagine.
Quello che devi fare e', semplicemente, creare la tua pagina (non importa
quale) generare il pdf e aggiungerlo al pdf esistente.
Una volta creato il pdf (file o stream, io uso gli stream per svincolarmi
dal disco fisso), lo metti una bella form che fa da preview .
Il tutto si consuma in qualche secondo (ultimamente il mio pc sembra assai
rallentato).
La procedura per creare il pdf e' la solita e mai cambiata, ovvero (con la
libreria synopse, gratuita)

https://synopse.info/forum/viewtopic.php?id=138

Nel tuo caso specifico la chiami tutte le volte che crei il report.

Ovviamente, ma questo gia' lo sai, per evitare la preview di tutte le pagine
la procedura diventa

Procdure LanciaQr1;
Begin
FQR1:=TFQR1.Create(Nil);
Freeandnil(FQR1)
End;

Dove nell'evento oncreate chiami la procedura indicata nel link.
Ovviamente anche QR ha i propri filtri, ma ho avuto qualche difficolta' nel
loro utilizzo per via del risultato finale.
Le librerie (commerciali) attualmente piu' performanti nel gestire i pdf
sono quelle della Gnostice.

Poi, sempre facendo rabbrividire i veri programmatori, ho scoperto (qualche
anno fa) l'esistenza di un componente, per me, fantastico.
Si tratta della qrLoopBand.
Per i miei report (molto semplici senza molte sotto bande associate) con
riesco a stampre tutto, anche fino a 2 childband dove richiesto.

Anche la funzione CompositeReport non l'ho mai, forse a torto, presa
utilizzata.

> no questo non mi serve, ad ogni modo non serve scorrere i record,
> assegnando al report il clientdataset si arrangia da solo a scorrerlo
> tutto
E' quel "si arrangia da solo" che mi e' sempre piaciuto poco ....

Fammi sapere come hai risolto ..

Ciao

Daniele


--
mnoga

0 new messages