Печатење на групна сума во заглавието на групата
Печатење на групна сума во заглавието на групата
Оваа метода се користи доста често и бара користење на скрипта бидејќи вредноста на групната сума е позната само по обработката на сите записи во групата. За да се прикаже сумата во заглавието на групата (т.е. пред групата да биде излезена во извештајот) се користи следниот алгоритам:
- вклучете ја опцијата за извештај со два проаѓања (“Извештај > Опции...” мени ставка)
- во првото проаѓање, пресметајте ги сумите за секоја група и зачувајте ги во низата
- во второто проаѓање, извлечете ги вредностите од низата и прикажете ги во заглавијата на групите
Да покажеме две методи за извршување на оваа задача. Прво создадете клон на извештајот '147 - Склад на датум по складишта и артикли' кој може да се најде во програмското мени 'Стоки | Извештаи за Склад | Тековен Склад'.
Овозможете двојно проаѓање во поставките на извештајот (“Извештај > Опции...” мени ставка). Во уредникот на бендот “GroupHeader”, внесете го tbIzpisTrenZaloga."acWarehouse" полето за податоци. Поврзете го бендот за податоци со изворот на податоци “Група” и потоа распоредете некои објекти на следниов начин:

За да ја прикажеме сумата, користиме обоени објекти во дизајнот. Ги именувавме "Sum1" и "Sum2".
Во објектот именуван "Sum1" резултатот од првата метода ќе биде прикажан и вообјектот именуван "Sum2" резултатот од втората метода ќе биде прикажан.
Првата метода.
Ќе ја користиме класата "TStringList" како низa за чување на сумите - ќе ги чуваме бројчаните вредности како низи. Првиот елемент во StringList ќе одговара на сумата на првата група, и така натаму. Целобројна променлива (која ќе ја зголемуваме по печатењето на секоја група) се користи за пресметување на индексниот број на групата.
Така нашата скрипта ќе изгледа вака:
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 := 'Сума: ' + 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.
Имената на процедурите во скриптата покажуваат кои настани сме ги користеле. Тие се: “Извештај.OnStartReport”, “Извештај.OnStopReport”, "Page1.OnBeforePrint", "hSkladHeader1.OnBeforePrint" и "fSklad.OnBeforePrint". Првите две настани се повикуваат на почетокот и на крајот на извештајот соодветно. За да создадете обработувачи за овие два настани, изберете го објектот “Извештај” во паѓачкиот список на инспекторот на објекти и неговите својства ќе се појават во инспекторот на објекти. Потоа префрлете се на табот “Настани” на инспекторот на објекти и создадете ги обработувачите.
Зошто не ја создадовме променливата “List” во главната процедура на скриптата? Ја создадовме во настанот "OnStartReport" бидејќи динамички создадените променливи треба да се уништат по завршувањето на извештајот. Логично е да се создадат динамички променливи во настанот “OnStartReport” и да се уништат во настанот “OnStopReport”. Во другите случаи (кога меморијата не треба да се ослободи по завршувањето на скриптата) може да се користи главната процедура на скриптата за инициализација на променливите.
Создавањето и уништувањето на променливата “List” е едноставно. Сега да видиме како работи скриптата. На почетокот на страницата, бројачот за тековната група (променливата “i”) се ресетира на нула и се зголемува по печатењето на секоја група (во настанот “GroupFooter1.OnBeforePrint”). Пресметаната сума се додава во “List” во овој настан пред бројачот да се зголеми. Настанот “GroupHeader1.OnBeforePrint” не прави ништо за време на првото проаѓање (Ако условот “Engine.FinalPass”) но за време на второто проаѓање (кога “List” е исполнета со вредности) сумата која одговара на тековната група се извлекува од “List” и се изнесува во објектот "Sum1" за да се прикаже сумата во заглавието на групата. Во завршениот извештај, изгледа вака:
Овој алгоритам е доста едноставен. Сепак, може да се поедностави.
Втората метода.
Ќе ја користиме колекцијата на променливи на извештајот како низa за чување на групните суми. Запомнете дека променливите на извештајот се достапни преку функциите “Get” и “Set”. Користењето на овие функции исто така не ни заштедува од потребата да создадеме и уништиме овие променливи експлицитно. Нашата скрипта ќе изгледа вака:
procedure hSkladOnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
Sum2.Text := 'Сума: ' + FormatFloat('#,##0.00', Get(<tbIzpisTrenZaloga."acWarehouse">));
end;
procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
begin
Set(<tbIzpisTrenZaloga."acWarehouse">, SUM(<tbIzpisTrenZaloga."ZALVREDNOST">, Detail));
end;
begin
end.
Како што можете да видите, оваа скрипта е малку поедноставна. Кодот во обработувачот “fSklad.OnBeforePrint” ја поставува вредноста на променливата со име добиено од бројот на клиентот (или било кој друг идентификатор кој недвосмислено го идентификува клиентот може да се користи, на пример <tbIzpisTrenZaloga."acWarehouse">). Ако не постои променлива со тоа име, скриптата автоматски ја создава; инаку, ако постои, нејзината вредност се ажурира. Во обработувачот “hSklad.OnBeforePrint” вредноста на соодветната променлива се извлекува.
Завршениот извештај изгледа вака:

Втората метода не функционира за повеќекратно групирање и за прикажување на повеќе суми на полиња во заглавието на групата.
Пример за неколку суми на полиња во заглавието на групата е во извештајот '32A - Доцнење на Плаќања - По Поврзани Документи' кој е во програмското мени 'Финансии | Извештаи | Доцнење на Плаќања'.