Использование конструктора
ActiveX DataReport
Имеется еще одна важная операция, выполняемая при создании приложений для работы с базами данных - генерация отчетов. Генерация иерархических отчетов с вычислением итогов (например, отчетов для данных, возвращаемых иерархией объектов Command, созданных в предыдущем параграфе) и их распечатка - одна из основных задач разработчика. Понятно, что хотелось бы работать с утилитой, которая генерирует для нас отчеты только с помощью мыши и позволяет корректно их распечатывать. Второй конструктор ActiveX в Visual Basic 6 — DataReport Designer — предназначен именно для этого. Посмотрим, как конструктор DataReport создает отчет, основанный на иерархии объектов Command. Выполните следующие действия.
1. Сделайте активным проект Report и дважды щелкните на DataReport Designer в окне проводника проекта, чтобы открыть его. На экране появится шаблон отчета, который не соответствует созданной структуре иерархии объектов Command.
2. Откройте окно DataReport, чтобы подключить объект DataReport к объекту Command 1.
3. В окне Properties найдите свойства DataSource и DataMember и установите их в DataEnvironment 1 и Command-1 соответственно.
4. Щелкните правой кнопкой на объекте DataReport 1 и из контекстного меню выберите команду Retrieve Structure.
Структура иерархии объектов Command отобразится на объекте DataReport (рис. 18.11).
Рис. 18.11. Объект DataReport после чтения структуры объектов Commandl
Полученный шаблон содержит отчет и заголовок страницы. Затем следуют заголовки двух групп для объектов Command 1 и Command2. Как видно, деталями отчета являются поля объекта Commands. После секции Detail следуют соответствующие нижние колонтитулы.
Оставьте заголовок отчета (Report header) пустым (позже можно поместить в него любые строки) и выполните следующие действия.
1. Чтобы удалить место, в котором обычно размещается Report header (даже если он пуст), щелкните на серой панели под секцией Report header (панель Page header), чтобы выделить ее.
2. Перемещайте указатель у верхней части панели, пока он не примет форму двойной стрелки.
3. Нажмите кнопку мыши и переместите панель Page header вверх, чтобы удалить зазор между панелями.
Примечание
Секция Page header содержит номера страниц (и, возможно, другие пункты).
4. Чтобы показать в этом заголовке номер текущей страницы, щелкните правой кнопкой мыши в области Page header (пустое место под панелью с заголовком "Page Header").
5. Из контекстного меню выберите пункт Insert Control, чтобы открыть следующее подменю (рис. 18.12).
Рис. 18.12. Элементы управления, добавляемые в объект Report
6. Добавьте элемент управления Label, а затем - элемент управления Current Page Number.
На рис. 18.13 показан объект Report на последней стадии разработки. Можете использовать этот рисунок в качестве руководства в процессе конструирования вашего отчета.
Элемент управления Label, добавленный в отчет, напоминает стандартный элемент управления Label. Называется он rptLabel,
и у него не так много свойств, как у обычного элемента управления Label. Но их достаточно для того, чтобы определить его внешний вид в отчете. Можно перемещать его с помощью мыши, изменять размер и задавать основные свойства (Font и Caption), используя окно Properties. Это справедливо и для элемента управления Current Page Number. Можно задавать его свойства Font, ForeColor и Caption. По умолчанию Caption установлен в %р — специальное значение, указывающее Visual Basic подставить номер текущей страницы.
Рис. 18.13. Проектирование отчета с помощью конструктора DataReport (окончательный вид отчета показан на рис. 18.14)
Первый заголовок группы (Group Header), соответствует полям объекта Command 1. Очевидно, что здесь необходимо поместить название компании (контактное имя и номер телефона) или другое поле, уникальное для каждого заказчика. Здесь же находятся итоговые поля TotalOrders и CustomerTotal.
Выполните следующие действия.
1. Поместите два больших элемента управления Label в область первого заголовка группы и установите их заголовки соответственно в Total Orders и Customer Total.
2. Откройте конструктор DataEnvironment1 и перетащите поля TotalOrders и CustomerTotal, расположенные под объектом Command 1, к двум элементам Label на первом заголовке группы. Выберите подходящий шрифт и выровняйте их.
Следующий заголовок соответствует объекту Command2. Этот объект содержит идентификаторы счетов (поле OrderID) и их итоги (поле OrderTotal). Разместите эти два поля в области второго заголовка группы. Переместите соответствующие поля под объектом Command2 в конструкторе DataEnvironmentI в область второго заголовка.
Если хотите печатать заголовки столбцов для этих двух полей, то поместите их в предыдущий заголовок группы (иначе они будут появляться перед каждым счетом). Разместите два других элемента управления Label и установите их заголовки соответственно в "Order ID" и "Order Total" (см. рис. 18.13).
Перейдем к секции Detail (Детали). Здесь должны быть поля объекта Command3 (этот объект использовался для вычисления итогов), но пока поля объекта Commands нас не интересуют. Поэтому в нашем отчете не будет секции Detail. Второй заголовок группы представляет собой суть секции Detail отчета (эта ситуация достаточно типична при разработке отчетов). Чтобы поэкспериментировать с секцией Detail, поместите в нее подробные сведения о счетах.
Установите высоту секции Detail в 0, передвинув разделитель этой секции вверх. В этом примере мы не используем нижние колонтитулы, но их можно настроить так же, как и заголовки. Вообще, можно поместить любой элемент управления, используя меню Insert, и манипулировать его свойствами с помощью окна Properties.
Чтобы вывести отчет на экран, вызовите метод Show объекта DataReportl. Разместите на форме командную кнопку, назовите ее Report
и введите код обработчика ее события Click.
Private Sub Command1_Click()
DataReport1.Show
End Sub
Запустите проект снова, нажмите кнопку Report и вы увидите разработанный отчет в отдельном окне на экране (рис. 18.14). Две кнопки вверху окна DataReport позволяют распечатать его на любом принтере или экспортировать его в текстовый формат или формат HTML. Практически, конструктор DataReport сделал всю работу. Наиболее важный аспект этого процесса состоит в том, что распечатка отчета создавалась без написания какого-либо кода.
Рис. 18.14. Окончательный вид отчета сгенерирован конструктором ActiveX DataReport