|
<< Click to Display Table of Contents >> Navigation: Создание отчетов > Источники данных, переменные и функции > Функции и расчет итогов > Итоги > Итоги, связанные с секциями |
Для того чтобы рассчитать и отобразить итог, следует разместить текстовый компонент в отчете, вызвать редактор и перейти на вкладку Функция значений:

Номер |
Свойство |
Описание |
1 |
Поле выражения |
В этом поле указывается выражение расчета итогов. Выражение можно указать вручную, либо оно будет сформировано автоматически, в зависимости от других параметров |
2 |
Функция |
В данном поле выбирается функция расчета итогов |
3 |
Данные |
В данном поле определяется секция Данные, по которому будет расчитан итог |
4 |
Колонка |
В данном поле определяется колонка данных, значения которой будут использоваться для рассчета итога |
5 |
Диапазон расчета |
При помощи выпадающего списка, устанавливается объект рассчета итогов: •Отчет - итог будет рассчитан по всему отчету; •Колонка - итог будет рассчитан по каждой колонке в отчете; •Страница - итог будет рассчитан по каждой странице построенного отчета |
6 |
Условие |
Если флажок установлен, то при расчете итогов будет учитываться условие, которое указано в поле расположенном рядом с флагом. Если же флажок снят, то рассчет итогов будет без учета условия |
7 |
Нарастающий итог |
Параметр расчета нарастающего итога. Если флажок установлен, то итог будет рассчитан как нарастающий. Если же флажок снят, то расчет итогов будет только по объекту (отчет, колонка, страница) |
Тип результата итоговой функции
По умолчанию функции для расчета итогов возвращают значение типа Decimal (за исключением функций Count и CountDistinct). Однако, также можно производить расчеты с использованием и других двух типов данных - Double и Int64. Для того чтобы функция возвращала результат расчета, используя тип данных Double, добавьте латинскую букву D в верхнем регистре к названию функции. Для расчетов с использованием типа Int64 необходимо добавить латинскую букву I в верхнем регистре. Такое разделение позволит избежать потерь при расчетах итогов.
Важно! Буквы I, D можно добавлять к любым функциям за исключением двух: Count и CountDistinct. Эти функции всегда возвращают тип Int64. |
Немного о синтаксисе функций на примере Sum и Count
При использовании языка программирования C#, все функции следует писать строго с соблюдением регистра. •Sum(expression) - расчет суммы по автоматически определяемому объекту; •Sum(band, expression) - расчет суммы по определенному объекту; •SumIf(band, expression, condition) - расчет суммы по объекту с условием. В аргументах функций указываются: •expression – выражение для расчета; •band – название секции для выполнения расчета; •condition – условие включения выражения в расчет. В случае с расчетами по cтранице или контейнеру, синтаксис тот же, за исключением добавления латинской буквы 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) - рассчитает количество строк по колонке и определенному объекту в этой колонке, по определенному условию. |
Обычно компоненты, в текстовом выражении которых указан вызов функции, располагаются на итоговых секциях или на секции Данные. В редакторе отчетов есть несколько видов итоговых секций: •ReportSummaryBand - секция используется для вывода итогов по всему отчету; •PageFooterBand - секция используется для вывода итогов по странице; •FooterBand - секция используется для вывода итогов по списку; •GroupFooterBand - секция используется для вывода итогов по группе. •ColumnFooterBand - секция используется для вывода итогов по колонке. Расположение компонентов с функциями на любой из указанных выше секций позволяет генератору отчетов точно определить, к какой секции Данные относится эта функция. Также компонент с функций можно разместить и на самой секции Data. В этом случае на каждой строке данных будет выведен результат расчета функции по всем строкам. Если же требуется вывести итог, например, на секции Заголовок данных, то это выполняется при помощи скрипта. Однако в редактор отчетов компонент с функцией может быть расположен на любой секции отчета. Важно! Компоненты с функциями можно размещать в любом месте отчета. Также допускается размещение компонента с функцией на странице и на других страницах шаблона отчета. К примеру, можно рассчитывать сумму значений по списку и вывести его в заголовке списка. Еще один пример, рассчитать количество строк в списке и вывести это значение в начале страницы. При этом, есть ограничение: необходимо указать секцию Данные, по которой будет рассчитываться результат: •{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. На одной странице или панели может использоваться любое количество агрегатных функций. Допускается комбинирование итогов по странице с условием. К примеру •{сCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор рассчитает количество элементов на этой странице равных нулю. |
Для того чтобы рассчитать итог по колонке, необходимо добавить префикс col (от слова column) в нижнем регистре к названию функции. К примеру: •{colCount()} - генератор отчетов рассчитает количество строк по каждой колонке. Важно! Расчет итогов по колонке в MasterReport имеет одно ограничение. Итоги можно рассчитывать только по колонкам на странице. Рассчитывать итоги по колонкам на бэнде Data не допускается. При расчете итогов по колонке желательно размещать текстовый компонент с функцией на секциях ColumnHeader, ColumnFooter, Header или Footer. Можно рассчитывать неограниченное количество итогов по колонке. Также допускается комбинирование итогов по колонке с условием: •{colCountIf(DataBand1, Products.UnitsInStock = 0)} - генератор отчетов рассчитает количество строк в каждой колонке, где условие выполниться. |
Есть возможность произвести расчет функций в коде событий отчета. Это предоставляет возможность вычислять более сложные функции. Также можно обращаться к рассчитываемому значению из кода в процессе расчета и влиять на этот процесс. Для того чтобы произвести такой расчет, необходимо создать переменную в словаре данных, которая будет хранить значение функции. Важно! Не допускается использование переменных, объявленных в коде, для хранения результата расчета функций. Необходимо использовать переменные из словаря данных. При создании переменной указывается тип данных переменной, к примеру, 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)}. |
Итоги и автоматическое изменение размеров компонента
При построении отчета в тот момент, когда определяется размер компонента, результат расчета функции итога еще неизвестен. Это следует учитывать при установке автоматического изменения размеров для компонентов, в которых производиться расчет итогов. В противном случае, может возникнуть ситуация, когда размер компонента не будет корректным по отношению к результату расчета функции итога. |
Итоги по выключенным секциям Данные
Секцию Данные в отчете можно выключить различными способами. Например, он может быть выключенным по определенному условию или иметь нулевую высоту. По умолчанию при построении отчета генератор отчетов не будет учитывать выключенные секции Данные и обрабатывать их. Однако, если необходимо по выключенной секции Данные произвести расчет итогов, то следует, у этой секции свойство Вычислять невидимые установить в значение true. В этом случае, в отчете будут выводиться только включенные секции Data, а расчет итогов выполнится с учетом выключенной секции Данные. |
Рассчет итогов в Master-Detail отчетах
При расчете итогов в иерархических отчетах есть особенности вычисления результата. Рассмотрим пример на основе Master-Detail отчета. Предположим в отчете выводится список продуктов по категориям. Категории, в данном случае, это master записи, а продукты - detail:
Допустим, необходимо посчитать количество продуктов, которое выводится в отчете. Если добавить секцию Итог данных с функцией Count() к секции со списком продуктов (detail записи), то по каждой категории (master записи) будет произведен расчет итога:
Если же добавить секцию Итог данных с функцией Count() к секции с категориями, то результатом будет количество master записей в отчете, т.е. число категорий. Однако, в Master-Detail отчете можно рассчитать итоги и сразу для всех detail записей. В этом случае, необходимо указать названия обоих (master и detail) секций в функции через двоеточие: Count(MasterBand: DetailBand).
Итогом функции Count(MasterBand:DetailBand) является число продуктов по всем категориям. |