Матричные отчеты пользуются большой популярностью. Как правило, матрицы, или по-другому сводные таблицы, используются в бухгалтерской и статистической отчетности. Давайте определимся, что же такое сводная таблица.
Сводная таблица - это программный инструмент, который позволяет вам реорганизовывать и суммировать выбранные столбцы и строки данных в таблице для получения требуемого отчета. Сводная таблица особенно полезна при большом количестве данных.
К примеру, вы ведете небольшой бизнес – магазин канцелярских товаров. Вы бы хотели знать какие товары продаются лучше всего, или какие лидеры продаж в этом месяце. Имея множество статистических данных довольно трудоемко их анализировать. Тут на выручку приходит сводная таблица, которая объединяет данные за определенный период в одной таблице.
Основной операцией при обработке данных для создания сводной таблицы является суммирование. Но, иногда, вам может потребоваться собственная функция для расчета некоторых колонок, итогов. Давайте рассмотрим на примере, как добавить вычисляемое поле в матрицу с помощью скрипта отчета. Создадим отчет и добавляем объект матрица на бэнд «Данные». Как вы помните, чтобы создать колонку, стоку или ячейку, нужно «перетащить» на соответствующую область выражение. Выражением может быть: поле данных, функция, переменная, итог. В общем любой объект из панели данных. Если вы собираетесь заполнять матрицу из скрипта отчета, то добавьте любое выражение в матрицу, а затем откройте его на редактирование и отчистите, или введите цифру. Получился вот такой шаблон матрицы:
Чтобы добавить поля в матрицу программно, нужно создать обработчик события AfterData для матрицы.
Переходим к скрипту отчета. В созданном обработчике добавляем колонки в матрицу:
1 2 3 4 5 6 7 8 9 |
Matrix1.AddValue(new Object[] { "Начисления", "Зарплата" }, new Object[] { "1" }, new Object[] { 1000}); Matrix1.AddValue(new Object[] { "Начисления", "Премия" }, new Object[] { "1" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "Начисления", "Штраф" }, new Object[] { "1" }, new Object[] { 200}); Matrix1.AddValue(new Object[] { "Начисления", "Итого" }, new Object[] { "1" }, new Object[] { 0}); Matrix1.AddValue(new Object[] { "Начисления", "Зарплата" }, new Object[] { "2" }, new Object[] { 500}); Matrix1.AddValue(new Object[] { "Начисления", "Премия" }, new Object[] { "2" }, new Object[] { 300}); Matrix1.AddValue(new Object[] { "Начисления", "Штраф" }, new Object[] { "2" }, new Object[] { 250}); Matrix1.AddValue(new Object[] { "Начисления", "Итого" }, new Object[] { "2" }, new Object[] { 0}); |
Обратите внимание, что структура заголовков колонок задается перечислением названий - "Начисления", "Зарплата". В нашем случае общий заголовок «Начисления» имеет 4 подзаголовка (). Затем, мы создаем строку с заголовком 1. Третий параметр – значение ячейки данных new Object[] { 1000 }.
Мы добавили две строки данных. Поле Итог имеет нулевое значение. Теперь нам нужно задать ему значение. Проходим по всем строкам матрицы в цикле и задаем значение для итога:
1 2 3 4 5 6 |
int[] rowIndices = Matrix1.Data.Rows.GetTerminalIndices(); for (int i = 0; i < rowIndices.Length; i++) { rowIndex = rowIndices[i]; SetValue("Начисления;Итого", GetValue("Начисления;Зарплата") + GetValue("Начисления;Премия") - GetValue("Начисления;Штраф")); } |
Add the rowindex variable to the class:
private int rowIndex;
Note the SetValue and GetValue methods. Add them to the class:
1 2 3 4 5 6 7 8 9 10 11 |
private void SetValue(string complexValue, float value) { int columnIndex = Matrix1.Data.Columns.Find(complexValue.Split(';')); Matrix1.Data.SetValue(columnIndex, rowIndex, value); } private float GetValue(string complexValue) { int columnIndex = Matrix1.Data.Columns.Find(complexValue.Split(';')); return new Variant(Matrix1.Data.GetValue(columnIndex, rowIndex, 0)); } |
From the headings it is clear that one method is to get the value of a cell, and the second is to change.
Run the report:
So we calculated the total for each row of data.