Newsgroup: it.comp.lang.delphi
Titolo: Sono esasperato dal report

Spero non siate tutti in vacanza per il super ponte :)
Per fare una bolla ho creato un report con 3 bande :
PageHeader,StringsBand,PegeFooter.
nella prima e nella seconda ho messo delle label e delle ExprLabel, mentre
nella seconda ho
messo solo dei QRMemo che mi rappresentano la colonne del documento.
Queste memo prendono i dati da una StringGrig di un'altra form(durante
TBolla.FormCreate)
in questo modo:
  for i:=1 to Form4.StringGrid1.RowCount-2 do
   begin
    QRMemo1.Lines.Append(' '+Form4.StringGrid1.Cells[0,i]);
    QRMemo2.Lines.Append(' '+Form4.StringGrid1.Cells[1,i]);
    QRMemo3.Lines.Append(Form4.StringGrid1.Cells[2,i]);
    QRMemo4.Lines.Append(Form4.StringGrid1.Cells[3,i]);
    QRMemo5.Lines.Append(' ');
   end;
Quindi richiamo una procedura tipo "UltimaPagina" che mi va a compilare il
Foot del report
Il mio problema č che quando devo stampare piů di una pagina dello stesso
documneto
devo fare in modo che il Footer dell'ultima pagina sia diversa dalle altre.
Cioč solo nell'ultima pagina devo mettere data e ora trasporto, num. colli,
ecc... mentre
in quelle precedenti devo solo mettere "CONTINUA..."
Su suggerimento di Mirko's ho provato ha modificare cosě:
  count:=0;
  for i:=righe_stampate to Form4.StringGrid1.RowCount-2 do //righe_stampate
č una var globale
                                                           //che tiene il
conto assoluto delle
                                                           //righe che ho
aggiunto ai QRMemo
   begin
    QRMemo1.Lines.Append(' '+Form4.StringGrid1.Cells[0,i]);
    QRMemo2.Lines.Append(' '+Form4.StringGrid1.Cells[1,i]);
    QRMemo3.Lines.Append(Form4.StringGrid1.Cells[2,i]);
    QRMemo4.Lines.Append(Form4.StringGrid1.Cells[3,i]);
    QRMemo5.Lines.Append(' ');
    inc(count);
    if count=righe-1 then //righe č il max num di righe dei memo che voglio
per pagina
     begin
      righe_stampate:=righe_stampate+count;
      QuickRep1.NewPage;
      count:=0;
     end;
   end;
   UltimaPagina;
Questa ultima parte ho provato a metterla ovumque poteva essere messa cioč
nei vari
AfterPrint o BeforePrint delle 3 bande e del report (ovviamente provando uno
alla volta).
Risultato: o mi stampa la QRStringsBand (quella con i QRMemo) completamente
bianca nella
prima pagina e mette tutto nella seconda, o non stampa proprio questa banda
del report,o
addirittura mi stampa la banda vuota!!
Per visualizzare il report uso questa chiamata da un'altra form:
    Bolla:=TBolla.Create(Self);
    Bolla.QuickRep1.Preview;
Vi prego aiutatemi, questo report mi fa diventare pazzo!!!!!
Ho bisogno di una spiegazione chiara o di qualche esempietto esplicativo.
Grazie.

Se devo essere sincero dalla tua spiegazione non capisco come
intendi far funzionare la tua stampa; quindi ti dico come farei io:
Prima di tutto preparo tutti i dati da stampare nella form che poi
lancerà il report, cioè carico nella form lanciante la Stringlist
con le righe e anche tutti i campi che devono essere stampati
prima di lanciare la stampa della bolla. Non capisco perchè dici
sempre di mettere la preparazione dei dati nel TBolla.FormCreate,
secondo me è sbagliato.
Quando prepari la stringlist con le righe da stampare questa lista deve
contenere tutte le righe del documento anche se sono centinaia e
quindi creeranno più di una pagina di bolla. Non deve interessarti
almeno in questo punto della preparazione della stampa.
Una volta preparati nella form lanciante tutti i dati necessari, ovviamente
dati pubblici, lanci la stampa col QR1.Preview o il QR1.Print.
Nella parte report devi usare come dicevi tu 3 bande, una
header, una detail e una footer.
Nel BeforePrint del report azzeri la variabile contatore righe stampate
nella pagina; quindi questo viene fatto una volta sola per stampa.
Stai attento che se fai un preview e poi dall'anteprima premi il bottone
di stampa, l'intera stampa viene rigenerata e quindi devi azzerare qui
il contatore di righe stampate.
Nel BeforePrint della header ci metti le istruzioni per visualizzare
nelle label dell'header band i dati di testata prelevandoli dai campi
già preparati nella form lanciante. In più setti a false una variabile
che ti serve per capire se il prossimo piede stampato è solo una
continuazione o è il totale vero e proprio.
es:  SoloContinuazione := false;
Nel before print della Detail band incrementi di 1 il contatore
delle righe stampate e se questo supera il limite massimo di
righe da stampare nella pagina allora fai il saltopagina.
procedure TBolla.QRBand1BeforePrint...;
begin
if ContaRighe > MaxRighe then
  begin
  SoloContiunazione := true;
  Qr1.NewPage;
  ContaRighe := 0;
  end;
ContaRighe := ContaRighe + 1;
end;
Per finire, nel before print del footer band controlli se la
variabile SoloContinuazione è true allora lanci una routine
che mette nelle label della footer la scritta continua, altrimenti
lanci un'altra funzione che nelle label ci mette i totali "veri".
Questo è quello che farei io, sicuramente ci sono altri modi.
Se non ho spiegato bene o non ti trovi chiedi.
Mirko
ps. Scusa se non ti ho più risposto l'altra volta ma ho avuto
un periodo abbastanza incasinato.

 un periodo abbastanza incasinato.
No problem ;-)

Ho fatto esattamente quanto mi hai detto (compreso l'eliminazione della
procedura
FormCreate) ma il risultato non è stato molto vincente.
Non so perchè ma usando il "Trace into" (F7) ho visto che la chiamata
Bolla.QuickRep1.Preview
viene esaudita in questo ordine:
TBolla.QuickRep1BeforePrint.....
QRBand1BeforePrint....  //quella del Detail
insomma mi chiama il BeforePrint del Header solo quando sono io a fare
QuickRep1.NewPage
(nel modo che abbiamo detto), e il BeforePrint del Footer viene chiamato
solo quando è finito
il ciclo FOR che riempe le QRMemo(anche se nel frattempo c'è stata una
QuickRep1.NewPage). Eccoti il BeforePrint del Detail:
procedure TBolla.QRBand1BeforePrint...;
 var
  i:byte;
 begin
  for i:=1 to Form4.StringGrid1.RowCount-2 do
   begin
    QRMemo1.Lines.Append(' '+Form4.StringGrid1.Cells[0,i]);
    QRMemo2.Lines.Append(' '+Form4.StringGrid1.Cells[1,i]);
    QRMemo3.Lines.Append(Form4.StringGrid1.Cells[2,i]);
    QRMemo4.Lines.Append(Form4.StringGrid1.Cells[3,i]);
    QRMemo5.Lines.Append(' ');
    inc(ContaRighe);
    if ContaRighe=MaxRighe-1 then
     begin
      SoloContinuazione:=True;
      ContaRighe:=0;
      QuickRep1.NewPage;
     end;
   end;
 end;//end of QRBand3BeforePrint
Sto sbagliando ancora qualcosa?
L' if ContaRighe=MaxRighe-1 è giusto dentro al for?(credo di si)
Sai noi piacentini siamo un pò gniucchi :|)
Grazie, ciao.

Direi di si, cosa ci fa quel ciclo messo all'interno del BeforePrint
di quella banda?
Intanto per dettaglio devi usare una TQRStringsBand e non
una banda generica; questa banda si arrangia a spazzolare
tutto il dettaglio della lista.
Ho fatto in 2 minuti un esempio che funziona come vuoi tu,
te lo mando per mail.
Ciao
Mirko

Ops, io ho D4 e QR3.05, non ti ho chiesto cosa usi.
Se non ti va leggi le poche cose che ho messo nel sorgente.
Mirko

Grazie ho ricevuto. Ci guardo domani sperando di saltarci fuori!

RISOLTO!!!
Grazie tante per l'esempio, credo che oltre al sottoscritto fossero anche le
QRMemo nella banda del dettagio a fare del casino.Infatti mettendo le label
tutto funge.
Ancora una cosa se non ti disturbo; siccome ho da scrivere su 4 colonne
creato a liste (come mi hai mostrato) e solo con una ho fatto
"QRStringsBand1.Items := lista" e con la label ho fatto come mi hai detto tu
(LbDettaglio1.caption := QRStringsBand1.Item); poi ho messo altre 3 label a
fianco di LbDettaglio1 e procedo come segue:
 LbDettaglio2.caption :=
Lista2.Strings[ContaRighe+(MaxRighe*(QuickRep1.PageNumber-1))];
 LbDettaglio3.caption :=
Lista2.Strings[ContaRighe+(MaxRighe*(QuickRep1.PageNumber-1))];
 LbDettaglio4.caption :=
Lista2.Strings[ContaRighe+(MaxRighe*(QuickRep1.PageNumber-1))];
non ti preoccupare FUNZIONA :-))
Volevo solo sapere se c'è un modo più elegante, ad es. ho provato ad
impostare QuickRep1.Page.Columns a 4 e ho provato a mettere un'altra
StrigsBand, ma questa mi finisce sotto la prima StringsBand; non c'è un modo
per affiancarle?
Ti ripeto, il tutto funziona benissimo (adesso), il mio è solo un dubbio
quindi non sei obbligato a scervellarti e non voglio approfittare della tua
pazienza.
PS: Uso D5 con non so quale versione di QR (quella data, non l'ho mai
aggiornata)

 ...
Se ho capito hai 4 liste contenenti 4 dati da stampare in ogni riga e a te
serve sapere quale elemento stampare, quindi ti basta l'indice corrente.
La QRStringsBand ha una proprietą che č index quindi puoi fare:
LbDettaglio2.caption := Lista2[QRStringsBand1.Index];
QRStringsBand1.Index č l'indice dell'elemento che si sta stampa della
lista associata alla StringsBand.
Spero di essermi spiegato
Ciao
Mirko

> LbDettaglio2.caption := Lista2[QRStringsBand1.Index];
Non ci avevo pensato, e pensare che a scuola mi hanno insegnato che è meglio
ragionare 5 min. "che mettersi lì a fare le cose da muli".
Quello che mi chiedevo è come mai nel report puoi impostare un numero a
piacere di colonne se poi non puoi (credo) affiancare due bande? Non ha
senso.
Ad esempio nel documento da stampare ho 2 colonne (Matricola, Alunno), e
quindi imposto a 2 la proprietà del report relativa al n° di colonne; creo 2
QRStringsBand (1 per la matricola e 1 perl'alunno) ma queste vanno a finire
sempre una sotto all'altra e non c'è verso di affiancarle per fare una
tabella.
Forse mi sfugge qualche proprietà da settare, in caso contrario credevo che
QR fosse uno strumento un pò più "flessibile".
Ciao.

 QR fosse uno strumento un pò più "flessibile".
Secondo me il punto forte di QR è che è molto programmabile da codice,
nel senso che puoi inserire codice pascal per fare un po' di tutto.
Se usassi Cristal Report come sono costretto a fare io, non con Delphi,
allora capiresti cosa vuol dire soffrire (anche se ha i suoi vantaggi tipo
le
esportazioni).
Il tuo problema è che forse non hai capito bene il suo modo di funzionare,
vai sul sito 
www.qusoft.com
 e scaricati un po' di esempi e documentazione.
Tutti dicono però che il migliore è ReportBuilder, mai usato quindi non so.
Ciao
Mirko

 Mirko
Ciao, grazie ancora.
MirkoMarco

 delphi.
Se non hai esigenze particolari penso che vada benone; se
lo conosci un po' ci fai quasi tutto.
Io ho fatto stampe di fatture molto complesse, registri iva
e bollati vari, anche su stampanti ad aghi a velocità piena
(questo però solo con W98 e driver specifici).
Ci sentiamo
Mirko