Tipărirea unei sume de grup în antetul grupului
Tipărirea unei sume de grup în antetul grupului
Această metodă este folosită destul de des și necesită utilizarea unui script deoarece valoarea unei sume de grup este cunoscută doar după ce toate înregistrările din grup au fost procesate. Pentru a afișa suma în antetul grupului (adică înainte ca grupul să fie ieșit în raport) se folosește următorul algoritm:
- activați opțiunea de raportare în două treceri (“Raport > Opțiuni...” element de meniu)
- în prima trecere, calculați sumele pentru fiecare grup și salvați-le într-un array
- în a doua trecere, extrageți valorile din array și afișați-le în anteturile grupului
Să arătăm două metode pentru a efectua această sarcină. Mai întâi creați un clonă a raportului '147 - Stoc la data de către depozite și articole' care poate fi găsit în meniul programului 'Bunuri | Rapoarte de stoc | Stoc curent'.
Activați dublu-pas în setările raportului (“Raport > Opțiuni...” element de meniu). În editorul benzii “GroupHeader”, introduceți tbIzpisTrenZaloga."acWarehouse" câmp de date. Conectați banda de date la sursa de date “Group” și apoi aranjați câteva obiecte în următoarea manieră:

Pentru a afișa suma, folosim obiectele colorate în design. Le-am numit "Sum1" și "Sum2".
În obiectul numit "Sum1" rezultatul primei metode va fi afișat și în in obiectul numit "Sum2" rezultatul celei de-a doua metode va fi afișat.
Prima metodă.
Vom folosi clasa "TStringList" ca un array pentru stocarea sumelor - vom stoca valorile numerice ca șiruri. Primul element din StringList va corespunde sumei primului grup, și așa mai departe. O variabilă întreagă (pe care o vom incrementa după ce tipărim fiecare grup) este folosită pentru a calcula numărul de index al grupului.
Așadar, scriptul nostru va arăta astfel:
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 := 'Sum: ' + 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.
Numele procedurilor din script arată ce evenimente am folosit. Acestea sunt: “Raport.OnStartReport”, “Raport.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" și "fSklad.OnBeforePrint". Primele două evenimente sunt apelate la începutul și la sfârșitul raportului, respectiv. Pentru a crea handleri pentru aceste două evenimente, selectați obiectul “Raport” din lista derulantă a inspectorului de obiecte și proprietățile sale vor apărea în inspectorul de obiecte. Apoi, comutați la tab-ul “Evenimente” al inspectorului de obiecte și creați handlerii.
De ce nu am creat variabila “List” în procedura principală a scriptului? Am creat-o în evenimentul "OnStartReport" deoarece variabilele create dinamic ar trebui distruse după ce raportul a fost finalizat. Este logic să creăm variabile dinamice în evenimentul “OnStartReport” și să le distrugem în evenimentul “OnStopReport”. În alte cazuri (când memoria nu trebuie eliberată la finalizarea scriptului) se poate folosi procedura principală a scriptului pentru inițializarea variabilelor.
Crearea și distrugerea variabilei “List” este simplă. Acum să vedem cum funcționează scriptul. La începutul paginii, contorul pentru grupul curent (variabila “i”) este resetat la zero și este incrementat după ce fiecare grup a fost tipărit (în evenimentul “GroupFooter1.OnBeforePrint”). Suma calculată este adăugată la “List” în acest eveniment înainte ca contorul să fie incrementat. Evenimentul “GroupHeader1.OnBeforePrint” nu face nimic în timpul primei treceri (dacă condiția “Engine.FinalPass”) dar în timpul celei de-a doua treceri (când “List” a fost umplut cu valori) suma corespunzătoare grupului curent este recuperată din “List” și este ieșită în obiectul "Sum1" pentru a afișa suma în antetul grupului. În raportul finalizat, apare astfel:
Acest algoritm este destul de simplu. Cu toate acestea, poate fi simplificat.
A doua metodă.
Vom folosi colecția de variabile de raport ca un array pentru stocarea sumelor de grup. Amintiți-vă că variabilele de raport sunt accesate prin funcțiile “Get” și “Set”. Utilizarea acestor funcții ne scutește de a crea și distruge explicit aceste variabile. Scriptul nostru va arăta astfel:
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum2.Text := 'Sum: ' + FormatFloat('#,##0.00', Get(<tbIzpisTrenZaloga."acWarehouse">));
end;
procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
begin
Set(<tbIzpisTrenZaloga."acWarehouse">, SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detail));
end;
begin
end.
După cum puteți vedea, acest script este oarecum mai simplu. Codul din handlerul “fSklad.OnBeforePrint” setează valoarea unei variabile având un nume derivat din numărul clientului (sau orice alt identificator care identifică fără ambiguitate clientul ar putea fi folosit, de exemplu <tbIzpisTrenZaloga."acWarehouse">). Dacă nu există deja o variabilă cu acel nume, atunci scriptul o creează automat; altfel, dacă există, atunci valoarea sa este actualizată. În handlerul “hSklad.OnBeforePrint” valoarea variabilei corespunzătoare este recuperată.
Raportul finalizat apare astfel:

A doua metodă nu funcționează pentru grupări multiple și pentru afișarea mai multor sume de câmpuri în antetul grupului.
Un exemplu de mai multe sume de câmpuri în antetul grupului se află în raportul '32A - Plăți întârziate - După documente legate' care se află în meniul programului 'Finanțe | Rapoarte | Plăți întârziate'.