Naplnění reportu daty Query while

Top  Previous  Next

Úspěšně jsem zvládl svůj první repor s daty - QueryToCells co dál?

Nyní vyrobíme modifikaci tohoto reportu. Ukážeme si jak report naplnit tak, abychom si mohli vybrat, kde budou data umístěna a zkusíme některé buňky naformátovat a obarvit.

Původní skript:

procedure OnBeforeReport(Sender : TReportProperty);

begin

 BDEQuery1.Query.Open;

 Sheet['B4'].QueryToCells:=BDEQuery1.Query;                                                

 BDEQuery1.Query.Close;

end;

 

vložil data od buňky B4 dále, ale nemohli jsme si vybrat kde budou jednotlivé fieldy umístěny, nyní skript upravíme tak, aby to bylo možné:

 

procedure OnBeforeReport(Sender : TReportProperty);

var

 r : integer;                                    

begin

 Sheet.RowCount:=5;  

 Sheet.ColCount:=5;

 r:=4;            

 BDEQuery1.Query.Open;

 while not BDEQuery1.Query.eof do

 begin

   Sheet['B'+IntToStr(r)].Cells:=BDEQuery1.Query.FieldByName('jmeno').AsString;

   Sheet['C'+IntToStr(r)].Cells:=BDEQuery1.Query.FieldByName('pocet').AsString;

   inc(r);

   while Sheet.RowCount<=r do Sheet.AddRow;                                                                                      

   BDEQuery1.Query.Next;                              

 end;          

 BDEQuery1.Query.Close;                

end;

 

 

Jeje, tolik kódu a report vypadá pořád stejně? Ano vypadá, ale nyní již můžeme měnit umístění buňek v reportu. Nejprve si report trochu okomentujeme. První 2 řádky

 Sheet.RowCount:=5;  

 Sheet.ColCount:=5;

 

nám nastaví výchozí velikost reportu. Tím také zajistíme že se smaže i předchozí obsah buněk. Následně otevřeme Query a budeme jej procházet v cyklu dokud nenarazíme na konec. Následující řádek

Sheet['B'+IntToStr(r)].Cells:=BDEQuery1.Query.FieldByName('jmeno').AsString;

zajistí že do buňky [Sloupec B,řádek r] umístíme filed 'jméno' z Query. Podobně potom na dalším řádku i počet. Nyní si posuneme ukazatel aktuálního řádku o jedna

   inc(r);

a otestujeme jestli počet řádků reportu je dostatečný pro další data

   while Sheet.RowCount<=r do Sheet.AddRow;        

hmmm proč while když by stačil if ? .... nestačil, protože teď jsi již zkusíme první, nejjednodušší, modifikaci reportu, zkuste místo

   inc(r);

dát

   inc(r,2);

s pustit report znovu. Podobně můžete třeba počet přemístit do sloupečku D:

   Sheet['D'+IntToStr(r)].Cells:=BDEQuery1.Query.FieldByName('pocet').AsString;

 

Nyní tedy report vypadá nějak takto:

 

počet výskytů jména v databázi je číslo a tedy by mělo být zarovnáno doprava. Do skriptu za řádek

   Sheet['C'+IntToStr(r)].Cells:=BDEQuery1.Query.FieldByName('pocet').AsString;

přidáme

   Sheet['D'+IntToStr(r)].Format:=6; // Format

 

Jednoduché že? Ještě bychom mohli číslo obarvit a zvýraznit tučně. Abychom nemuseli stále opakovat Sheet['D'+IntToStr(r)]. využijeme konstrukci With:

   with Sheet['D'+IntToStr(r)] do

   begin

     Format:=6;

     Font.Color:=clNavy; // Font

     Font.Style:=fsBold;                                              

   end;      

 

Report tedy nyní vypadá:

 

Protože už máte všechny potřené vědomosti za domácí úkol modifikujte report tak aby vypadal:

Potom můžete pokračovat v následujícím příkladu, kde vytvoříme graf ze zobrazených dat