Обратите внимание |
Сценарии могут представлять угрозу безопасности. Поэтому в режиме вычисления как Интерпретация (Interpretation) они выключены. Если вы уверены, в безопасности сценариев, можно использовать их в режиме вычисления Компиляция (Compilation).
|
В этой главе будут рассмотрены такие вопросы как:
Редактор итогов текстового компонента;
Тип результата итоговой функции;
Рассчет итогов в коде событий;
Рассчет итогов с условием;
Итоги и автоматическое изменение размеров компонента;
Итоги по выключенным бэндам Данные;
Рассчет итогов в Master-Detail отчетах.
Для того чтобы рассчитать и отобразить итог, следует разместить текстовый компонент в отчете, вызвать редактор и перейти на вкладку Итог (Summary):
Поле выражения. В этом поле указывается выражение расчета итогов. Выражение можно указать вручную, либо оно будет сформировано автоматически, взависимости от других параметров.
Поле Итоговая функция. В данном поле выбирается функция расчета итогов.
В данном поле определяется бэнд Данные, по которому будет расчитан итог.
В данном поле определяется колонка данных, значения которой будут использоваться для рассчета итога.
При помощи переключателей, устанавливается объект рассчета итогов:
Отчет, т.е. итог будет рассчитан по всему отчету.
Колонка, т.е. итог будет рассчитан по каждой колонке в отчете.
Страница, т.е. итог будет рассчитан по каждой странице построенного отчета.
Параметр рассчета нарастающего итога. Если флажок установлен, то итог будет рассчитан как нарастающий. Если же флажок снят, то рассчет итогов будет только по объекту (отчет, колонка, страница).
Параметр Условие. Если флажок установлен, то при рассчете итогов будет учитываться условие. Если же флажок снят, то рассчет итогов будет без учета условия.
Поле, в котором указывается выражение условия.
Тип результата итоговой функции
По умолчанию, функции для рассчета итогов, возвращают значение типа Decimal (за исключением функций Count и CountDistinct). Однако, также можно производить расчеты с использованием и других двух типов данных - Double и Int64. Для того чтобы функция возвращала результат расчета, используя тип данных Double, добавьте латинскую букву D в верхнем регистре к названию функции. Для расчетов с использованием типа Int64 необходимо добавить латинскую букву I в верхнем регистре. Такое разделение позволят избежать потерь при расчетах итогов.
Функция |
Тип возвращаемого значения |
Sum() |
Decimal |
SumD() |
Double |
SumI() |
Int64 |
Информация |
Буквы I, D можно добавлять к любым функциям за исключением двух: Count и CountDistinct. Эти функции всегда возвращают тип Int64.
|
Немного о синтаксесе функций на примере Sum и Count
При использовании языка программирования C#, все функции следует писать строго с соблюдением регистра.
Sum(expression) - рассчет суммы по автоматически определяемому объекту.
Sum(band, expression) - рассчет суммы по определенному объекту.
SumIf(band, expression, condition) - рассчет суммы по объекту с условием
expression – выражение для расчета;
band – название бэнда для выполнения расчета;
condition – условие включения выражения в расчет.
В случае с расчетами по Странице или контейнеру, синтаксис тот же за исключением добавления латинской буквы c как прекфика к имени функции:
cSum(expression) - рассчет суммы по странице или контейнеру;
cSum(band, expression) - рассчет суммы по странице или контейнеру и объекту на ней;
cSumIf(band, expression, condition) - рассчет суммы по странице или контейнеру и объекту на ней, по определенному условию.
Для расчета итогов по колонке, к имени функции добавляется префикс col:
colSum(expression) - рассчет суммы по колонке;
colSum(band, expression) - рассчет суммы по колонке и объекту в ней;
colSumIf(band, expression, condition) - рассчет суммы по колонке и объекту в ней, по определенному условию.
Функция Count отличается от остальных функций тем, что она не имеет выражения для расчета. Синтаксис для этой функции приведен ниже.
Count() - рассчитает количество строк;
CountIf(condition) - рассчитает количество строк по условию;
Count(band) - рассчитает количество строк по объекту;
CountIf(band, condition) - рассчитает количество строк по объекту и условию;
cCount() - рассчитает количество строк по странице или контейнеру;
cCount (band) - рассчитает количество строк по странице (контейнеру) и объекту на ней;
cCountIf(band, condition) - рассчитает количество строк по странице (контейнеру) и объекту на ней, по определенному условию;
colCount() - рассчитает количество строк по колонке;
colCount (band) - рассчитает количество строк по колонке и определенному объекту в этой колонке;
colCountIf(band, condition) - рассчитает количество строк по колонке и определенному объекту в этой колонке, по определенному условию.
Обычно компоненты, в текстовом выражении которых указан вызов функции, располагаются на итоговых бэндах или на бэнде Данные (Data). В Stimulsoft Reports есть несколько видов итоговых бэндов:
ReportSummaryBand - бэнд используется для вывода итогов по всему отчету;
PageFooterBand - бэнд используется для вывода итогов по странице;
FooterBand - бэнд используется для вывода итогов по списку;
GroupFooterBand - бэнд используется для вывода итогов по группе.
ColumnFooterBand - бэнд используется для вывода итогов по колонке.
Расположение компонентов с функциями на любом из указанных выше бэндов позволяет генератору отчетов точно определить, к какому бэнду Данные относится эта функция. Также компонент с функций можно разместить и на самом бэнде Data. В этом случае на каждой строке данных будет выведен результат расчета функции по всем строкам.
Если же требуется вывести итог, например, на бэнде Заголовок данных (Header), то это выполняется при помощи скрипта. Однако в Stimulsoft Reports компонент с функцией может быть расположен на любом бэнде отчета.
Также допускается размещение компонента с функцией на странице и на других страницах шаблона отчета. К примеру, можно рассчитывать сумму значений по списку и вывести его в заголовке списка. Еще один пример, рассчитать количество строк в списке и вывести это значение в начале страницы. При этом, есть ограничение: необходимо указать бэнд Данные, по которому будет рассчитываться результат:
{Sum(DataBand1, Products. UnitsInStock)}. В этом случае, будет рассчитана сумма значений колонки Products.UnitsInStock для каждой строки бэнда DataBand1.
{Count(DataBand1)}. В этом случае будет, рассчитано количество строк бэнда DataBand1.
Информация |
Компоненты с функциями можно размещать в любом месте отчета.
|
Для расчета итогов, в выражении можно не указывать дополнительные аргументы. Например, для функции Count необязательно или можно задать для функции Sum только один аргумент - выражение, которое должно быть рассчитано. Все это возможно, если генератор отчетов может определить, к какому бэнду Data относятся эти функции.
В противном случае, в аргументах следует указать источник данных или бэнд Данные, по которому необходимо рассчитать итог. В выражениях может быть указано:
Просто объект, значения которого будут рассчитываться - {Sum(DataSource.Column)}
Объект и различные математические операции с ним - {100 + Sum(DataSource.Column) * 2}
Информация |
Генератор отчетов может определить взаимосвязь функции и конкретного бэнда Данные, если компонент с этой функцией располагается на связанных бэндах с этим бэндом Данные. Иначе говоря, компонент с функцией расположен на бэндах заголовков и итогов, которые относятся к этому бэнду Данные.
|
Для того чтобы рассчитать итог по странице или панели следует к добавить латинскую букву c в нижнем регистре, как префикс к названию функции:
{cCount(DataBand1)} - генератор отчетов рассчитает количество строк на одной странице или панели.
При расчете итогов по панели или по странице, желательно указывать бэнд Data, по которому производится расчет агрегатной функции. Это необходимо, потому что на одной странице может находиться более одного бэнда Data. На одной странице или панели может использоваться любое количество агрегатных функций. Stimulsoft Reports не налагает никаких ограничений на это. Допускается комбинирование итогов по странице с условием. К примеру:
{сCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор рассчитает количество элементов на этой странице равных нулю.
Информация |
Расчет итогов по странице идет по такому же принципу, как и для панели.
|
Для того чтобы рассчитать итог по колонке необходимо добавить префикс col (от слова column) в нижнем регистре к названию функции. К примеру:
{colCount()} - генератор отчетов рассчитает количество строк по каждой колонке.
При расчете итогов по колонке желательно, текстовый компонент с функцией размещать на бэндах ColumnHeader, ColumnFooter, Header или Footer. Можно рассчитывать неограниченное количество итогов по колонке. Каких-либо ограничений не накладывается. Также допускается комбинирование итогов по колонке с условием:
{colCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор отчетов рассчитает количество строк в каждой колонке, где условие выполниться.
Информация |
Расчет итогов по колонке в Stimulsoft Reports имеет одно ограничение. Итоги можно рассчитывать только по колонкам на странице. Рассчитывать итоги по колонкам на бэнде Data не допускается.
|
При помощи Stimulsoft Reports можно произвести расчет функций в коде событий отчета. Это предоставляет возможность вычислять более сложные функции. Также при этом, можно обращаться к рассчитываемому значению из кода в процессе рассчет и влиять на этот процесс. Для того чтобы произвести такой расчет необходимо создать переменную в словаре данных, которая будет хранить значение функции.
При создании переменной указывается тип данных переменной, к примеру, Decimal, и первоначальное значение, к примеру, 0. Затем следует, у бэнда Данные в событии Rendering указать выражение для приращения переменной. К примеру, если необходимо посчитать сумму значений по полю Products.UnitPrice, то выражение будет следующего вида:
Variable += Products.ItemsInStock;
Для того, чтобы отобразить результат рассчета, следует в шаблоне отчета разместить текстовый компонент с выражением:
{Variable}
Также, необходимо у текстового компонента с выражением {Variable}, установить свойство Process At в значение End of Report. Это необходимо, чтобы генератор отчетов рассчитал значение переменной после обработки остальных компонентов.
Информация |
Не допускается использование переменных, объявленных в коде, для хранения результата расчета функций. Необходимо использовать переменные из словаря данных.
|
Иногда при рассчете итогов, необходимо считать определенные значения. В этом случае, задается условие в функции рассчета итогов. Например, необходимо просуммировать значения, которые больше нуля. Для добавления условия к функции рассчета итогов, следует к названию функции добавить суфикс If латинскими буквами, и дополнительный аргумент с условием:
{SumIf(Products.UnitsInStock, Products.UnitsInStock > 1)}. В этом случае, будет рассчитана сумма значений Products.UnitsInStock, которые больше 1.
{CountIf(Products.UnitsInStock == 0)}. В этом случае, будет рассчитано количество строк, с нулевым значением в колонке UnitsInStock
Информация |
Если необходимо произвести расчет с использованием типа Double или Int64, то сначала добавляем латинскую букву D или I, а затем слово If. К примеру: {SumDIf(Products.UnitsInStock, Products.UnitsInStock > 0)}.
|
Итоги и автоматическое изменение размеров компонента
При построении отчета, в тот момент, когда определяется размер компонента, результат расчета функции итога еще неизвестен. Это следует учитывать при установке автоматического изменения размеров для компонентов, в которых производиться рассчет итогов. В противном случае,
может возникнуть ситуация, когда размер компонента не будет корректным по отношению к результату рассчета функции итога.
Итоги по выключенным бэндам Данные
Бэнд Данные в отчете можно выключить различными способами. Например, он может быть выключенным по определенному условию или иметь нулевую высоту. По умолчанию, при построении отчета генератор отчетов не будет учитывать выключенные бэнды Данные и обрабатывать их. Однако, если необходимо по выключенному бэнду Данные произвести рассчет итогов, то следует, у этого бэнда свойство CalcInvisible установить в значение true. В этом случае, в отчете будут выводиться только включенные бэнды Data, а рассчет итогов выполниться с учетом выключенного бэнда Данные.
Рассчет итогов в Master-Detail отчетах
При расчете итогов в иерархических отчетах есть особенности вычисления результата. Рассмотрим пример на основе Master-Detail отчета. Предположим в отчете выводится список продуктов по категориям. Категории, в данном случае, это master записи, а продукты - detail:
Допустим, необходимо посчитать количество продуктов, которое выводится в отчете. Если добавить бэнд Итог данных с функцией Count() к бэнду со списком продуктов (detail записи), то по каждой категории (master записи) будет произведен рассчет итога:
Если же добавить бэнд Итог данных с функцией Count() к бэнду с категориями, то результатом будет количество master записей в отчете, т.е. число категорий. Однако, в Master-Detail отчете можно рассчитать итоги и сразу для всех detail записей. В этом случае, необходимо указать названия обоих (master и detail) бэндов в функции через двоеточие: Count(MasterBand: DetailBand).
Итогом функции Count(MasterBand:DetailBand) является число продуктов по всем категориям.