Использование двойного прохода DoublePass в отчетах

Нередко в отчетах необходимо отобразить поле с суммой некоторых значений - с такой задачей сталкивается каждый из нас. Чаще всего такие поля отображаются в самом конце отчета (как результат отчета, вывод, итоговое значение).
Так вот, если отчет состоит из 10 страниц, то именно эту сумму было бы удобно располагать не в конце отчета, а в самом начале, чтобы сразу увидеть результаты работы отчета.

И тут возникают проблемы: переносим это поле в начало отчета - но оно остается пустым. И это логично, ведь оно является результирующим, обязательным условием его заполнения является заполненность всех остальных полей отчета. Но как может заполниться поле в начале отчета, если оно является результирующим всех остальных последующих записей?

Для решения подобной задачи могу предложить использовать свойство DoublePass отчета (двойной проход). Поясню что это: у отчета есть Engine (компонент, который обеспечивает работу отчета FastReport). У этого Engine есть два свойства FinalPass и DoublePass. По умолчанию стоит FinalPass, то есть отчет заполняется данными в течение одного прохода по этому отчету. В случае, если использовать свойство DoublePass - в отчете будет два прохода: то есть в первом проходе заполнятся поля данными из датасетов, а во втором проходе заполнятся и рассчитаются остальные поля (предыдущие заполненные поля обновятся автоматически и останутся такими же).
Какие действия необходимо выполнить:
1. Создаем поле в начале отчета, в которое и требуется выводить итоговое значение (добавляем компонент Memo). Предыдущее поле с суммой в конце отчета не удаляем.
2. В свойстве отчета активируем опцию DoublePass:

3. Далее создаем обработчик события AfterPrint предыдущего поля итогового значения. В обработчике этого события присваиваем значение для нового поля. К примеру, предыдущее поле имеет название Memo1, новое поле Memo2. Тогда имеем:
Memo1.Text := Memo2.Text;
4. Сохраняем изменения.
Получается, то в результате первого прохода отчета заполнятся все поля этого отчета за исключением поля Memo2, а во время второго прохода - и само поле Memo2 полученным значением из уже заполненного поля Memo1 (оно в свою очередь заполнилось во время первого прохода).

Также в прикрепленном файле высылаю небольшой пример отчета FastReport, в котором реализована задача вывода данных вышеописанным методом.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

0 комментариев
Показать все комментарии