Сегодня мы усложним наш отчет, добавив детализацию основного списка дополнительными данными (Master-Detail).

В качестве дополнительных данных выберем информацию по счетам клиентов и об остатках на этих счетах.

Информация о счетах хранится в таблице ACC, остаток по счету получаем функцией UTIL_DM2.ACC_OSTT. На закладке <Данные> создаем новый запрос ora - ODACQuery2 и формируем текст запроса (Рис. 1.). Обратите внимание, что в запросе мы отбираем помимо данных, которые будем выводить в текст отчета (№ счета, валюта, сумма остатка), еще и служебное поле iACCcus, в котором хранится ID клиента.

Рис. 1.

 

 

Теперь нам необходимо связать наши 2 запроса – основной (список клиентов, ODACQuery1) и подчиненный (данные по счетам клиента, ODACQuery2). Для этого мы зададим в свойствах ODACQuery2 свойство Master равным ODACQuery1 (основной запрос) и нажмем на кнопку «…» в свойстве MasterFields. Дизайнер отчета предложит нам окно редактора Master-Detail, в котором мы зададим по каким полям наши запросы будут связаны. (Рис. 2 и Рис. 3.)

Рис. 2.

 

Рис. 3.

 

Запрос для детализации создан, связь с основным запросом задана – теперь пришло время оформить вывод данных детализации в печатную форму.

Для этого мы добавляем на страницу (Page1) новый бэнд – Данные 2 уровня, источником данных указываем наш новый запрос – ODACQuery2. (Рис. 4.)

Рис. 4.

 

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

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

Рис. 5.

 

Сделаем наш отчет более универсальным, ведь не каждый раз требуется детализация, иногда достаточно и данных основной таблицы. Чтобы дать пользователю возможность выбора – детализировать список или нет, добавим элемент управления CheckBox на наше диалоговое окно (Рис. 6.)

Рис. 6.

 

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

DetailData1.Visible := CheckBox1.Checked;

Вот такой развернутый отчет у нас получился в результате (Рис. 7.)

Рис. 7.

 

И напоследок – еще одна хитрость. Если мы не хотим видеть счета с нулевым остатком, можно исправить условие запроса ODACQuery2, добавив условие ненулевого остатка. Но также можно это сделать и штатными средствами FastReport, добавив условие фильтрации на бэнд DetailData1 (Рис. 8.)

Рис. 8.

 

В нашем случае условие выглядит следующим образом:

<ODACQuery2."UTIL_DM2.ACC_OSTT(0,CACCACC,CACCCUR,SYSDATE)"> > 0

При заданном условии ненулевых остатков на выходе получаем отчет следующего вида (Рис. 9.)

Рис. 9.

 

Кроме того, если бы нас интересовали только клиенты, у которых есть счета с ненулевыми остатками – можно в дополнение к фильтру на детализирующий бэнд задать свойство PrintIfDetailEmpty основного бэнда (MasterData1) равным false. И тогда у нас получится вот такой отчет (Рис. 10)

Рис. 10

 

В нашей следующей статье мы рассмотрим создание интерактивного отчета.
Перейти к уроку №5.

Узнать дополнительную информацию о функционале генератора отчетов FastReport, а так же задать интересующие вас вопросы, Вы всегда можете, обратившись в службу технической поддержки компании Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.