Printimi i një Shume Grupi në Krye të Grupit
Printimi i një Shume Grupi në Krye të Grupit
Kjo metodë përdoret shpesh dhe kërkon përdorimin e një skripti sepse vlera e një shume grupi dihet vetëm pasi të jenë përpunuar të gjitha rekordet në grup. Për të shfaqur shumën në krye të grupit (dmth. para se grupi të dalë në raport) përdoret algoritmi i mëposhtëm:
- aktivizoni opsionin e raportit me dy kalime (“Raporti > Opsionet...” artikulli i menusë)
- në kalimin e parë, llogaritni shumat për secilin grup dhe ruajini ato në një array
- në kalimin e dytë, nxirrni vlerat nga array dhe shfaqini ato në kryet e grupeve
Le të tregojmë dy metoda për kryerjen e këtij detyre. Së pari krijoni një klon të raportit '147 - Stoku si Datë nga Depo dhe Artikuj' që mund të gjendet në menunë e programit 'Mallit | Raportet e Stokut | Stoku Aktual'.
Aktivizoni kalimin e dyfishtë në cilësimet e raportit (“Raporti > Opsionet...” artikulli i menusë). Në redaktorin e bandës “KryeGrupi”, futni tbIzpisTrenZaloga."acWarehouse" fushën e të dhënave. Lidheni bandën e të dhënave me burimin e të dhënave “Grupi” dhe pastaj rregulloni disa objekte në mënyrën e mëposhtme:

Për të shfaqur shumën ne përdorim objektet me ngjyra në dizajn. Ne i quajtëm "Sum1" dhe "Sum2".
Në objektin e quajtur "Sum1" do të shfaqet rezultati i metodës së parë dhe nën objektin e quajtur "Sum2" do të shfaqet rezultati i metodës së dytë.
Metoda e parë.
Ne do të përdorim klasën "TStringList" si një array për ruajtjen e shumave - ne do të ruajmë vlerat numerike si vargje. Artikulli i parë në StringList do të korrespondonte me shumën e grupit të parë, dhe kështu me radhë. Një variabël e plotë (e cila do të rritet pas printimit të secilit grup) përdoret për të llogaritur numrin e indeksit të grupit.
Pra, skripti ynë do të duket kështu:
var
List: TStringList;
i: Integer;
procedura OnStartReport(Sender: TfrxComponent);
fillim
List := TStringList.Create;
fund;
procedura OnStopReport(Sender: TfrxComponent);
fillim
List.Free;
fund;
procedura Page1OnBeforePrint(Sender: TfrxComponent);
fillim
i := 0;
fund;
procedura hSkladOnBeforePrint(Sender: TfrxComponent);
fillim
nëse Engine.FinalPass atëherë
Sum1.Text := 'Shuma: ' + List[i];
fund;
procedura fSkladOnBeforePrint(Sender: TfrxComponent);
fillim
nëse jo Engine.FinalPass atëherë
List.Add(FormatFloat('#,##0.00',SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detaj));
Inc(i);
fund;
fillim
fund.
Emrat e procedurave në skript tregojnë cilat ngjarje kemi përdorur. Ato janë: “Raporti.OnStartReport”, “Raporti.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" dhe "fSklad.OnBeforePrint". Dy ngjarjet e para thirren në fillim dhe në fund të raportit përkatësisht. Për të krijuar menaxherë për këto dy ngjarje zgjidhni objektin “Raporti” në listën e rënies së inspektorit të objekteve dhe pronat e tij do të shfaqen në inspektorin e objekteve. Pastaj kaloni në tabin “Ngjarjet” të inspektorit të objekteve dhe krijoni menaxherët.
Pse nuk e krijuam variablën “List” në procedurën kryesore të skriptit? Ne e krijuam atë në ngjarjen "OnStartReport" sepse variablat e krijuara dinamikisht duhet të shkatërrohen pasi raporti të ketë përfunduar. Është logjike të krijoni variabla dinamike në ngjarjen “OnStartReport” dhe t'i shkatërroni ato në ngjarjen “OnStopReport”. Në raste të tjera (kur memoria nuk ka nevojë të lirohet pas përfundimit të skriptit) mund të përdoret procedura kryesore e skriptit për inicializimin e variablave.
Krijimi dhe shkatërrimi i variablës “List” është i thjeshtë. Tani le të shohim se si funksionon skripti. Në fillim të faqes, numri i numëruesit për grupin aktual (variabla “i”) resetizohet në zero dhe rritet pas çdo grupi që është printuar (në ngjarjen “GroupFooter1.OnBeforePrint”). Shuma e llogaritur shtohet në “List” në këtë ngjarje para se numëruesi të rritet. Ngjarja “GroupHeader1.OnBeforePrint” nuk bën asgjë gjatë kalimit të parë (nëse kushti “Engine.FinalPass”) por gjatë kalimit të dytë (kur “List” është mbushur me vlera) shuma përkatëse për grupin aktual merret nga “List” dhe del në objektin "Sum1" për të shfaqur shumën në krye të grupit. Në raportin e përfunduar, ajo shfaqet si më poshtë:
Ky algoritëm është mjaft i thjeshtë. Megjithatë, ai mund të thjeshtohet.
Metoda e dytë.
Ne do të përdorim koleksionin e variablave të raportit si një array për ruajtjen e shumave të grupeve. Mos harroni se variablat e raportit aksesohen përmes funksioneve “Get” dhe “Set”. Përdorimi i këtyre funksioneve gjithashtu na kursen nga nevoja për të krijuar dhe shkatërruar këto variabla në mënyrë eksplicite. Skripti ynë do të duket si më poshtë:
procedura hSkladOnBeforePrint(Sender: TfrxComponent);
fillim
nëse Engine.FinalPass atëherë
Sum2.Text := 'Shuma: ' + FormatFloat('#,##0.00', Get(<tbIzpisTrenZaloga."acWarehouse">));
fund;
procedura GroupFooter1OnBeforePrint(Sender: TfrxComponent);
fillim
Set(<tbIzpisTrenZaloga."acWarehouse">, SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detaj));
fund;
fillim
fund.
Sikur e shihni, ky skript është disi më i thjeshtë. Kodi në menaxherin “fSklad.OnBeforePrint” vendos vlerën e një variabli me një emër të nxjerrë nga numri i klientit (ose çdo identifikues tjetër që identifikon qartë klientin mund të përdoret, për shembull <tbIzpisTrenZaloga."acWarehouse">). Nëse nuk ka një variabël me atë emër që ekziston tashmë, atëherë skripti automatikisht e krijon atë; përndryshe, nëse ekziston, atëherë vlera e saj përditësohet. Në menaxherin “hSklad.OnBeforePrint” vlera e variablës përkatëse merret.
Raporti i përfunduar shfaqet si më poshtë:

Metoda e dytë nuk funksionon për grupimin e shumëfishtë dhe për shfaqjen e shumave të shumta të fushave në krye të grupit.
Një shembull i disa shumave të fushave në krye të grupit është në raportin '32A - Pagesat e Vonuara - Nga Dokumentet e Lidhura' që është në menunë e programit 'Financat | Raportet | Pagesat e Vonuara'.