Как отобразить подотчет на основе условия в родительском

08.01.2020

Многие современные генераторы отчетов позволяют встраивать внутрь одного отчета другой, так называемый подотчет. Зачем это делать? Например, для удобства проектирования отчета. Если основной отчет и подотчет имеют разный тип, то проще создавать их раздельно.

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

Пользователь генератора отчетов ActiveReports как раз озадачился такой проблемой:

У меня есть отчет с двумя подотчетами. Я хочу запускать или не запускать каждый подотчет на основе условия. Это возможно?

Ответ технической поддержки:

Да, можно выбрать подотчеты из родительского отчета на основании некоторых условий. Например, вы можете использовать свойство Visible элемента управления SubReport в событии формата Detail для управления видимостью вложенных отчетов на основе переменной счетчика, увеличиваемой каждый раз, когда вызывается событие Detail.OnFormat.

В FastReport .NET подотчет создается просто на другой странице и имеет доступ к тем же данными, что и основной отчет. В основном отчете добавляется объект Subreport в том месте, где планируется разместить подотчет. Этот объект – ссылка на страницу отчета, которая тут же создастся. В рамках новой страницы отчета вы создаете желаемый шаблон.

Кстати, вы можете сначала создать отчет с несколькими страницами, а потом, при желании добавить объект subreport и выставить в его свойствах ссылку на нужную страницу.

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

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

 

Шаблон основного отчета достаточно прост:

Основная информация о заказе берется из таблицы Orders. Рядом с добавленными полями мы располагаем объект Subreport. В свойствах Subreport1 обязательно нужно выставить свойство PrintOnParent в true.

Когда мы добавили на страницу отчета объект Subreport автоматически добавилась новая страница отчета. На этой странице мы создаем шаблон подотчета, который будет выводить список продуктов. Так как таблица Orders имеет связь с Order Details, то подотчет будет выводить записи, соответствующие текущему заказу. Таблица Order Details также имеет связь с таблицей Products. И мы воспользуемся данными из этой связи: 

 

Поэтому ссылки на поля имеют такой вид: Order Details.Products.ProductName.

Теперь добавим еще один объект Subreport. Размещаем его поверх Subreport1. Для него также нужно выставить свойство PrintOnParent = true.

В шаблон второго подотчета мы добавляем поля из таблицы Customers, которая имеет связь с Orders.

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

Для бэнда Данные в основном отчете создадим обработчик события BeforePrint:

1
2
3
4
5
6
7
8
9
10
11
12
13
private void Data1_BeforePrint(object sender, EventArgs e)
 {
 if ((int)Report.GetParameterValue("Parameter") == 1)
 {
 Subreport1.Visible = false;
 Subreport2.Visible = true;
 }
 else
 {
 Subreport1.Visible = true;
 Subreport2.Visible = false;
 }
 }

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

В итоге, вариант со списком продуктов будет выглядеть так:

А вариант с информацией о клиенте так:

1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.
28 октября 2024

Как настроить WSL 2 для работы с FastReport и FastCube

В этой статье попробуем вместе разобраться, как настроить WSL 2 для работы с компонентами FastReport и FastCube в Lazarus для Linux.