Fast Report. Вертикальные бэнды

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

Такие отчеты не редкость, например, в управленческом учете, в планировании. В FastReport есть два средства, которые позволят решить эту задачу: вертикальные бэнды и cross-отчеты. Хотя cross-отчеты и являются универсальным инструментом для построения отчетов с бесконечной длиной и шириной, но их применение не всегда возможно из-за некоторых особенностей их работы. Поэтому в данной статье будут показаны примеры создания отчетов с помощью вертикальных бэндов.

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

С этим все просто, виды вертикальных бэндов можно увидеть в дизайнере:

  • “Заголовок данных” — позволяет создать шапку отчета табличного вида;
  • “Данные 1- 2- 3- уровня” — при построении отчета FastReport повторит бэнд столько раз, сколько записей находится в подключенной к нему таблице или запросу. При этом каждая запись запроса будет соответствовать новому столбцу отчета;
  • “Заголовок и подвал группы” — позволяют строить вертикальные группы;
  • “Подвал данных” — например, позволяет в конце отчета посчитать сумму вертикального бэнда, в том числе с использованием агрегатных функций.

Как видно из описания, бэнды из раздела “вертикальные бэнды”, по сути, не отличаются от обычных горизонтальных, за исключением того, что выводят данные на страницу не сверху вниз, а слева направо.

Создание отчета должно начинаться с установки горизонтального бэнда MasterData. Затем непосредственно на страницу ReportPage устанавливаются вертикальные бэнды. Горизонтальный MasterData должен быть либо привязан к источнику данных, либо у него должно быть установлено свойство RowCount, которое позволяет вывести бэнд указанное количество раз. Если это не сделать, то вместо отчета будет пустая страница. Соответственно, вертикальный MasterData тоже должен быть привязан к источнику данных, для того чтобы наращивать столбцы отчета. Для того чтобы построить отчет с переменным количеством строк и столбцов необходимо горизонтальный и вертикальный MasterData привязать к разным источникам данных.

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

Переходим к примерам.

Пример №1

В дизайнере FastReport создадим новый отчет. Положим на него следующие горизонтальные бэнды: “заголовок отчета”, “заголовок данных” и “данные 1 уровня”. Также нам понадобятся вертикальные бэнды: “заголовок данных”, “данные 1 уровня”, “подвал данных”, которые кладем на страницу отчета. Вертикальные бэнды располагаем аналогично горизонтальным, т.е. “заголовок данных” помещаем перед “данными 1 уровня”, а после должен располагаться “подвал данных”.

Отчет имеет следующий вид:

Так как известно, что строка в отчете будет одна, то у бэнда MasterData1 установим свойство RowCount = 1. Бэнд MasterData2 привяжем к источнику данных, который содержит перечень видов оплат и их суммы за указанный год.

На пересечении горизонтального “заголовка данных” (Header1) с вертикальными бэндами (Header2, Footer1) разместим текстовые поля, которые сформируют постоянную часть шапки отчета. На пересечение MasterData1 и MasterData2 и на пересечении Header1 и MasterData2 поместим текстовые поля, которые будут отвечать за количество столбцов в отчете. Сколько записей содержит источник данных, столько раз и повторятся эти поля.

Для подсчета суммы вертикального бэнда по горизонтали можно пользоваться агрегатной функцией SUM. Поместим на пересечении горизонтального MasterData1 и вертикального “подвала данных” (Footer1) текстовое поле, в котором опишем функцию SUM().

В итоге получим отчет такого вида:

Пример №2

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

Нам понадобятся два запроса связанных через TDataSource:

  • idsFRReport — главный запрос, который содержит список дат оплат за месяц. Он будет отвечать за переменное количество строк;
  • idsDetailList — подчиненный запрос, который содержит виды и суммы оплат на заданную дату. Он будет отвечать за количество столбцов.

Отчет имеет следующий вид:

Горизонтальный MasterData1 привяжем к главному источнику данных frxMainDBDataset, а вертикальный MasterData2 – к подчиненному frxDetailList. Остальные действия аналогичны примеру №1. Вот что получилось:

Такой отчет выглядит непривычно для пользователей, так как количество столбцов имеет не фиксированное значение. Чтобы пользователи увидели привычную для них таблицу, необходимо сделать еще ряд действий.

Добавим еще один вертикальный MasterData3, который будет дорисовывать необходимое количество пустых ячеек. Установим у него свойство RowCount = 1. Этим свойством будем в дальнейшем управлять.

Отчет будет иметь следующий вид:

Отчет будет формироваться в два прохода. При первом проходе определим максимальное количество столбцов в отчете. Текущее количество будем вычислять, наращивая с помощью скрипта переменную VCur_column в обработчике метода OnBeforePrint вертикального MasterData2. Во втором проходе добавим недостающее число пустых столбцов:

 procedure MasterData2OnAfterPrint(Sender: TfrxComponent);
begin
if VCur_column > VMax_column then
VMax_column := VCur_column;
if Engine.FinalPass then
MasterData3.RowCount := VMax_column - VCur_column;
MasterData3.Visible:=MasterData3.RowCount>0;
end;

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

Как показывают эти примеры, вертикальные бэнды вполне позволяют просто и быстро строить отчеты, имеющие неизвестное количество столбцов. Немного сложней построить отчеты с переменным количеством столбцов и строк, но минимальное знание FastScript поможет преодолеть это.

Примеры, описанные в статье, можно посмотреть в архиве example.zip

Copyright© 2008 Ирина Цыбульникова Специально для Delphi Plus

Comments are closed.