Одна из новых возможностей, которая появилась в FastReport VCL 6 – возможность выводить итоги группировки в заголовочных бэндах. Ранее вы могли выводить итоги только после группировки. Если группа достаточно большая, приходится прокручивать ее вниз, чтобы узнать итог. Гораздо удобнее выводить итог в заголовке группы.
Давайте рассмотрим особенности использования итогов в заголовочных бендах. В начале немного теории о том, как это работает.
Итоги в заголовках реализованы с помощью отложенной обработки. Во время вывода отчета, все объекты, имеющие нестандартные условия обработки помещаются в специальный список. Затем, по достижении определенного условия срабатывает обработка объекта.
Есть ряд условий, которые обязательно нужно соблюсти для успешного отображения итога в заголовочном бэнде:
Рассмотрим новое свойство объекта «Текст». Свойство Processing позволяет определить событие, по которому будет выведено значение в этом объекте. На самом деле Processing включает в себя 2 свойства – GroupLevel и ProcessAt. GroupLevel дает возможность установить уровень вложенности групп. Это сделано на случай, если вы используете несколько вложенных группировок. Таким образом вы можете в каждой группе выводить свои итоги в заголовке.
ProcessAt содержит список событий, по которым можно начать обработку поля. Вот возможные значения:
Например, вы выбрали формирование итога по завершении группы. Чтобы узнать, что группа закрылась, FR требуется подвал группы. Если выбрали событие завершения страницы, то необходим бэнд подвала страницы.
Теперь рассмотрим все вышеописанное на практике. Нам нужно создать отчет с двумя группами. Одна вложена в другую. Возьмем таблицу Sales из демонстрационной базы данных.
Как видно из шаблона, мы создали группу с именем компании. Затем добавили группу с номером заказа. И, наконец, в бэнде «Данные» вывели информацию из заказа. Каждая группа имеет подвал с итогом: [SUM(<Sales."Qty">*<Sales."List Price">, MasterData1)]. В подвале отчета также выводится итог, общий по всем группам.
Наша задача вывести итоги в заголовочных бэндах. Давайте начнем с первой группы. Добавим справа текстовое поле: Total group sum: [SUM(<Sales."Qty">*<Sales."List Price">, MasterData1)]$. В свойствах этого текстового поля находим Processing и задаем значение paGroupFinished:
Запустим отчет:
А теперь добавим два текстовых поля во вторую группу. Разместим их друг за другом справа. Для первого значение - [SUM(<Sales."Qty">*<Sales."List Price">, MasterData1)]$. Для второго - from [SUM(<Sales."Qty">*<Sales."List Price">, MasterData1)]$
Теперь для первого задаем свойства: GroupLevel – 0, ProcessAt – paGroupFinished.
Для второго задаем те же свойства: GroupLevel – 1, ProcessAt – paGroupFinished.
Тем самым вы выведем сначала итог для текущей группы, а затем для группы выше уровнем. Давайте посмотрим, как это выглядит:
Осталось вывести общий итог по всему отчету. Добавляем текстовое поле в заголовок отчета: Total sum: [SUM(<Sales."Qty">*<Sales."List Price">, MasterData1)]$. Для него устанавливаем свойства: GroupLevel – 0, ProcessAt – paReportPageFinished. Запустим отчет:
В каждом случае мы выводим поле с одинаковым агрегатным выражением, но получаем разные значения, для групп, заголовка отчета. Все дело во времени формирования итога. В определенный момент времени агрегатная функция имеет разные значения. Именно поэтому важно правильно задавать значение параметра ProcessAt.