получить итоги в заголовках групп

отредактировано 00:48 Раздел: FastReport 4.0
Здравствуйте!
у меня версия FastReport 4.6.8
Подскажите пожалуйста можно ли как-то вывести итоги по группе не в подвале, а в заголовке группы для моей версии?

Комментарии

  • gpigpi
    отредактировано 00:48
    Смотрите FRDemo секция "Dialogs and script" отчёт "Totals in group header"
  • отредактировано 00:48
    gpi написал: »
    Смотрите FRDemo секция "Dialogs and script" отчёт "Totals in group header"

    подскажите пожалуйста где это?
    я знаю что там путь какой-то, возможно
    "идем в демы, ишем там папку main, запускаем FRDemo, выбираем группу..."
    "посмотрите демки, ...Demos\Main\FRDemo.exe..."
    это в интернете написано, но где этот путь, на моём комп-е или на каком-то ftp, сайте?
    как дотуда добраться?
  • отредактировано 00:48
    уже нашёл - обычным поиском в компьютере, туплю : )
  • отредактировано April 2011
    Файл нашёл, и нашёл такой отчёт, но там не понятно, не видно как что делается, только можно догадаться, что переменная итога считается видимо в обработчике какого-то события а потом результат подставляется в заголовок группы.
    у себя в отчёте такую ситуацию воспроизвести не смог, пока.
    Можно сказать дать пример кода?
    потому что в деме версия уже старая и я там не нашёл, кода там нет, как считается переменная, какой обработчик, там сильно отличается вид дизайнера.
    или тогда дайте пожалуйста 4-ую версию FRDemo, чтобы её можно было скачать
  • HunterNSHunterNS Таганрог
    отредактировано 00:48
    Используйте двойной проход по отчету. (В свойствах самого отчета выставите Report.EngineOptions.DoublePass = true).

    На первом проходе сохраните в какую-нибудь переменную значение Итога, а на втором выведите его в Заголовке.

    Для этого в обработчике OnBeforePrint для заголовка группы напишите:

    if engine.FinalPass then Memo1.Text := IntToStr(nSUM);

    где Memo1 - Ваш мемо, куда нужно вывести итоговую сумму.
    а nSUM - это сумма в вашем подвале, который вы сохранили на первом проходе.
  • gpigpi
    отредактировано 00:48
    Смотрите руководство пользователя главу "Печать итоговой суммы по группе в заголовке группы"
  • отредактировано 00:48
    Большое спасибо всем!
    теперь вроде бы знаю всё что нужно.
  • NatalkaNatalka Украина, г.Киев
    отредактировано June 2013
    Здравствуйте. Столкнулась с аналогичной задачей. Просмотрев ссылки на официальную документацию, сделала вывод итоговых значений группы в заголовке через пример с TStringList. Но вывод чисел есть в формате целого числа, типа "1", "56", а мне нужно, чтобы формат был, таким же, как и в MasterData "5,00", "98,00". Форматирование отдельных мемо и т.д. ничего не дало, через DisplayFormat тоже ничего не получилось.
    Подозреваю что проблема именно в TStringList, потому что значения сохраняются как текст, но как обойти это? Есть ли какие-то похожие TList, но чтобы значения были действительными числами?
    Если кто-то сталкивался с данной проблемой, подскажите пожалуйста, как из нее выйти.
    (FR 4.1)
  • отредактировано 00:48
    Не очень разумно использовать TstringList для сохранения целочисленных значений.
    Используйте эти конструкции на выбор:
    1) MyValues: Array of Integer; (или of double)
    ...
    добавление элемента:
    SetLength(MyValues, High(MyValues) + 2);
    MyValues[High(MyValues)] := <число>;
    2) S:TStringList;
    s.add(FormatFloat('0.#########', <значение>))
  • NatalkaNatalka Украина, г.Киев
    отредактировано June 2013
    Nightmareterrible написал: »
    Не очень разумно использовать TstringList для сохранения целочисленных значений.
    Используйте эти конструкции на выбор:
    1) MyValues: Array of Integer; (или of double)
    ...
    добавление элемента:
    SetLength(MyValues, High(MyValues) + 2);
    MyValues[High(MyValues)] := <число>;
    2) S:TStringList;
    s.add(FormatFloat('0.#########', <значение>))

    спасибо за ответ.
    попыталась сделать 2-й вариант, так как полей больше чем 13 т.е. 13 Listов, на FormatFloat - ноль реакции.
    GH1F4List: TStringList;
    GH1F4List.Add(FormatFloat('0.#########',<SUM(<Datasource."F4">,MasterData1,1)>));
    
    все остальное по аналогии из примером в документации. Форматирование мемо числовое.
    а на счет первого варианта не сильно поняла - во первых объявляем массив, и далее добавляем элемент методом, который вы описали SetLength (MyValues, High (MyValues) + 2);
    MyValues ​​[High (MyValues)] = <число>; мой FR не знает что такое переменная High .
    и второй вопрос, каким образом виитягуваты данные из массива при втором проходе репорт? по аналогии с TStringList?
    а как тогда его очищать и т.д. ?
    я недавно просто занимаюсь ФР, поэтому могут у меня быть не совсем умные вопросы.
    еще такая особенность, данные в базе у меня целочисленные, а не дробные, хотя выводить необходимо в формате дробных.
    т.е. сумма в футтере, когда вывожу через showmessage без знаков после комы.
  • отредактировано June 2013
    Думал, вы через Delphi делаете, поэтому написал конструкции для него.
    Для Fr3 единственный нормальный вариант - двойной проход с занесением в переменную.
    Создайте переменную MySum со значением 0

    Допустим, итоговая сумма у вас заносится в Memo123, тогда создаёте для него обработчик onAfterData
    procedure Memo123OnAfterData(Sender: TfrxComponent);
    begin
      Set('MySum', Memo123.Value); // Будет работать корректно, даже если стоит форматирование, например, %2.0n
    end;
    

    А более детально смогу подсказать, если пришлёте макет отчёта.
    Но честно говоря, я у себя в проекте отказался от двойного прохода. Это очень вредно, если страниц штук 120. Гораздо проще считать итоги в SQL-запросе отдельно и выводить их в отдельных Memo или DataSet (в зависимости от модели). И тогда итоговую сумму легче занести.
  • NatalkaNatalka Украина, г.Киев
    отредактировано 00:48
    Nightmareterrible написал: »
    Думал, вы через Delphi делаете, поэтому написал конструкции для него.
    Для Fr3 единственный нормальный вариант - двойной проход с занесением в переменную.
    Создайте переменную MySum со значением 0

    Допустим, итоговая сумма у вас заносится в Memo123, тогда создаёте для него обработчик onAfterData
    procedure Memo123OnAfterData(Sender: TfrxComponent);
    begin
      Set('MySum', Memo123.Value); // Будет работать корректно, даже если стоит форматирование, например, %2.0n
    end;
    

    А более детально смогу подсказать, если пришлёте макет отчёта.
    Но честно говоря, я у себя в проекте отказался от двойного прохода. Это очень вредно, если страниц штук 120. Гораздо проще считать итоги в SQL-запросе отдельно и выводить их в отдельных Memo или DataSet (в зависимости от модели). И тогда итоговую сумму легче занести.
    Спасибо за помощь.
    Почему то методы Set / Get корректно работают только когда одна групповая сумма, а когда их больше 2, то выводит какие-то не те данные.
    И даже при такой конструкции данные в формате "9", а не "9,00"
    Возможно, проблема в том, что модуль FR4 в программе немного обрезан.
    Помогла вот такая конструкция для каждого итогового мемо
    [IIF( Engine.FinalPass = true, List[i-1], 0 )], где List названия списка. (для первого варианта из мануала)

    И спасибо за подсказку об отказе от двойных проходов, есть над чем работать в дальнейшем.

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

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