Применение подчиненных отчетов

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

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

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

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

Примеры использования подчиненных отчетов можно найти в списке отчетов учебной базы данных "Борей" (Northwind). На рис. 10.1 представлен отчет "Продажи по типам" (Sales by Category), который содержит один подчиненный отчет и внедренную диаграмму.

Отчет, содержащий подчиненный отчет

Рис. 10.1. Отчет, содержащий подчиненный отчет

Откройте отчет "Продажи по типам" (Sales by Category) в режиме Конструктора. Вы увидите, что подчиненный отчет размещен в разделе заголовка группы "Категория" (CategoryName) (рис. 10.2). Оба отчета, и главный и подчиненный, базируются на одном и том же запросе "Продажи по типам" (Sales by Category), но в главном отчете выводятся данные о категориях — имя категории, а в подчиненном — о товарах, входящих в эту категорию (наименование товара и его цена).

Выделите элемент управления Подчиненная форма/отчет (Subform/siibreport) и посмотрите свойства этого элемента. Вы увидите, что главный и подчиненный отчеты связываются по полю "Категория" (CategoryName). Поскольку и в формах, и в отчетах используется один и тот же элемент управления Подчиненная форма/отчет, свойства для связанных полей те же, что и в форме (см. гл. 9).

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

Отчет "Продажи по типам" в режиме Конструктора

Рис. 10.2. Отчет "Продажи по типам" в режиме Конструктора

Отчет "Продажи по годам" (Sales by Year) является примером отчета, в котором подчиненный отчет используется для вывода итоговых данных о продажах по кварталам года (рис. 10.3).

Использование подчиненного отчета для вывода итогов

Рис. 10.3. Использование подчиненного отчета для вывода итогов

Оба отчета, основной и подчиненный, базируются на запросе "Продажи по годам" (Sales by Year), который позволяет выбрать все заказы за указанный период времени (проверяется поле "ДатаИсполнения" (ShippedDate). Запрос включает вычисляемое поле "Год" (Year), которое рассчитывается на основе даты заказа и используется при группировке в отчете, и поле, содержащее итоговую сумму каждого заказа "ПромежуточнаяСумма" (Subtotal).

Подчиненный отчет "Подчиненный для продаж по годам" (Sales by Year Subreport) содержит несколько вычисляемых элементов:

Группировка записей выполняется по году и по кварталу. Обратите внимание, что раздел Область данных (Detail) отчета пуст, т. е. в отчет выводятся только итоговые значения (рис. 10.4).

Детальные данные, т. е. все записи из базового запроса, включены в главный отчет.

Отчет "Подчиненный для продаж по годам" в режиме Конструктора

Рис. 10.4. Отчет "Подчиненный для продаж по годам" в режиме Конструктора