Ispisivanje zbroja grupe u zaglavlju grupe
Ispisivanje zbroja grupe u zaglavlju grupe
Ova metoda se često koristi i zahtijeva korištenje skripte jer je vrijednost zbroja grupe poznata tek nakon što su svi zapisi u grupi obrađeni. Da bismo prikazali zbroj u zaglavlju grupe (tj. prije nego što se grupa ispiše u izvještaj) koristi se sljedeći algoritam:
- uključite opciju izvještaja s dva prolaza (“Izvještaj > Opcije...” stavka iz izbornika)
- u prvom prolazu, izračunajte zbrojeve za svaku grupu i spremite ih u niz
- u drugom prolazu, izdvojite vrijednosti iz niza i prikažite ih u zaglavljima grupa
Pokažimo dvije metode za izvršavanje ovog zadatka. Prvo stvorite klon izvještaja '147 - Stanje zaliha na datum po skladištima i stavkama' koji se može pronaći u izborniku programa 'Roba | Izvještaji o zalihama | Trenutne zalihe'.
Omogućite dvostruki prolaz u postavkama izvještaja (“Izvještaj > Opcije...” stavka iz izbornika). U uređivaču benda “GroupHeader” unesite tbIzpisTrenZaloga."acWarehouse" polje podataka. Povežite podatkovni bend s izvorom podataka “Group” i zatim rasporedite neke objekte na sljedeći način:

Za prikaz zbroja koristimo obojene objekte u dizajnu. Nazvali smo ih "Sum1" i "Sum2".
U objektu nazvanom "Sum1" bit će prikazan rezultat prve metode, a uobjektu nazvanom "Sum2" bit će prikazan rezultat druge metode.
Prva metoda.
Koristit ćemo klasu "TStringList" kao niz za pohranu zbrojeva - pohranjivat ćemo numeričke vrijednosti kao stringove. Prva stavka u StringListu odgovarat će zbroju prve grupe, i tako dalje. Cjelobrojna varijabla (koju ćemo povećavati nakon ispisa svake grupe) koristi se za izračunavanje indeksa grupe.
Naš skript će izgledati ovako:
var
List: TStringList;
i: Integer;
procedure OnStartReport(Sender: TfrxComponent);
begin
List := TStringList.Create;
end;
procedure OnStopReport(Sender: TfrxComponent);
begin
List.Free;
end;
procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
i := 0;
end;
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum1.Text := 'Zbroj: ' + List[i];
end;
procedure fSkladOnBeforePrint(Sender: TfrxComponent);
begin
if not Engine.FinalPass then
List.Add(FormatFloat('#,##0.00',SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detail)));
Inc(i);
end;
begin
end.
Imena procedura u skripti pokazuju koje smo događaje koristili. To su: “Izvještaj.OnStartReport”, “Izvještaj.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" i "fSklad.OnBeforePrint". Prva dva događaja se pozivaju na početku i na kraju izvještaja. Da biste stvorili rukovatelje za ova dva događaja, odaberite objekt “Izvještaj” u padajućem popisu inspektora objekata i njegove će se postavke pojaviti u inspektoru objekata. Zatim prebacite se na karticu “Događaji” inspektora objekata i stvorite rukovatelje.
Zašto nismo stvorili varijablu “List” u glavnoj proceduri skripte? Stvorili smo je u događaju "OnStartReport" jer se dinamički stvorene varijable trebaju uništiti nakon što je izvještaj završen. Logično je stvoriti dinamičke varijable u događaju “OnStartReport” i uništiti ih u događaju “OnStopReport”. U drugim slučajevima (kada nije potrebno osloboditi memoriju nakon završetka skripte) može se koristiti glavna procedura skripte za inicijalizaciju varijabli.
Stvaranje i uništavanje varijable “List” je jednostavno. Sada pogledajmo kako skripta radi. Na početku stranice brojač za trenutnu grupu (varijabla “i”) se resetira na nulu i povećava se nakon što je svaka grupa ispisana (u događaju “GroupFooter1.OnBeforePrint”). Izračunati zbroj se dodaje u “List” u ovom događaju prije nego što se brojač poveća. Događaj “GroupHeader1.OnBeforePrint” ne radi ništa tijekom prvog prolaza (ako je uvjet “Engine.FinalPass”) ali tijekom drugog prolaza (kada je “List” ispunjen vrijednostima) zbroj koji odgovara trenutnoj grupi se dohvaća iz “List” i ispisuje se u objekt "Sum1" kako bi se prikazao zbroj u zaglavlju grupe. U završenom izvještaju, pojavljuje se na sljedeći način:
Ovaj algoritam je prilično jednostavan. Međutim, može se pojednostaviti.
Druga metoda.
Koristit ćemo kolekciju varijabli izvještaja kao niz za pohranu zbrojeva grupa. Zapamtite da se varijablama izvještaja pristupa putem funkcija “Get” i “Set”. Korištenje ovih funkcija također nas spašava od potrebe da eksplicitno stvaramo i uništavamo ove varijable. Naša skripta će izgledati ovako:
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum2.Text := 'Zbroj: ' + FormatFloat('#,##0.00', Get(<tbIzpisTrenZaloga."acWarehouse">));
end;
procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
begin
Set(<tbIzpisTrenZaloga."acWarehouse">, SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detail));
end;
begin
end.
Kao što možete vidjeti, ova skripta je donekle jednostavnija. Kod u rukovatelju “fSklad.OnBeforePrint” postavlja vrijednost varijable koja ima ime izvedeno iz broja klijenta (ili se može koristiti bilo koji drugi identifikator koji nedvosmisleno identificira klijenta, na primjer <tbIzpisTrenZaloga."acWarehouse">). Ako ne postoji varijabla s tim imenom, skripta je automatski stvara; inače, ako već postoji, tada se njezina vrijednost ažurira. U rukovatelju “hSklad.OnBeforePrint” dohvaća se vrijednost odgovarajuće varijable.
Završeni izvještaj pojavljuje se na sljedeći način:

Druga metoda ne radi za višestruko grupiranje i za prikaz višestrukih zbrojeva polja u zaglavlju grupe.
Primjer nekoliko zbrojeva polja u zaglavlju grupe nalazi se u izvještaju '32A - Kašnjenja u plaćanju - Po povezanim dokumentima' koji se nalazi u izborniku programa 'Financije | Izvještaji | Kašnjenja u plaćanju'.