2. Skript reportu

Top  Previous  Next

Hlavní částí celého skriptu je procedura Drill. Parametr Order udává zda máme data zobrazit utříděná dle osobního čísla nebo dle jména.

 

procedure Drill(const Order : integer);

var

 Query : TQuery;

 r : integer;                            

begin

 Sheet.BeginUpdate;

 

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

 with Query do

 try

   DatabaseName :=DefaultDatabaseName;

   SQL.Text:=

      'SELECT mzosobnikarty.prijmeni+'' ''+mzosobnikarty.jmeno as clovek, '+      

      'nemoc.rok_id,nemoc.rodne_cislo_id,nemoc.osobni_cislo_id,nemoc.neschopen_od,nemoc.neschopen_do '+    

      'FROM DBA.mznemoc2009 as nemoc,DBA.mzosobnikarty '+    

      'WHERE rok_id=nemoc.rok_id and rodne_cislo_id=id_rodne_cislo and '+    

      'nemoc.data_id=mzosobnikarty.data_id  and '+    

      '(nemoc.data_id = ggetdataid() or ggetdataid()>=999) '+    

      'and (YMD(nemoc.rok_id,nemoc.proplatit_M,1)>=:qvar_date1 and '+    

      'YMD(nemoc.rok_id,nemoc.proplatit_M,1)<=:qvar_date2) ';

 

   If order=0 then SQL.Text:=SQL.Text+                 // pokud se má třídit dle os.cisla potom                                            

      'ORDER BY rok_id, osobni_cislo_id, id_poradi ';

   If order=1 then SQL.Text:=SQL.Text+                   // pokud se má třídit dle jména                                            

      'ORDER BY rok_id, clovek ';

   // naplníme parametry pro Query

   Params.ParamByName('qvar_date1').AsDate:=StrToDate(Sheet.CellByName('C2'));

   Params.ParamByName('qvar_date2').AsDate:=StrToDate(Sheet.CellByName('C3'));      

   // otevři dotaz          

   Open;

 

   r:=Sheet.FixedRows +1; // řádky budeme vkládat od fixovaného záhlaví reportu dále

             

   while not Query.Eof do // projdeme všechny řádky reportu

   begin

     while Sheet.RowCount -1<r do Sheet.AddRow ; // pokud je počet řádků dotazu menší než počet řádků reportu přidáme další

 

     // na příslušný řádek r vložíme do buňek hodnoty z dotazu

     Sheet.Cells[2,r]:=Query.FieldByName('osobni_cislo_id').AsString;

     Sheet.MergeCells (3,r,4,r);        

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

     Sheet.Cells[5,r]:=Query.FieldByName('neschopen_od').AsString;

     Sheet.Cells[6,r]:=Query.FieldByName('neschopen_do').AsString;        

 

     // buňky obarví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;

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

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

 

     inc(r); // další řádek r+1

     Query.Next; // další řádek v query

   end;    

 finally

   Free; // zlikvidujeme Query, které jsme vyrobili

 end;

                   

 Sheet.EndUpdate ;                                            

end;

 

Po otevření reportu zavoláme Drill s utříděním 0 - dle os.čísla kvůli prvotnímu zobrazení dat:

V property editoru použijte lookupbox a posuvníkem se přesuňte na poslední položku a vyberte ReportProperty: Poklepejte na prázdné políčko vpravo od OnBeforeReport, tím vygenerujete událost OnBeforeReport

v této události pouze zavoláme výše napsanou proceduru Drill:

procedure OnBeforeReport(Sender : TReportProperty);

begin

 Sheet.RowCount:=7;

 Sheet.ColCount:=8;

 Sheet.FixedRows:=5;    

 

 

 Drill(0);                  

end;

 

Nyní už jen zbývá interaktivita CheckBoxů. Pro obě komponenty napíšeme pouze jednu událost OnClick a nazveme ji například ChangeOrder, v ní opět zavoláme již vytvořenou proceduru Drill a jako parametr použijeme Tag, který jsme CheckBox-ům přiřadili v designu reportu.

procedure ChangeOrder(Sender : TObject);

begin

 Drill(TComponent(Sender).Tag);

end;

... a potom už stačí tuto proceduru přiřadit událostem OnClick příslušným komponentám CheckBox v buňkách E2 a E3

 

procedure OnPrepareScript(Sender : TReportProperty);

begin

 If Sheet.GetCellProperty('E2').CellComponent <>nil then                       // opravdu je komponenta na buňce E2 ?

 TCheckBox(Sheet.GetCellProperty('E2').CellComponent).OnClick:=@ChangeOrder;   // přiřaď události OnClick CheckBoxu proceduru ChangeOrder

 

 If Sheet.GetCellProperty('E3').CellComponent<>nil then

 TCheckBox(Sheet.GetCellProperty('E3').CellComponent).OnClick:=@ChangeOrder;                                                                                     end;  

 

begin

end.

 

Další možné úpravy reportu:

- report nereaguje okamžitě na změnu datumu v buňkách C2 a C3, upravte report, tak aby tomu tak bylo

- upravte report tak, aby se utřídění změnilo i po kliknutí myši na záhlaví sloupců, tedy po kliku na buňku B5 resp. B6