Создание подчиненных отчетов
Подчиненные отчеты могут создаваться двумя способами:
- с помощью Мастера подчиненной формы/отчета для создания нового подчиненного отчета в существующем отчете;
- путем внедрения уже существующего отчета (или формы) в другой отчет (в этом случае внедряемый отчет становится подчиненным).
Для того чтобы продемонстрировать, как создаются составные отчеты, мы построим отчет, показывающий квартальные обороты клиентов. Сначала нужно создать запрос, который будет базовым для главного отчета. Этот запрос будет иметь параметр [Отчетный год:] и выбираться будут все клиенты, которые имеют заказы в указанном году (рис. 10.5).
Этот запрос очень просто создать на основе имеющегося в базе данных "Борей" подобного запроса "Квартальные обороты" (Quarterly Orders):
- Выделите названный запрос в окне базы данных и скопируйте его, используя команды копирования и вставки Правка, Копировать (Edit, Copy) и Правка, Вставить (Edit, Paste). Дайте ему название "Квартальные обороты клиентов".
- Откройте его в режиме Конструктора.
- Удалите последнее поле "ДатаРазмещения" (OrderDate) из таблицы полей внизу окна запроса и вместо него вставьте вычисляемое поле: ГодЗаказа: Year ("[ДатаРазмещения]) (для английской версии используйте английское имя поля OrderDate, в качестве имени вычисляемого поля можете задать OrderYear), а в строку Условие отбора (Criteria) введите имя параметра запроса [Отчетный год: ]. Сохраните и закройте запрос.
Рис. 10.5. Базовый запрос для отчета "Квартальные обороты клиентов"
Теперь создадим отчет на основе только что созданного запроса. Для этого можно воспользоваться Мастером отчетов (Report Wizard) (см. гл. 6).
Выберите для помещения в отчет поля "Название" (CompanyName), "Город" (City) и "Страна" (Country), отсортируйте записи по полю "Название", выберите тип отчета в столбец (Column) и один из предложенных стилей отчета. В результате вы получите отчет примерно такой, как изображен на рис. 10.6.
Для того чтобы построить подчиненный отчет, содержащий квартальные обороты клиентов, воспользуемся уже готовым запросом "Квартальные обороты по товарам" (Quarterly Orders by Product), слегка его изменив. А именно, нужно удалить из запроса последнее поле "ДатаРазмещения" (OrderDate), для которого задано лишнее в нашем примере условие выборки. Тогда запрос будет выглядеть так, как это представлено на рис. 10.7. Сохраните его с именем "Квартальные обороты клиентов по товарам".
Рис. 10.6. Главный отчет составного отчета
Рис. 10.7. Базовый запрос для подчиненного отчета
Чтобы создать подчиненный отчет, воспользуемся Мастером подчиненных отчетов. Для этого:
- Откройте отчет "Квартальные обороты клиентов" в режиме Конструктора.
- Выберите элемент управления Подчиненная форма/отчет (Subform/Subreport) на Панели элементов (Toolbox) и разместите его в разделе Область данных (Detail) ниже полей, содержащих данные о клиенте. (Кнопка Мастера (Control Wizards) должна быть нажата.)
- В первом диалоговом окне мастера выберите переключатель Имеющиеся таблицы и запросы (Use existing Tables and Queries) (рис. 10.8). Нажмите кнопку Далее (Next).
Рис. 10.8. Первое диалоговое окно Мастера подчиненных отчетов
- Во втором диалоговом окне мастера нужно определить, какие поля требуется включить в подчиненный отчет (рис. 10.9). При этом поля в общем случае можно выбирать из нескольких таблиц и запросов. В данном случае нужно в раскрывающемся списке Таблицы и запросы (Tables/Query) выбрать запрос "Квартальные обороты клиентов по товарам" (который был создан для этого примера), затем нажать кнопку с двумя стрелками, чтобы включить в подчиненный отчет все поля запроса, и нажать кнопку Далее (Next).
Рис. 10.9. Второе диалоговое окно Мастера подчиненных отчетов
- В следующем диалоговом окне необходимо определить связь между главным и подчиненными отчетами, если эта связь существует, или выбрать из списка значение Отсутствует (None), если вы создаете независимый подчиненный отчет. В данном случае можно выбрать связь в отображенном списке, но нам предложенные варианты не подходят, поэтому выберите переключатель Самостоятельное определение (Define my own), чтобы задать эту связь самостоятельно.
Замечание
Так как поля в связываемых источниках данных имеют одинаковые типы и названия, Мастер подчиненных отчетов может автоматически связать отчеты по этим полям. Именно такие связи будут предложены в списке возможных вариантов связывания отчетов.
- В диалоговом окне появятся две пары раскрывающихся списков (рис. 10.10). В списках слева отображаются поля главного отчета, а в списках справа — связанные с ними поля подчиненного отчета. Связь может быть задана по одному или нескольким полям. В данном случае требуется задать связь по двум полям, чтобы связать источники данных главного и подчиненного отчетов одновременно и по коду клиента, и по отчетному году. Для этого выберите в раскрывающихся списках слева элементы: "КодКлиента" (CustomerlD) и "ГодЗаказа" (OrderYear), и соответствующие (с такими же именами) элементы в раскрывающихся списках напротив (справа), как представлено на рис. 10.10.
Рис. 10.10. Третье диалоговое окно Мастера подчиненных отчетов
Замечание
То, что между главным и подчиненным отчетами установлена связь по полям "КодКлиента" и "ГодЗаказа", означает, что каждая запись в главном отчете будет связана с набором записей из подчиненного отчета, имеющих соответствующие значения в связанных полях. А поскольку значение года заказа в главном отчете определяется значением параметра запроса [Отчетный год:], то в связанном описанным способом подчиненном отчете будут отобраны только те записи, у которых значение поля "ГодЗаказа" совпадет со значением такого же поля в главном отчете, а значит, и с заданным пользователем значением параметра [Отчетный год: ].
- Определив связь между отчетами, нажмите кнопку Далее (Next).
- В последнем диалоговом окне требуется задать имя подчиненного отчета. Вы можете оставить предложенное мастером название "Подчиненный отчет Квартальные обороты клиентов по товарам" и нажать кнопку Готово (Finish).
В результате в главном отчете будет создано поле Подчиненный отчет (Subreport). Вам потребуется только настроить высоту и ширину этого поля, удалить его метку, и вы получите отчет, аналогичный изображенному на рис. 10.11.
Рис. 10.11. Отчет "Квартальные обороты клиентов"
В качестве подчиненного отчета может быть использована и форма. Например, отчет, аналогичный только что описанному, можно получить с помощью уже имеющейся в базе данных "Борей" формы "Подчиненная для квартальных оборотов" (Quarterly Orders Subform).
Для этого:
- Скопируйте данную форму, задав ей новое имя "Подчиненная для квартальных оборотов 2".
- Откройте полученную копию в режиме Конструктора и замените источник данных на запрос "Квартальные обороты клиентов по товарам", созданный для предыдущего примера. Сохраните и закройте форму.
Замечание
Источник данных для формы доступен в режиме Конструктора в окне свойств формы как свойство Источник записей (Record Source) на вкладке Данные (Data).
- Затем скопируйте созданный ранее отчет "Квартальные обороты клиентов", задав ему новое имя "Квартальные обороты клиентов 2", и откройте его в режиме Конструктора.
- Удалите подчиненный отчет и вместо него просто перенесите с помощью мыши созданную форму из окна базы данных в область данных отчета. Автоматически будет создан элемент Подчиненная форма/отчет (Subform/Subreport) с именем "Подчиненная для квартальных оборотов".
- Теперь настройте высоту и ширину созданного элемента и в свойствах подчиненной формы на вкладке Данные (Data) определите связующие поля. Для этого нажмите кнопку Построителя справа от свойства Подчиненные поля (Link Child Fields) и задайте в появившемся диалоговом окне две пары одноименных связанных полей: "КодКлиента" (CustomerlD) и "ГодЗаказа" (OrderDate), таким же образом, как это было описано в предыдущем примере. Указанные поля запишутся в качестве значений свойств Подчиненные поля (Link Child Fields) и Основные поля (Link Master Fields).
В результате вы получите отчет, аналогичный представленному на рис. 10.12.
Для полноты картины добавим в главный отчет два вычисляемых поля, которые будут показывать, на какую сумму клиент купил товара за год. Оба поля представляют собой текстовые поля, у каждого из которых свойство Данные (Control Source) задано выражением. Первое поле формирует надпись с номером отчетного года. Для вычисления значения этого поля используется следующее выражение:
="Итоги за " & [Reports]![Квартальные обороты клиентов 2]![Подчиненная для квартальных оборотов].[Report]![ГодЗаказа]
(для английской версии используйте название поля OrderYear). Второе поле содержит сумму всех заказов клиента за год и вычисляется с помощью следующего выражения:
=[Подчиненная для квартальных оборотов].Form![Итого]
(для английской версии используйте название поля Total), т. е. отображает поле "Итого" (Total) из подчиненной формы "Подчиненная для квартальных оборотов". Отформатируйте созданное поле для отображения в нем денежной суммы в том же виде, как отображаются денежные суммы в подчиненной форме, скопировав значения свойств Формат поля (Format) и Число десятичных знаков (Decimal Places).
Рис. 10.12. Составной отчет, включающий подчиненную форму