Агрегатные функции

 В большинстве случаев в групповых отчетах надо выводить некую итоговую информацию: сумма по группе, количество элементов группы и т.п. В 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)

 

 Назначение параметров аналогично вышеописанным.

 

 Существует общее для всех агрегатных функций правило: функция может быть подсчитана только для дата-бэнда и выведена только в бэнде-подвале (к последним относятся бэнды: подвал, подвал страницы, подвал группы, подвал колонки, подвал отчета).

 

 Как работают агрегатные функции? Рассмотрим это на примере нашего отчета с группами. Добавим в отчет новые элементы:

 

_img148

 

 Поле Group."ItemsTotal" на дата-бэнде будет отображать сумму текущего заказа. В подвал группы мы поместили объект "Текст", содержащий  вызов агрегатной суммы. Он будет отображать сумму всех заказов по данному клиенту. Запустив отчет на выполнение, и вооружившись калькулятором, мы убедимся, что все работает:

 

_img149

 

 Итак, каков принцип работы агрегатных функций? Перед построением отчета FastReport сканирует содержимое объектов "Текст" с целью нахождения агрегатных функций. Найденные функции привязываются к соответствующим дата-бэндам (в нашем примере функция SUM привязывается к бэнду MasterData1). При построении отчета, когда дата-бэнд выводится на экран, подсчитывается значение связанных с ним агрегатных функций. В нашем случае накапливается сумма значений поля Group."ItemsTotal". После вывода подвала группы, в котором отображается накопленное значение агрегатной функции, значение функции сбрасывается и цикл повторяется для следующих групп.

 

 Здесь можно пояснить назначение параметра flags в агрегатных функциях. В некоторых отчетах часть дата-бэндов (или все) могут быть скрыты, однако нам все равно может понадобиться посчитать значение агрегатной функции с учетом всех дата-бэндов. Так, в нашем примере можно отключить свойство Visible у дата-бэнда, после этого он перестанет выводиться на экран. Чтобы подсчитать сумму по скрытым дата-бэндам, добавим третий параметр в вызов функции:

 

[SUM(<Group."ItemsTotal">,MasterData1,1)]

 

 Это даст нам отчет следующего вида:

 

_img150

 

 Значение параметра flags = 2 позволяет не сбрасывать накопленное значение функции после ее вывода. Это позволяет печатать так называемые нарастающие итоги. Модифицируем вызов функции:

 

[SUM(<Group."ItemsTotal">,MasterData1,3)]

 

 Значение 3 – это битовая комбинация 1 и 2, что означает, что нам надо учитывать невидимые бэнды и не сбрасывать сумму. В итоге получится следующее:

 

_img151