[ELMA3] Матричные (сводные) отчеты в FastReport
Матричные (сводные) отчеты в FastReport
Объект Матрица является разновидностью таблицы и, как и объект Таблица, состоит из строк, колонок и ячеек. Причем заранее неизвестно, сколько строк и столбцов будет в матрице - это зависит от данных.
Объект выглядит следующим образом:
При печати матрица заполняется значениями и растет как вниз, так и вбок. Результат может выглядеть следующим образом:
В теории
Рассмотрим элементы матрицы:
На рисунке мы видим матрицу с двумя строками и четырьмя столбцами. Здесь a, b – заголовки строк, 1, 2, 3, 4 – заголовки столбцов, a1..a4, b1..b4 – ячейки. Чтобы построить такой отчет, понадобится всего один набор данных (запрос или таблица), который имеет три поля и содержит следующие данные:
a 1 a1
a 2 a2
a 3 a3
a 4 a4
b 1 b1
b 2 b2
b 3 b3
b 4 b4
Первое поле содержит номер строки, второе – номер столбца, третье – содержимое ячейки на пересечении строки и столбца с указанным номером. При построении отчета FastReport создает в памяти матрицу и заполняет ее данными. При этом матрица динамически расширяется, если строки или столбца с заданным номером еще не существует.
Заголовки могут иметь более одного уровня. Рассмотрим следующий пример:
В этом примере номер, или индекс, столбца – составной, т.е. состоит из двух значений. Этот отчет требует следующих данных:
a 10 1 a10.1
a 10 2 a10.2
a 20 1 a20.1
a 20 2 a20.2
b 10 1 b10.1
b 10 2 b10.2
b 20 1 b20.1
b 20 2 b20.2
Здесь первое поле, как и прежде, содержит индекс строки, второе и третье поля – индекс колонки. Последнее поле содержит значение ячейки.
Следующий элемент матрицы – промежуточные итоги и итоги, демонстрирует следующий рисунок:
Этот отчет строится на тех же данных, что и предыдущий. Столбцы, показанные серым на рисунке, вычисляются автоматически.
Настройка структуры
После того, как вы положили на лист отчета новый объект Матрица, он выглядит следующим образом:
Настройка структуры матрицы выполняется с помощью мыши. Для этого перетаскивайте поля источников данных из окна Данные на матрицу, чтобы создать строки, колонки и ячейки. Матрица подсвечивает место, куда будут вставлены новые данные, красной рамкой:
Если в матрице уже есть элементы (заголовки, ячейки), то при вставке нового элемента показывается индикатор. В данном случае новое поле будет вставлено между полями Year и Name:
Вы также можете изменить порядок существующих элементов. Для этого щелкните мышкой на элементе и перетащите его на новое место, взяв его за рамку:
Для удаления элемента выберите его мышкой и нажмите клавишу Delete.
Настройка заголовка
Для настройки элемента заголовка выделите его и нажмите правую кнопку мыши, чтобы показать контекстное меню:
По умолчанию данные в заголовке матрицы сортируются по возрастанию. Вы можете поменять порядок сортировки, выбрав пункт Сортировка в меню.
К каждому полю, которое вы помещаете в заголовок матрицы, FastReport добавляет итог (это ячейка с текстом Итого). Вы можете удалить итог, выделив его и нажав клавишу Delete. Чтобы включить итог снова, выделите элемент, к которому он относится, и в контекстном меню выберите пункт Итоги.
Пункт меню Формировать новую страницу позволяет добавить разрыв страницы при печати матрицы. Если включить разрыв у ячейки Year, как показано на рисунке выше, то при печати матрицы каждый год будет расположен на отдельной странице.
Пункт меню Подавлять итоги позволяет подавлять строку итогов в случае, если в группе, по которой считается итог, есть только одно значение.
Настройка ячеек
Для ячеек матрицы можно выбрать функцию, которая будет использована при расчете итогов. Ее значение будет выведено в строках и столбцах итогов. Ниже приведен список функций, которые можно использовать:
Функция |
Описание |
Нет |
Значения ячеек не обрабатываются. |
Сумма |
Возвращает сумму значений в ячейках матрицы. |
Минимум |
Возвращает минимальное из значений. |
Максимум |
Возвращает максимальное из значений. |
Среднее |
Возвращает среднее значение. |
Количество |
Возвращает количество непустых значений. |
Для ячеек, добавляемых в матрицу, по умолчанию используется функция суммирования. Вы можете выбрать другую функцию, выделив ячейку и выбрав в ее контекстном меню пункт Функция:
Выберите функцию Нет, если вы не собираетесь печатать итоги по данной ячейке.
В матрице может быть одна или несколько ячеек данных. Если ячеек несколько, они могут располагаться рядом или друг под другом. За это отвечает свойство матрицы Ячейки одной строкой, которое можно поменять из контекстного меню. Вы также можете выбрать порядок расположения ячеек при добавлении второй ячейки в матрицу. При этом ориентируйтесь на красные индикаторы, которые показывают, куда будет добавляться второе значение - вверх-вниз или вправо-влево:
После того как вы добавили второе значение, все последующие значения будут добавляться в выбранном направлении.
Управление размерами матрицы
Так как матрица является разновидностью объекта Таблица, она позволяет задавать размеры строк и колонок аналогичным образом.
По умолчанию у матрицы включен режим Авторазмер. В этом режиме объект сам подбирает ширину колонок и высоту строк в зависимости от содержащихся в них данных. Вы также можете управлять размером объекта вручную. Для этого выключите свойство Авторазмер у матрицы. У строк и колонок есть аналогичное свойство; его можно использовать, если авторазмер у матрицы отключен.
Чтобы ограничить минимальную и максимальную высоту строки, выберите строку и в окне Свойства укажите значения свойств MinHeight и MaxHeight.
Чтобы ограничить минимальную и максимальную ширину колонки, выберите колонку и в окне Свойства укажите значения свойств MinWidth и MaxWidth.
Создадим простой запрос:
select u.FullName, st.Name, s.Responsible, s.SaleStage, DATENAME(month, s.StartDate) as month, s.id, c.Name as ContractorName, s.PoverkaFakt, us.FullName as auth from Sale as s left join "User" u on u.id = s.Responsible left join "User" us on u.id = s.Author left join SaleStage st on st.id = s.SaleStage left join Contractor c on c.id = s.Contractor where s.SaleStage is not null
Вынесем данные на макет, выше описано какие инструменты использовать:
В результате получаем отчет, в котором данные выстраиваются следующим образом: перечисление вправо по месяцам и результирующие поля вниз по организациям. Отчет считает итоги по каждой организации по каждому месяцу и по всем месяцам, также считается общий итог по всем организациям и по каждому месяцу.