Когда в PageFooter'e появляется значение COUNT()?

отредактировано 03:56 Раздел: FastReport 3.0
Мне надо в подвале страницы напечатать прописью количество строк MasterData, выведенные на страницу. Функцию перевода чисел в строку я к отчёту привязал. Но не могу понять когда мне в PageFooter'e доступно COUNT(MasterData1). Если я в Memo вставляю COUNT(MasterData1), то число печатается в отчёте, но если я на это Memo вешаю OnBeforePrint, чтобы перевести число в строку, то в этот момент в Memo.Value - пустота. Да и обращение к COUNT тоже возвращает пустую строку.
Ну и что в этом случае делать?

Комментарии

  • gpigpi
    отредактировано 03:56
    написал:
    Ну и что в этом случае делать?
    Внимательно почитать документацию. Обратить внимание на особенности вычисления агрегатных функций в отчёте, т.е. для вычисления агрегатной функции выражение должно присутствовать в одном из мемо
  • отредактировано 03:56
    А оно и присутствует:
    в Memo125 (в PageFooter'e) стоит 'COUNT(MasterData1)', а в
    OnBeforePrint у Memo126 (в том же Footer'e) вписано
    procedure Memo126OnBeforePrint(Sender: TfrxComponent);
    var
      s: string;
    begin
      s :=  VarToStr ( Memo125.Value );
      if ( s <> '' ) then
        Memo126.Memo[0] := NUMSPELL ( StrToInt ( s ) );
    end;
    
    проверка на пустоту стоит не случайно, т.к. при однопроходном отчёте на первой странице с данными с 22 строчками в Memo125 выводится 22, а
    VarToStr ( Memo125.Value ) в OnBeforePrint возвращает пустую строку.
    На следующей странице с 17 строчками -
    Memo125.Memo - 17, а VarToStr ( Memo125.Value ) возвращает 22 (значение из предыдущей страницы) и, соответственно на последней странице с 2 строчками имеем:
    Memo125.Memo - 2, VarToStr ( Memo125.Value ) - 17
    Т.е. VarToStr ( Memo125.Value ) возвращает данные предыдущей страницы.
    И как это понимать?
  • gpigpi
    отредактировано 03:56
    написал:
    И как это понимать?
    Наверное, сначала обрабатываются OnBeforePrint для всех элементов бэнда, затем OnAfterData, т.е. приведённый выше код должен работать при размещении его в Memo126OnAfterData, но если вместо Memo125 поставить Memo127, то не будет.
    Да и не проще ли в Memo126 просто написать [NUMSPELL(COUNT(MasterData1))]
    функцию NUMSPELL описать так:
    function NumSpell ( num: Variant; FirstCapital: boolean ) : string;
  • отредактировано 03:56
    Спасибо, я так и сделал ('[NUMSPELL1(COUNT(MasterData1))]'), где
    'NumSpell1(num:Variant) : string' - переходная функция к 'NumSpell (num: LongInt ; FirstCapital: boolean ) : string'. Всё заработало, но причину этой проблемы я так и не понял. Будет время, покопаюсь поподробнее...
    Ещё раз, спасибо!

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

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