ТОРГ-12

отредактировано 17:44 Раздел: FastReport 3.0
Всем доброе время суток!

Обращаюсь к всезнающим форумянам, так как у самого идей по этому поводу никаких... ;)

Как в FR3, товарной накладной ТОРГ-12, сделать итог данных на каждой странице???

Заранее спасиба!

Комментарии

  • отредактировано March 2005
    Тут вверху есть кнопка поиск....
    См. http://www.fast-report.com/en/forum/?p=/discussion/1887
  • отредактировано 17:44
    Есть-то она есть... Как я понял, вопрос решается использованием Footer с опцией AfterEachRow у MasterData, так? Но в этом случе Footer печатается не в конце набора данных на странице, а после каждой его записи. Или я что-то не понял?
  • отредактировано 17:44
    Я использую ColumnFooter и Footer, т.к. использую ReportSummary (там подписи), а ColumnFooter печатается после ReportSummary (как мне кажется не логично) и поэтому перед печатью ReportSummary ColumnFooter.Visible:=false
  • SvetkinSvetkin СПб
    отредактировано 17:44
    А механизм подсчета по страницы у тебя каков?
  • отредактировано 17:44
    2 Svetkin

    Агрегатная функция. Никакой экзотики...
    [SUM(<frxDB."Count">, MasterData1)]
    А вот где ее так разместить, чтобы она в конце каждой страницы отображалась...

    2 Bali

    Да, так можно подсчитать итог, но только по первой странице. На второй и последующих, при помощи Footer, выводиться сумма вобщем. И еще мне не совсем понятно, как действует ColumnFooter, действительно, то, что он печатается после подвала отчета, исключительно не логично.
  • отредактировано 17:44
    пришлось делать двухпроходным, т.к. при одном проходе
    не считает в случае одной страницы в накладной.
    ( Если бы была возможность выводить 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;
  • отредактировано 17:44
    2 Bali

    Я всегда знал, что отечественные программеры отличаются умом и сообразительностью и найдут выход из любой ситуации! ;)
    Выручил! Спасиба!
  • отредактировано 17:44
    Коллеги, такая же трабла! у меня проблема с последней страницей! с предыдушими все нормально - суммы по странице вывожу в PageFooter, а на последней страннице печатается сумма всего отчета в Footer! буду бесконечно счастлив и признателен за наводщие мысли! можно ли обойтись без скрипта?
  • отредактировано 17:44
    Без скрипта никак.
    Если не печатать РаgeFooter на последней странице, то не будет итогов по последней странице, а если печатать и Footter и PageFooter, то Итоги по странице будут ниже итогов по отчету.
    Да и PageFooter оторван от отчета, что некрасиво, так что лучше использовать ColumnFooter.

    Я уже обращался к авторам, но не получил ответа, хотелось бы чтобы ColumnFooter печатался ПЕРЕД Footer и ReportSummary, а не после, тогда не нужно бы было использовать Скрипт и 2 прохода.
  • отредактировано 17:44
    Bali написал: »
    Без скрипта никак.
    Если не печатать РаgeFooter на последней странице, то не будет итогов по последней странице, а если печатать и Footter и PageFooter, то Итоги по странице будут ниже итогов по отчету.
    Да и PageFooter оторван от отчета, что некрасиво, так что лучше использовать ColumnFooter.

    Я уже обращался к авторам, но не получил ответа, хотелось бы чтобы ColumnFooter печатался ПЕРЕД Footer и ReportSummary, а не после, тогда не нужно бы было использовать Скрипт и 2 прохода.

    если кому надо могу дать исходник ТОРГ12, который сделал для своей системы, понятное дело переделывать под Вас не буду (исходник для того, чтобы Вы поняли что да как). единственное, версия FR2.51, но смысл алгоритма один и тот же... пишите в личку с мылом, на которое надо отправить..
  • SiOSiO
    отредактировано 17:44
    Bali написал: »
    пришлось делать двухпроходным, т.к. при одном проходе
    не считает в случае одной страницы в накладной.
    ( Если бы была возможность выводить 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;
    Появилась задача реализовать сумму на странице в ФР3, обгуглил все интернеты, адекватного решения найти не смог.
    Извиняюсь за некропостинг, но если всё-же кого-то интересует решение данной проблемы, в более простом исполнении, то можно организовать таким образом:

    СКРИПТ:
    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 условие на группу изменяется. Группа завершается подсчитывается сумма и создается новая страница, при этом первая и финальная страница формируются в обычном режиме.

    Этот вариант так же учитывает различную высоту строк, если они присустсвуют.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.