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. |