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
|