Агрегатные функции
В большинстве случаев в групповых отчетах надо выводить некую итоговую информацию: сумма по группе, количество элементов группы и т.п. В FastReport для этих целей существуют так называемые агрегатные функции. С их помощью можно подсчитать функцию от определенного значения по диапазону данных. Ниже приведен список агрегатных функций:
Функция | Описание |
---|---|
SUM |
Возвращает сумму заданного выражения |
MIN |
Возвращает минимальное значение заданного выражения |
MAX |
Возвращает максимальное значение заданного выражения |
AVG |
Возвращает среднее значение заданного выражения |
COUNT |
Возвращает количество строк в диапазоне данных |
Синтаксис всех агрегатных функций (за исключением COUNT
) следующий (рассмотрим на примере ф-и SUM
):
SUM(expression, band, flags)
SUM(expression, band)
SUM(expression)
Назначение параметров следующее:
expression
– выражение, значение которого необходимо обработать
band
– имя дата-бэнда, по которому будет идти обработка
flags
– битовое поле, которое может содержать следующие значения и их комбинации:
1 – учитывать невидимые бэнды
2 – накапливать значение (не сбрасывать при очередном выводе)
Как видно, обязательным параметром является только expression
, остальные при вызове функции могут быть опущены. Тем не менее, рекомендуется всегда использовать параметр band
, это позволит избежать ошибок.
Функция COUNT
имеет следующий синтаксис:
COUNT(band, flags)
COUNT(band)
Назначение параметров аналогично вышеописанным.
Существует общее для всех агрегатных функций правило: функция может быть подсчитана только для дата-бэнда и выведена только в бэнде-подвале (к последним относятся бэнды: подвал, подвал страницы, подвал группы, подвал колонки, подвал отчета).
Как работают агрегатные функции? Рассмотрим это на примере нашего отчета с группами. Добавим в отчет новые элементы:
Поле Group."ItemsTotal" на дата-бэнде будет отображать сумму текущего заказа. В подвал группы мы поместили объект "Текст", содержащий вызов агрегатной суммы. Он будет отображать сумму всех заказов по данному клиенту. Запустив отчет на выполнение, и вооружившись калькулятором, мы убедимся, что все работает:
Итак, каков принцип работы агрегатных функций?
- Перед построением отчета FastReport сканирует содержимое объектов "Текст" с целью нахождения агрегатных функций. Найденные функции привязываются к соответствующим дата-бэндам (в нашем примере функция
SUM
привязывается к бэнду MasterData1). - При построении отчета, когда дата-бэнд выводится на экран, подсчитывается значение связанных с ним агрегатных функций. В нашем случае накапливается сумма значений поля
Group."ItemsTotal"
. - После вывода подвала группы, в котором отображается накопленное значение агрегатной функции, значение функции сбрасывается и цикл повторяется для следующих групп.
Здесь можно пояснить назначение параметра flags
в агрегатных функциях. В некоторых отчетах часть дата-бэндов (или все) могут быть скрыты, однако нам все равно может понадобиться посчитать значение агрегатной функции с учетом всех дата-бэндов. Так, в нашем примере можно отключить свойство Visible
у дата-бэнда, после этого он перестанет выводиться на экран. Чтобы подсчитать сумму по скрытым дата-бэндам, добавим третий параметр в вызов функции:
[SUM(<Group."ItemsTotal">,MasterData1,1)]
Это даст нам отчет следующего вида:
Значение параметра flags
= 2 позволяет не сбрасывать накопленное значение функции после ее вывода. Это позволяет печатать так называемые нарастающие итоги. Модифицируем вызов функции:
[SUM(<Group."ItemsTotal">,MasterData1,3)]
Значение 3 – это битовая комбинация 1 и 2, что означает, что нам надо учитывать невидимые бэнды и не сбрасывать сумму. В итоге получится следующее: