Обратите внимание

 

Сценарии могут представлять угрозу безопасности. Поэтому в режиме вычисления как Интерпретация (Interpretation) они выключены. Если вы уверены, в безопасности сценариев, можно использовать их в режиме вычисления Компиляция (Compilation).

 

 

 

В этой главе будут рассмотрены такие вопросы как:

strel11 Редактор итогов текстового компонента;

strel11 Тип результата итоговой функции;

strel11 Пример синтаксиса функций;

strel11 Вывод итога в любом месте;

strel11 Выражения с функциями;

strel11 Рассчет итогов по странице;

strel11 Рассчет итогов по колонке;

strel11 Рассчет итогов в коде событий;

strel11 Рассчет итогов с условием;
strel11 Итоги и автоматическое изменение размеров компонента;

strel11 Итоги по выключенным бэндам Данные;
strel11 Рассчет итогов в Master-Detail отчетах.

 

 

Редактор

Для того чтобы рассчитать и отобразить итог, следует разместить текстовый компонент в отчете, вызвать редактор и перейти на вкладку Итог (Summary):
 

 
img1 Поле выражения. В этом поле указывается выражение расчета итогов. Выражение можно указать вручную, либо оно будет сформировано автоматически, взависимости от других параметров.

img_2 Поле Итоговая функция. В данном поле выбирается функция расчета итогов.

img_3 В данном поле определяется бэнд Данные, по которому будет расчитан итог.

img_4 В данном поле определяется колонка данных, значения которой будут использоваться для рассчета итога.

img_5 При помощи переключателей, устанавливается объект рассчета итогов:

strel11 Отчет, т.е. итог будет рассчитан по всему отчету.

strel11 Колонка, т.е. итог будет рассчитан по каждой колонке в отчете.

strel11 Страница, т.е. итог будет рассчитан по каждой странице построенного отчета.
 

img_6 Параметр рассчета нарастающего итога. Если флажок установлен, то итог будет рассчитан как нарастающий. Если же флажок снят, то рассчет итогов будет только по объекту (отчет, колонка, страница).

img_7 Параметр Условие. Если флажок установлен, то при рассчете итогов будет учитываться условие. Если же флажок снят, то рассчет итогов будет без учета условия.

img_8 Поле, в котором указывается выражение условия.

 

 

Тип результата итоговой функции

По умолчанию, функции для рассчета итогов, возвращают значение типа Decimal (за исключением функций Count и CountDistinct). Однако, также можно производить расчеты с использованием и других двух типов данных - Double и Int64. Для того чтобы функция возвращала результат расчета, используя тип данных Double, добавьте латинскую букву D в верхнем регистре к названию функции. Для расчетов с использованием типа Int64 необходимо добавить латинскую букву I в верхнем регистре. Такое разделение позволят избежать потерь при расчетах итогов.

 

Функция

Тип возвращаемого значения

Sum()

Decimal

SumD()

Double

SumI()

Int64

 

Информация

 

Буквы I, D можно добавлять к любым функциям за исключением двух: Count и CountDistinct. Эти функции всегда возвращают тип Int64.

 

 

 

Немного о синтаксесе функций на примере Sum и Count

При использовании языка программирования C#, все функции следует писать строго с соблюдением регистра.

 

strel11 Sum(expression) - рассчет суммы по автоматически определяемому объекту.

strel11 Sum(band, expression) - рассчет суммы по определенному объекту.

strel11 SumIf(band, expression, condition) - рассчет суммы по объекту с условием

 

strel11 expression – выражение для расчета;

strel11 band – название бэнда для выполнения расчета;

strel11 condition – условие включения выражения в расчет.

 

В случае с расчетами по Странице или контейнеру, синтаксис тот же за исключением добавления латинской буквы c как прекфика к имени функции:

 

strel11 cSum(expression) - рассчет суммы по странице или контейнеру;

strel11 cSum(band, expression) - рассчет суммы по странице или контейнеру и объекту на ней;

strel11 cSumIf(band, expression, condition) - рассчет суммы по странице или контейнеру и объекту на ней, по определенному условию.

 

Для расчета итогов по колонке, к имени функции добавляется префикс col:

 

strel11 colSum(expression) - рассчет суммы по колонке;

strel11 colSum(band, expression) - рассчет суммы по колонке и объекту в ней;

strel11 colSumIf(band, expression, condition) - рассчет суммы по колонке и объекту в ней, по определенному условию.

 

Функция Count отличается от остальных функций тем, что она не имеет выражения для расчета. Синтаксис для этой функции приведен ниже.

 

strel11 Count() - рассчитает количество строк;

strel11 CountIf(condition) - рассчитает количество строк по условию;

strel11 Count(band) - рассчитает количество строк по объекту;

strel11 CountIf(band, condition) - рассчитает количество строк по объекту и условию;

strel11 cCount() - рассчитает количество строк по странице или контейнеру;

strel11 cCount (band) - рассчитает количество строк по странице (контейнеру) и объекту на ней;

strel11 cCountIf(band, condition) - рассчитает количество строк по странице (контейнеру) и объекту на ней, по определенному условию;

strel11 colCount() - рассчитает количество строк по колонке;

strel11 colCount (band) - рассчитает количество строк по колонке и определенному объекту в этой колонке;

strel11 colCountIf(band, condition) - рассчитает количество строк по колонке и определенному объекту в этой колонке, по определенному условию.

 

 

Вывод итога в любом месте

Обычно компоненты, в текстовом выражении которых указан вызов функции, располагаются на итоговых бэндах или на бэнде Данные (Data). В Stimulsoft Reports есть несколько видов итоговых бэндов:

strel11 ReportSummaryBand - бэнд используется для вывода итогов по всему отчету;

strel11 PageFooterBand - бэнд используется для вывода итогов по странице;

strel11 FooterBand - бэнд используется для вывода итогов по списку;

strel11 GroupFooterBand - бэнд используется для вывода итогов по группе.

strel11 ColumnFooterBand - бэнд используется для вывода итогов по колонке.

 

Расположение компонентов с функциями на любом из указанных выше бэндов позволяет генератору отчетов точно определить, к какому бэнду Данные относится эта функция. Также компонент с функций можно разместить и на самом бэнде Data. В этом случае на каждой строке данных будет выведен результат расчета функции по всем строкам.

 

Если же требуется вывести итог, например, на бэнде Заголовок данных (Header), то это выполняется при помощи скрипта. Однако в Stimulsoft Reports компонент с функцией может быть расположен на любом бэнде отчета.

 

Также допускается размещение компонента с функцией на странице и на других страницах шаблона отчета. К примеру, можно рассчитывать сумму значений по списку и вывести его в заголовке списка. Еще один пример, рассчитать количество строк в списке и вывести это значение в начале страницы. При этом, есть ограничение: необходимо указать бэнд Данные, по которому будет рассчитываться результат:

 

strel11 {Sum(DataBand1, Products. UnitsInStock)}. В этом случае, будет рассчитана сумма значений колонки Products.UnitsInStock для каждой строки бэнда DataBand1.

strel11 {Count(DataBand1)}. В этом случае будет, рассчитано количество строк бэнда DataBand1.

 

Информация

 

Компоненты с функциями можно размещать в любом месте отчета.

 

 

 

Выражения с функциями

Для расчета итогов, в выражении можно не указывать дополнительные аргументы. Например, для функции Count необязательно или можно задать для функции Sum только один аргумент - выражение, которое должно быть рассчитано. Все это возможно, если генератор отчетов может определить, к какому бэнду Data относятся эти функции.

 

В противном случае, в аргументах следует указать источник данных или бэнд Данные, по которому необходимо рассчитать итог. В выражениях может быть указано:
strel11 Просто объект, значения которого будут рассчитываться - {Sum(DataSource.Column)}

strel11 Объект и различные математические операции с ним - {100 + Sum(DataSource.Column) * 2}

 

Информация

 

Генератор отчетов может определить взаимосвязь функции и конкретного бэнда Данные, если компонент с этой функцией располагается на связанных бэндах с этим бэндом Данные. Иначе говоря, компонент с функцией расположен на бэндах заголовков и итогов, которые относятся к этому бэнду Данные.

 

 

 

Рассчет итогов по странице

Для того чтобы рассчитать итог по странице или панели следует к добавить латинскую букву c в нижнем регистре, как префикс к названию функции:

 

strel11 {cCount(DataBand1)} - генератор отчетов рассчитает количество строк на одной странице или панели.

 

При расчете итогов по панели или по странице, желательно указывать бэнд Data, по которому производится расчет агрегатной функции. Это необходимо, потому что на одной странице может находиться более одного бэнда Data. На одной странице или панели может использоваться любое количество агрегатных функций. Stimulsoft Reports не налагает никаких ограничений на это. Допускается комбинирование итогов по странице с условием. К примеру:

 

strel11 {сCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор рассчитает количество элементов на этой странице равных нулю.

 

Информация

 

Расчет итогов по странице идет по такому же принципу, как и для панели.

 

 

 

Рассчет итогов по колонке

Для того чтобы рассчитать итог по колонке необходимо добавить префикс col (от слова column) в нижнем регистре к названию функции. К примеру:

 

strel11  {colCount()} - генератор отчетов рассчитает количество строк по каждой колонке.

 

При расчете итогов по колонке желательно, текстовый компонент с функцией размещать на бэндах ColumnHeader, ColumnFooter, Header или Footer. Можно рассчитывать неограниченное количество итогов по колонке. Каких-либо ограничений не накладывается. Также допускается комбинирование итогов по колонке с условием:

 

strel11 {colCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор отчетов рассчитает количество строк в каждой колонке,  где условие выполниться.

 

Информация

 

Расчет итогов по колонке в Stimulsoft Reports имеет одно ограничение. Итоги можно рассчитывать только по колонкам на странице. Рассчитывать итоги по колонкам на бэнде Data не допускается.

 

 

 

Рассчет итогов в коде событий

При помощи Stimulsoft Reports можно произвести расчет функций в коде событий отчета. Это предоставляет возможность вычислять более сложные функции. Также при этом, можно обращаться к рассчитываемому значению  из кода в процессе рассчет и влиять на этот процесс. Для того чтобы произвести такой расчет необходимо создать переменную в словаре данных, которая будет хранить значение функции.

 

При создании переменной указывается тип данных переменной, к примеру, Decimal, и первоначальное значение, к примеру, 0. Затем следует, у бэнда Данные в событии Rendering указать выражение для приращения переменной. К примеру, если необходимо посчитать сумму значений по полю Products.UnitPrice, то выражение будет следующего вида:

strel11 Variable += Products.ItemsInStock;

 

Для того, чтобы отобразить результат рассчета, следует в шаблоне отчета разместить текстовый компонент с выражением:

strel11 {Variable}

 

Также, необходимо у текстового компонента с выражением {Variable}, установить свойство Process At в значение End of Report. Это необходимо, чтобы генератор отчетов рассчитал значение переменной после обработки остальных компонентов.

 

Информация

 

Не допускается использование переменных, объявленных в коде, для хранения результата расчета функций. Необходимо использовать переменные из словаря данных.

 

 

 

Рассчет итогов с условием

Иногда при рассчете итогов, необходимо считать определенные значения. В этом случае, задается условие в функции рассчета итогов. Например, необходимо просуммировать значения, которые больше нуля. Для добавления условия к функции рассчета итогов, следует к названию функции добавить суфикс If латинскими буквами, и дополнительный аргумент с условием:

 

strel11 {SumIf(Products.UnitsInStock, Products.UnitsInStock > 1)}. В этом случае, будет рассчитана сумма значений Products.UnitsInStock, которые больше 1.

strel11 {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) является число продуктов по всем категориям.