Štampanje zbirne sume u zaglavlju grupe
Štampanje zbirne sume u zaglavlju grupe
Ova metoda se često koristi i zahteva korišćenje skripte jer je vrednost zbirne sume poznata tek nakon što su svi zapisi u grupi obrađeni. Da bi se prikazala suma 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 'Robni | 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 sumu 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) se koristi 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 := 'Suma: ' + 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 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, odaberite 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 skripte? 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 nije potrebno osloboditi memoriju po završetku skripte) može se koristiti glavna procedura skripte za inicijalizaciju promenljivih.
Kreiranje i uništavanje promenljive “List” je jednostavno. Sada hajde da vidimo kako skripta 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čunata suma 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) suma koja odgovara trenutnoj grupi se preuzima iz “List” i prikazuje se u objektu "Sum1" da bi se prikazala suma 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 suma 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 := 'Suma: ' + 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, ova skripta je donekle jednostavnija. 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 nedvosmisleno identifikuje klijenta, na primer <tbIzpisTrenZaloga."acWarehouse">). Ako ne postoji promenljiva sa tim imenom, skripta 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'.