ТОРГ-12
Всем доброе время суток!
Обращаюсь к всезнающим форумянам, так как у самого идей по этому поводу никаких...
Как в FR3, товарной накладной ТОРГ-12, сделать итог данных на каждой странице???
Заранее спасиба!
Обращаюсь к всезнающим форумянам, так как у самого идей по этому поводу никаких...
Как в FR3, товарной накладной ТОРГ-12, сделать итог данных на каждой странице???
Заранее спасиба!
Комментарии
См. http://www.fast-report.com/en/forum/?p=/discussion/1887
Агрегатная функция. Никакой экзотики...
[SUM(<frxDB."Count">, MasterData1)]
А вот где ее так разместить, чтобы она в конце каждой страницы отображалась...
2 Bali
Да, так можно подсчитать итог, но только по первой странице. На второй и последующих, при помощи Footer, выводиться сумма вобщем. И еще мне не совсем понятно, как действует ColumnFooter, действительно, то, что он печатается после подвала отчета, исключительно не логично.
не считает в случае одной страницы в накладной.
( Если бы была возможность выводить ColumnFooter перед ReportSummary)
rNumToRub и isValidFloat(value) это мои функции
ColumnFooter содержит поля
memo185 [SUM(<ТМЦ_КОЛ>,TMCBAND)]
memo187 [sum(<ТМЦ_СУММА_БЕЗ_НДС>,TMCBAND)]
memo189 [sum(<ТМЦ_НДС>,TMCBAND)]
memo190 [sum(<ТМЦ_СУММА>,TMCBAND)]
Привожу целиком скрипт.
***************************
var
s_kol, s_Nds, s_SumNotNds, s_Summa: variant;
procedure ReportSummary1OnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then
begin
Columnfooter1.visible := false;
memo105.text := FormatFloat(',0.###',s_kol);
memo191.text := FormatFloat(',0.00',s_SumNotNDS);
memo109.text := FormatFloat(',0.00',s_NDS);
memo110.text := FormatFloat(',0.00',s_Summa);
end;
end;
procedure Memo116OnBeforePrint(Sender: TfrxComponent);
var
k: integer;
begin
k := <Line#>;
Memo116.text := rNumToStr(k, 1);
end;
procedure frxReport1OnStartReport(Sender: TfrxComponent);
begin
s_kol :=0;
s_Nds := 0;
s_SumNotNds := 0;
s_Summa := 0;
end;
procedure Memo185OnAfterData(Sender: TfrxComponent); {Это событие ColumnFooter}
begin
if not(Engine.FinalPass) and (value<>null) and isValidFloat(value) then
begin
s_Kol := s_Kol + value;
Memo96.text := FormatFloat(',0.###',value); {Это поле Footer}
end;
end;
procedure Memo187OnAfterData(Sender: TfrxComponent); {Это событие ColumnFooter}
begin
if not(Engine.FinalPass) and (value<>null) and isValidFloat(value) then
begin
s_SumNotNDS := s_SumNotNDS + value;
Memo98.text := FormatFloat(',0.00',value); {Это поле Footer}
end;
end;
procedure Memo189OnAfterData(Sender: TfrxComponent); {Это событие ColumnFooter}
begin
if not(Engine.FinalPass) and (value<>null) and isValidFloat(value) then
begin
s_Nds := s_Nds + value;
Memo100.text := FormatFloat(',0.00',value); {Это поле Footer}
end;
end;
procedure Memo190OnAfterData(Sender: TfrxComponent); {Это событие ColumnFooter}
begin
if not(Engine.FinalPass) and (value<>null) and isValidFloat(value) then
begin
s_Summa := s_Summa + value;
Memo101.text := FormatFloat(',0.00',value); {Это поле Footer}
end;
end;
Я всегда знал, что отечественные программеры отличаются умом и сообразительностью и найдут выход из любой ситуации!
Выручил! Спасиба!
Если не печатать РаgeFooter на последней странице, то не будет итогов по последней странице, а если печатать и Footter и PageFooter, то Итоги по странице будут ниже итогов по отчету.
Да и PageFooter оторван от отчета, что некрасиво, так что лучше использовать ColumnFooter.
Я уже обращался к авторам, но не получил ответа, хотелось бы чтобы ColumnFooter печатался ПЕРЕД Footer и ReportSummary, а не после, тогда не нужно бы было использовать Скрипт и 2 прохода.
если кому надо могу дать исходник ТОРГ12, который сделал для своей системы, понятное дело переделывать под Вас не буду (исходник для того, чтобы Вы поняли что да как). единственное, версия FR2.51, но смысл алгоритма один и тот же... пишите в личку с мылом, на которое надо отправить..
Извиняюсь за некропостинг, но если всё-же кого-то интересует решение данной проблемы, в более простом исполнении, то можно организовать таким образом:
СКРИПТ:
var
c1:integer;
procedure [Например, печать тайтла отчёта]OnAfterPrint(Sender:TfrxComponent);
begin
//начальная инициализация.
c1:=1;
end;
procedure [НУЖНЫЙ БЭНД]OnAfterPrint(Sender:TfrxComponent);
begin
if Engine.CurY>=668 then
//для а4 в альбомной, можно так же сделать через фриспейс или вычесть Y из высоты страницы, чтобы не привязываться к формату бумаги.
begin
c1:=c1+1;
end:
end;
Отчёт:
Cоздаём групповой бенд в подвале которого производим суммирование стандартным способом, а в заголовке пишем условие (condidion): c1
Задаём свойство заголовка группы: StartNewPage:=True;
p.s.:
Таким образом, каждый раз когда значение по Y в движке отчёта пересекает 668 условие на группу изменяется. Группа завершается подсчитывается сумма и создается новая страница, при этом первая и финальная страница формируются в обычном режиме.
Этот вариант так же учитывает различную высоту строк, если они присустсвуют.