Štampanje zbirne vrednosti u zaglavlju grupe
Štampanje zbirne vrednosti u zaglavlju grupe
Ova metoda se često koristi i zahteva korišćenje skripta jer je vrednost zbirne vrednosti poznata tek nakon što su svi zapisi u grupi obrađeni. Da bismo prikazali zbir u zaglavlju grupe (tj. pre nego što se grupa prikaže u izveštaju) koristi se sledeći algoritam:
- uključite opciju izveštaja sa dva prolaza (“Izveštaj > Opcije...” stavka u meniju)
- u prvom prolazu, izračunajte sume za svaku grupu i sačuvajte ih u nizu
- u drugom prolazu, izdvojite vrednosti iz niza i prikažite ih u zaglavljima grupa
Prikažimo dve metode za izvršavanje ovog zadatka. Prvo kreirajte klon izveštaja '147 - Stanje zaliha na datum po skladištima i stavkama' koji se može naći u meniju programa 'Robna | Izveštaji o zalihama | Trenutne zalihe'.
Omogućite dvostruki prolaz u podešavanjima izveštaja (“Izveštaj > Opcije...” stavka u meniju). U editoru benda “GroupHeader”, unesite tbIzpisTrenZaloga."acWarehouse" polje podataka. Povežite podatkovni bend sa izvorom podataka “Grupa” i zatim rasporedite neke objekte na sledeći način:

Da bismo prikazali zbir koristimo obojene objekte u dizajnu. Nazvali smo ih "Sum1" i "Sum2".
U objektu nazvanom "Sum1" biće prikazan rezultat prve metode, a uobjektu nazvanom "Sum2" biće prikazan rezultat druge metode.
Prva metoda.
Koristićemo klasu "TStringList" kao niz za čuvanje suma - čuvaćemo numeričke vrednosti kao stringove. Prva stavka u StringList-u će odgovarati sumi prve grupe, i tako dalje. Celobrojna promenljiva (koju ćemo inkrementirati nakon štampanja 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 := 'Zbir: ' + 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 skriptu pokazuju koje događaje smo koristili. Oni su: “Izveštaj.OnStartReport”, “Izveštaj.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" i "fSklad.OnBeforePrint". Prva dva događaja se pozivaju na početku i na kraju izveštaja. Da biste kreirali rukovaoce za ova dva događaja, izaberite objekat “Izveštaj” u padajućem meniju inspektora objekata i njegovi svojstva će se pojaviti u inspektoru objekata. Zatim pređite na karticu “Događaji” inspektora objekata i kreirajte rukovaoce.
Zašto nismo kreirali promenljivu “List” u glavnoj proceduri skripta? Kreirali smo je u događaju "OnStartReport" jer se dinamički kreirane promenljive treba uništiti nakon što je izveštaj završen. Logično je kreirati dinamičke promenljive u događaju “OnStartReport” i uništiti ih u događaju “OnStopReport”. U drugim slučajevima (kada ne treba osloboditi memoriju po završetku skripta) može se koristiti glavna procedura skripta za inicijalizaciju promenljivih.
Kreiranje i uništavanje promenljive “List” je jednostavno. Sada hajde da vidimo kako skript funkcioniše. Na početku stranice, brojač za trenutnu grupu (promenljiva “i”) se resetuje na nulu i inkrementira se nakon što je svaka grupa štampana (u događaju “GroupFooter1.OnBeforePrint”). Izračunati zbir se dodaje u “List” u ovom događaju pre nego što se brojač inkrementira. Događaj “GroupHeader1.OnBeforePrint” ne radi ništa tokom prvog prolaza (ako je uslov “Engine.FinalPass”) ali tokom drugog prolaza (kada je “List” popunjen vrednostima) zbir koji odgovara trenutnoj grupi se preuzima iz “List” i prikazuje se u objektu "Sum1" da bi se prikazao zbir u zaglavlju grupe. U završenom izveštaju, pojavljuje se na sledeći način:
Ovaj algoritam je prilično jednostavan. Međutim, može se pojednostaviti.
Druga metoda.
Koristićemo kolekciju izveštajnih promenljivih kao niz za čuvanje zbirnih vrednosti grupa. Zapamtite da se izveštajne promenljive pristupaju putem funkcija “Get” i “Set”. Korišćenje ovih funkcija nas takođe štedi od potrebe da eksplicitno kreiramo i uništavamo ove promenljive. Naš skript će izgledati ovako:
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum2.Text := 'Zbir: ' + 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 videti, ovaj skript je donekle jednostavniji. Kod u rukovaocu “fSklad.OnBeforePrint” postavlja vrednost promenljive koja ima ime izvedeno iz broja klijenta (ili se može koristiti bilo koji drugi identifikator koji jednoznačno identifikuje klijenta, na primer <tbIzpisTrenZaloga."acWarehouse">). Ako ne postoji promenljiva sa tim imenom, skript je automatski kreira; inače, ako već postoji, njena vrednost se ažurira. U rukovaocu “hSklad.OnBeforePrint” se preuzima vrednost odgovarajuće promenljive.
Završeni izveštaj se pojavljuje na sledeći način:

Druga metoda ne funkcioniše za višestruko grupisanje i za prikazivanje više suma polja u zaglavlju grupe.
Primer nekoliko suma polja u zaglavlju grupe je u izveštaju '32A - Kašnjenja u plaćanju - Po povezanim dokumentima' koji se nalazi u meniju programa 'Finansije | Izveštaji | Kašnjenja u plaćanju'.