2. Skript reportu

Top  Previous  Next

Na rozdíl od příkladu Jednoduchý horizontální drill v události OnBeforeReport naplníme celý report včetně detailu a poté využijeme možnosti skrývání řádků Rows[row].Visible

 

 

procedure OnBeforeReport(Sender : TReportProperty);

var

 Query,QueryDetail : TQuery;

 r : integer;                            

begin

 Sheet.BeginUpdate;

 Sheet.ColCount:=6; // ujistíme se že má report alespoň 5 sloupců

 Sheet.RowCount:=3; // nastavíme počet řádků reportu na 2 (Count-1)

 Sheet.FixedRows:=2; // uzamkneme první 2 řádky

 Sheet.ClearMergeCells; // odstraníme případné sloučené oblasti, které se načetly při uložení reportu

 

 Query:=TQuery.Create(nil); // vytvoříme Query

 with Query do

 try

   DatabaseName :=DefaultDatabaseName;

   // najdeme nazvy statu a měny

   SQL.Text:='select mena_id,(select nazev from dba.gstaty where id_stat=(select stat_id from dba.gmeny where mena_id=id_mena)) as nazev '+

             'from dba.gkurzy group by mena_id';

   Open;

 

   r:=3;

   

   while not Query.Eof do // projdeme dotaz

   begin

     Sheet.AddRow; // nový řádek                            

 

     Sheet.CellProperty[2,r].Tag:=1; // cinkneme si ze řádek je hlavička a pod ní se bude drilovat                                                                        

     Sheet.Cells[2,r]:=Query.FieldByName('mena_id').AsString; // měna

     Sheet.MergeCells(3,r,4,r);                               // sloučíme buňky pro název státu

     Sheet.Cells[3,r]:=Query.FieldByName('nazev').AsString; // název

     // trochu přibarvíme

     Sheet.CellProperty[2,r].Background:=$00bd814f;Sheet.CellProperty[2,r].Font.Color:=clWhite;              

     Sheet.CellProperty[3,r].Background:=$00bd814f;Sheet.CellProperty[3,r].Font.Color:=clWhite;

 

     // přiřadíme událost doubleclick

     Sheet.CellProperty[2,r].OnDblClick:=@MenaDblClick;

 

     inc(r);

     

     QueryDetail:=TQuery.Create(nil); // vytvoříme query pro detail              

     with QueryDetail do

     try

       DatabaseName :=DefaultDatabaseName;

       SQL.Text:='select top 5 dne,koef from dba.gkurzy where mena_id=:mena order by dne desc';

       Params.ParamByName('mena').AsString:=Query.FieldByName('mena_id').AsString;                                                              

       Open;

                 

       while not QueryDetail.Eof do // projdeme detail

       begin

         Sheet.AddRow;

 

         Sheet.Cells[3,r]:=QueryDetail.FieldByName('dne').AsString;

         Sheet.Cells[4,r]:=QueryDetail.FieldByName('koef').AsString;

 

         Sheet.CellProperty[3,r].Background:=$00EAEAEA;        

         Sheet.CellProperty[4,r].Background:=$00EAEAEA;

 

         // detail měn po otevření reportu skryjeme takže budou vidět jen záhlaví měn

         Sheet.Rows[r].Visible:=False;

 

         inc(r);            

         QueryDetail.Next;

       end;      

     finally

       Free;

     end;

     Query.Next;

   end;    

 finally

   Free;

 end;

                   

 Sheet.EndUpdate;                                            

end;

 

// celý trik drillování spočívá v předání pozice řádku na který bylo poklepáno

// poté se buď řádek zobrazí nebo skryje podle aktuální situace

// to se provádí opakovaně pokud se nenarazí na další záhlaví další měny tag=0 nebo konec reportu

// RowCount

procedure DrillMe( mena : string; aRow : integer );

var

 r : integer;

begin

 Sheet.BeginUpdate;

 r:=aRow+1; // projdi od hlavičky +1                                                                          

 while (Sheet.CellProperty[2,r].Tag=0) and (r<Sheet.RowCount) do

 begin

   If Sheet.Rows[r].Visible then

   Sheet.Rows[r].Visible:=False // skryj

     else

   Sheet.Rows[r].Visible:=True; // zobraz

   inc(r);

 end;                

 Sheet.EndUpdate;

end;

 

procedure MenaDblClick(Sender : TCellProperty);

begin

 DrillMe(Value,Sheet.Row); // poklepání vyvolá Drill s předáním aktuálního řádku jako parametru

end;

 

begin

 

end.