Izpis skupne vsote v skupinskem naslovu
Izpis skupne vsote v skupinskem naslovu
Ta metoda se pogosto uporablja in zahteva uporabo skripta, ker je vrednost skupne vsote znana šele po obdelavi vseh zapisov v skupini. Za prikaz vsote v skupinskem naslovu (tj. pred izhodom skupine v poročilo) se uporablja naslednji algoritem:
- vklopite možnost poročila z dvema prehodoma (izbira menija "Poročilo > Možnosti...")
- v prvem prehodu izračunajte vsote za vsako skupino in jih shranite v tabelo
- v drugem prehodu izvlecite vrednosti iz tabele in jih prikažite v skupinskih naslovih
Prikažimo dve metodi za izvedbo te naloge. Najprej ustvarite klon poročila '147 - Stanje zaloge na datum po skladiščih in artiklih', ki ga najdete v meniju programa 'Blago | Poročila o zalogah | Trenutna zaloga'.
Omogočite dvojni prehod v nastavitvah poročila (izbira menija "Poročilo > Možnosti..."). V urejevalniku banda "GroupHeader" vnesite tbIzpisTrenZaloga.'acWarehouse' podatkovno polje. Povežite podatkovni band z virom podatkov "Group" in nato razporedite nekatere objekte na naslednji način:

Za prikaz vsote uporabljamo obarvane objekte v oblikovanju. Poimenovali smo jih "Sum1" in "Sum2".
V objektu z imenom "Sum1" bo prikazan rezultat prve metode, vobjektu z imenom "Sum2" pa bo prikazan rezultat druge metode.
Prva metoda.
Uporabili bomo razred "TStringList" kot tabelo za shranjevanje vsot - shranjevali bomo numerične vrednosti kot nize. Prvi element v StringList bo ustrezal vsoti prve skupine, in tako naprej. Uporablja se celoštevilska spremenljivka (ki jo bomo povečali po izpisu vsake skupine) za izračun indeksa skupine.
Torej bo naš skript videti takole:
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 := 'Vsota: ' + 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 postopkov v skriptu kažejo, katere dogodke smo uporabili. Ti so: “Report.OnStartReport”, “Report.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" in "fSklad.OnBeforePrint". Prva dva dogodka se pokličejo na začetku in na koncu poročila. Da ustvarite obdelovalce za ta dva dogodka, izberite objekt “Report” v spustnem seznamu in njegove lastnosti se bodo prikazale v inšpektorju objektov. Nato preklopite na zavihek “Dogodki” in ustvarite obdelovalce.
Zakaj nismo ustvarili spremenljivke “List” v glavni proceduri skripta? Ustvarili smo jo v dogodku "OnStartReport", ker bi morale biti dinamično ustvarjene spremenljivke uničene po končanem poročilu. Logično je ustvariti dinamične spremenljivke v dogodku “OnStartReport” in jih uničiti v dogodku “OnStopReport”. V drugih primerih (ko ni potrebno sprostiti pomnilnika ob zaključku skripta) lahko uporabite glavno proceduro skripta za inicializacijo spremenljivk.
Ustvarjanje in uničenje spremenljivke “List” je preprosto. Zdaj poglejmo, kako skript deluje. Na začetku strani se števec za trenutno skupino (spremenljivka “i”) ponastavi na nič in se povečuje po izpisu vsake skupine (v dogodku “GroupFooter1.OnBeforePrint”). Izračunana vsota se doda v “List” v tem dogodku, preden se števec poveča. Dogodek “GroupHeader1.OnBeforePrint” ne naredi ničesar med prvim prehodom (če je pogoj “Engine.FinalPass”), vendar med drugim prehodom (ko je “List” napolnjen z vrednostmi) se vsota, ki ustreza trenutni skupini, pridobi iz “List” in se izpiše v objektu "Sum1", da prikaže vsoto v skupinskem naslovu. V končanem poročilu se prikaže takole:
Ta algoritem je precej preprost. Vendar ga je mogoče poenostaviti.
Druga metoda.
Uporabili bomo zbirko poročilnih spremenljivk kot tabelo za shranjevanje skupnih vsot. Ne pozabite, da se do poročilnih spremenljivk dostopa preko funkcij “Get” in “Set”. Uporaba teh funkcij nas tudi reši potrebe po izrecnem ustvarjanju in uničevanju teh spremenljivk. Naš skript bo videti takole:
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum2.Text := 'Vsota: ' + FormatFloat('#,##0.00', Get(<tbIzpisTrenZaloga."acWarehouse">));
end;
procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
begin
Set(<tbIzpisTrenZaloga."acWarehouse">, SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detail));
end;
begin
end.
Kot vidite, je ta skript nekoliko preprostejši. Koda v obdelovalcu “fSklad.OnBeforePrint” nastavi vrednost spremenljivke, katere ime izhaja iz številke stranke (ali pa se lahko uporabi katerikoli drug identifikator, ki nedvoumno identificira stranko, na primer <tbIzpisTrenZaloga."acWarehouse">). Če spremenljivka s tem imenom že ne obstaja, jo skript samodejno ustvari; sicer, če že obstaja, se njena vrednost posodobi. V dogodku “hSklad.OnBeforePrint” se pridobi vrednost ustrezne spremenljivke.
Končano poročilo se prikaže takole:

Druga metoda ne deluje za večkratno grupiranje in za prikaz več skupnih vsot polj v skupinskem naslovu.
Primer več skupnih vsot polj v naslovu skupine je v poročilu '32A - Pozna plačila - Po povezanih dokumentih', ki je v meniju programa 'Finančni | Poročila | Pozna plačila'.