Глава 19
Генератор отчетов QuickReport
Распечатка всевозможных отчетов — одна из самых распространенных функции приложений баз данных. Кнопки печати всевозможных бумажных документов присутствуют практически в каждой такой программе. Delphi предоставляет разработчику целый набор компонентов для конструирования отчетов, которые собраны на странице QReport Палитры компонентов.
Набор компонентов для создания отчетов, а также базовый механизм создания отчетов и их подготовки к печати, так называемый генератор отчетов, созданы фирмой QuSoft и включены в состав VCL Delphi.
В результате разработчик имеет возможность придавать приложениям функции печати отчетов без применения каких-либо дополнительных инструментов, усложняющих инсталляцию и эксплуатацию программ.
Основное назначение отчетов в приложениях баз данных заключается в переносе на бумагу информации из набора данных. Чаще всего такие отчеты имеют структуру таблиц, где столбцы соответствуют полям, а строки — записям.
В то же время, для большинства приложений не требуется применять всю мощь этого инструмента, поэтому, начиная с Delphi 3, в состав VCL включается полноценный набор компонентов QuickReport, который позволяет быстро создавать отчеты прямо на стандартной форме проекта. При этом не используются никакие дополнительные интерфейсные средства — только компоненты, Редактор кода и Инспектор объектов. Код генератора встраивается в исполняемый файл приложения и нс требует для работы дополнительных файлов.
В этой главе рассматриваются следующие вопросы.
Структура отчета
Основой любого отчета является компонент TQuickRep, который просто переносится на форму и превращает ее рабочую область в модель размеченного листа бумаги. На этой основе разработчик размещает специальные области — полосы (bands), каждая из которых отвечает за одну часть отчета: заголовок, шапку таблицы, саму таблицу и т. д. Каждой полосе соответствует собственный компонент (рис. 19.1).
Рис. 19.1. Форма отчета на основе компонентов набора QuickReport
Затем в отчет переносятся поясняющие надписи, линии, рисунки, графики, то есть все то, что может понадобиться при создании печатного документа. Все эти возможности предоставляют разнообразные компоненты набора QuickReport. В конце работы отчет подключается к нужным полям набора данных.
После этого отчет готов к работе, необходимо только добавить пару строк для инициализации отчета в той форме, где требуется этот документ напечатать.
Компонент TQuickRep умеет формировать отчет на основе соответствующего набора данных и показывать его на экране или отправлять на печать. Он сочетает в себе функции носителя других компонентов, обеспечивающих отображение содержания документа, и связующего элемента с набором данных. По существу, этот компонент сам по себе обеспечивает создание (генерацию) и печать пустого отчета.
Сам отчет состоит из нескольких частей — полос. С их помощью можно создавать отчеты произвольной структуры. Большинство полос создается компонентом TQRBand, который предназначен для того, чтобы отобразить принадлежащие ему элементы отчета в нужном месте.
Каждая полоса предназначена для представления одной части отчета — заголовка, таблицы, колонтитула и т. д. В зависимости от типа, полосы в отчете располагаются в строго определенном порядке. Например, полоса названия отчета всегда будет находиться первой или сразу после полосы заголовка страницы.
К стандартным типам относятся те полосы, которые можно создать при помощи свойства Bands компонента TQuickRep (см. табл. 19.2). Все они создаются экземплярами компонента TQRBands и образуют стандартный отчет. В таблице 19.1 приведены обозначения стандартных полос и их описание. В отчете они расположены в том же порядке, что и в таблице.
Таблица 19.1. Структура стандартного отчета QuickReport
Обозначение |
Описание |
Page Footer |
Окончание страницы. Полоса появляется в нижней части каждой страницы. Предназначена для отображения служебной информации |
Page Header |
Заголовок страницы. Полоса размещается в верхней части каждой страницы отчета. Обычно здесь размещается служебная информация об отчете |
Title |
Заголовок отчета. Полоса располагается после заголовка только на первой странице отчета. Содержит название отчета |
Column Header |
Заголовок столбца. Может размещаться в произвольных местах отчета, предназначен для выведения общей информации перед началом печати строк данных (шапка таблицы, описание нижеследующих данных и т. д.). В отчете можно размещать несколько таких полос |
Detail |
Полоса данных. Содержит информацию из заданных оформлением отчета полей набора данных. Таких полос в отчете может быть несколько |
Summary |
Итоговая полоса. Располагается сразу после полосы данных. Предназначена для размещения общей информации, суммирующей данные (сумма значений колонок или среднее значение и т. д.) |
С точки зрения создания приложений для работы с базами данных, основную роль среди полос отчета играет полоса Detail, которая размножает принадлежащие ей элементы отчета в соответствии с числом записей набора данных, указанного в свойстве Dataset компонента TQuickRep.
Рассмотрим, например, создание табличного отчета для списка всех государств из таблицы COUNTRY.DB из базы данных DBDEMOS.
В первую очередь необходимо связать компонент отчета с соответствующим компонентом набора данных. Для этого требуется указать в свойстве Dataset компонента TQuickRep имя компонента доступа к данным.
Все используемые ниже полосы создаются в отчете при помощи свойства Bands компонента TQuickRep.
Зададим заголовок и окончание страницы: на полосах Page Header и Page Footer можно разместить номера страниц отчета, дату и время, название фирмы и любую другую служебную информацию.
Полоса Title должна представлять название отчета и краткую аннотацию.
На полосе Column Header создадим шапку таблицы, включающую названия столбцов: название государства, столицу, численность населения и т. д.
Полоса Detail должна иметь симметрично расположенные по отношению к шапке таблицы вертикальные образующие линии и одну горизонтальную разделительную линию (обычно нижнюю). В образовавшихся ячейках можно разместить компоненты TQRDBText (см. ниже), связанные с набором данных отчета, и указать для них требуемые поля набора данных.
На полосе Summary можно расположить обобщающие данные, например, общую площадь государств.
В результате, при печати или просмотре отчета получится таблица с параметрами государств, так как полоса Detail будет размножена в соответствии с числом записей в таблице COUNTRY.DB.
Компонент TQuickRep
Этот компонент является основой создаваемого отчета. Его основное назначение — нести на себе другие компоненты набора QuickReport. Кроме этого, только TQuickRep умеет отправлять на печать или включать просмотр готового отчета во время выполнения приложения, так как он обладает методами Print И Preview.
Компонент TQuickRep представляет собой размеченное поле белого цвета, напоминающее чистый лист бумаги. Отчет создается на базе самой обычной формы проекта: достаточно создать новую пустую форму, перенести на нее компонент TQuickRep, и основа нового отчета готова.
Для создания нового отчета можно также воспользоваться Репозиторием объектов, который вызывается командой New из меню File Главного окна Delphi (рис. 19.2).
Любой отчет должен состоять из полос, каждая из которых отвечает за создание одной структурной части документа. От того, на какой полосе расположены специализированные компоненты отображения данных, зависит, будут ли в отчете показаны все записи набора данных или только текущая запись. Для управления стандартным набором полос компонент TQuickRep имеет специальное свойство Bands.
Все полосы располагаются в рабочей области компонента TQuickRep и выравниваются по левой и правой границе этой области.
Рис. 19.2. Создание нового отчета с помощью Репозитория объектов Delphi
Рис. 19.3. Диалог настройки параметров отчета
Важнейшие параметры отчета можно задать в специальном диалоге, который открывается командой Report settings из всплывающего меню компонента, перенесенного на форму (рис. 19.3).
Элементы управления диалога дублируют многие опубликованные свойства компонента, поэтому изменение параметра в диалоге в большинстве случаев приводит к изменению значения соответствующего .свойства в Инспекторе объектов.
Группа Paper size определяет параметры листа отчета.
Группа Margins задает отступы от края листа до рабочей области. Параметр Number of columns относится к полосам Column Header и Detail и определяет число колонок, в которых будут отображаться данные. Параметр Column space задает расстояние между колонками.
Группа Other задает параметры шрифта и единицы измерения для отчета.
Группа Page frame управляет рамкой вокруг рабочей области отчета. Рамка для каждой стороны листа задается отдельно.
Группа Bands позволяет добавлять и удалять полосы и задавать их высоту.
Для применения сделанных настроек к отчету необходимо щелкнуть на кнопке Apply, после этого можно просмотреть результат, щелкнув на кнопке Preview.
Предварительный просмотр отчета также открывается командой Preview из всплывающего меню компонента.
Таблица 19.2. Свойства и методы компонента TQuickRep
Объявление |
Тип |
Описание |
Свойства |
||
Property AllDataSets: TList; |
Pu |
Список всех наборов данных, используемых в отчете |
property Available: boolean; |
Ro, Pu |
Определяет, готов ли отчет к использованию. При значении False отчет готовится к печати или просмотру |
property BandList: TList; |
Ro |
Список имен всех полос отчета |
property Bands: TquickRepBands |
Pb |
Определяет набор полос отчета |
property DataSet: TDataSet; |
Pb |
Связанный с отчетом набор данных |
property Description: TStrings; |
Pb |
Текстовое описание отчета |
property ExportFilter: TQRExportFilter; |
Pu |
Определяет компонент TQRExportFilter, используемый для экспорта отчета в файл |
property Exporting: boolean; |
Ro |
Возвращает True, если свойство ExportFilter не пустое. Работает только при Available = False |
property Options: TquickRoportOptions; |
Pb |
Определяет параметры отчета |
property Page: TQRPage; |
Pb |
Определяет параметры страницы |
property Printer: TQRPrinter; |
Pu |
Дублирует свойство QRPrinter |
property PrinterSettings: TQRPrinterSettings; |
Pb |
Определяет параметры печати отчета |
property PrintlfEmpty: boolean; |
Pb |
При значении True разрешает печатать пустой отчет |
property RecordCount: integers- |
Pu |
Возвращает число записей в связанном с отчетом наборе данных. Для запроса SQL возвращает 1 |
property RecordNumber: integers; |
Pu |
Возвращает номер печатаемой строки |
property ReportTitle: strings- |
Pb |
Краткое текстовое описание отчета. Используется для идентификации отчета при поиске в очереди на печать принтера |
property ShowProgress: boolean; |
Pb |
При значении True во время печати отчета отображается индикатор состояния процесса |
property Units: TQRUnits |
Pb |
Определяет единицу измерения отчета |
property Zoom: integer; |
Pb |
Задает масштаб отображения отчета |
Методы |
||
procedure ExportToFilter (Afilter: TQRExportFilter); |
Pu |
Сохраняет отчет в формате, который определяется экземпляром класса фильтра, переданного в параметре |
procedure NewColumn; |
Pu |
Осуществляет переход на следующую колонку или страницу (если отчет простой) |
procedure NewPage; |
Pu |
Осуществляет переход на следующую страницу отчета |
procedure Prepare; |
Pu |
Создает отчет |
procedure Preview; |
Pu |
Осуществляет предварительный просмотр отчета |
procedure Print; |
Pu |
Осуществляет печать отчета |
procedure PrinterSetup; |
Pu |
Открывает стандартный диалог настройки принтера |
procedure PrintBackground; |
Pu |
Осуществляет фоновую печать отчета в отдельном потоке |
procedure Re set Page Footer-Size ; |
Pu |
Восстанавливает стандартные размеры окончания страницы |
Методы-обработчики событий |
||
property AfLerPreview: TQRAfterPreviewEvent; |
Pb |
Вызывается после закрытия окна предварительного просмотра отчета |
property AfterPrint: TQRAfterPrintEvent ; |
Pb |
Вызывается после завершения печати отчета |
property BeforePrint: TQRDeforePrintEvent; |
Pb |
Вызывается перед началом печати или просмотра отчета |
property OnEndPage: TQREndPageEvent; |
Pb |
Вызывается при окончании создания очередной страницы отчета |
property OnNeedData: procedure (Sender: Tobject; MoreData: boolean) |
Pb |
Вызывается при переносе данных из набора данных в отчет при его подготовке. Параметр MoreData при значении False прерывает этот процесс |
property OnPreview: procedure (Sender: TObject) |
Pb |
Используется при необходимости заменить стандартный предварительный просмотр на другой |
property OnStartPage: procedure (Sender: Tobject); |
Pb |
Вызывается при начале создания очередной страницы отчета |
При использовании в отчете вычисляемых выражений можно применять поля только из тех наборов данных, которые присутствуют в списке свойства AllDataSets. При необходимости в него можно добавить дополнительный набор данных.
При создании стандартной структуры отчета необязательно использовать компоненты полос из Палитры компонентов. Для этих целей можно применить свойство Bands, которое определяет множество имеющихся в отчете полос. Полоса включается в отчет, если для соответствующего параметра задается значение True. Свойство Bands использует следующее множество значений:
При подготовке отчета к печати или просмотру ключевую роль играет свойство printer, для печати используется канва объекта TQRPrinter, связанного через это свойство с отчетом. Такой объект создается автоматически для каждого отчета. Чаще всего при разработке отчета использовать это свойство нет необходимости.
Свойство options позволяет задать параметры отчета в целом. Класс TQuickReportOptions имеет следующие доступные для разработчика свойства:
Свойство page позволяет задать параметры страницы отчета. Класс токраде позволяет устанавливать значения для следующих опубликованных свойств:
Параметры страницы используются не только при печати отчета, но и в процессе разработки, изменяя внешний вид компонента TQuickRep на форме.
Свойство Print-erSettings типа TQRPrinterSettings позволяет установить параметры печати отчета:
Рис. 19.4. Диалог предварительного просмотра отчета
Во время выполнения приложения при использовании метода preview появляется стандартный диалог предварительного просмотра отчета (рис. 19.4). При выполнении метода print отчет сразу отправляется на принтер.
При помощи процедуры onpreview можно переопределить диалог предварительного просмотра отчета:
procedure TReportlForm.QuickRepPreview(Sender: TObject);
begin
PreviewForm.QRPreviewl.QRPririter := Sender as TQRPrinter;
PreviewForm.Show;
end;
В этом случае в секцию uses модуля отчета необходимо добавить модуль QRPrntr.
При разработке стандартных отчетов для компонента TQuickRep обычно задаются значения всего нескольких свойств. Определяются параметры листа отчета: отступы, единицы измерения, ориентация и т. д. При помощи свойства DataSet с отчетом связывается основной набор данных (это не значит, что в нем нельзя будет использовать другие наборы данных). Свойство ReportTitie поможет идентифицировать отчет в очереди на печать принтера. При помощи свойства Bands задаются стандартные полосы.
Компонент TQRBand
Компонент инкапсулирует основные свойства стандартной полосы отчета и предназначен для создания структуры отчета (табл. 19.3). На нем можно размещать другие компоненты, определяющие внешний вид отчета и отображающие информацию. Компонент может играть роль любой полосы, тип которой определяется свойством BandType. При создании отчетов для приложений, работающих с БД, основную роль играет тип Detail.
В зависимости от выбранного типа полосы, изменяется повеление компонента во время печати или просмотра. Ширина компонента не может быть изменена — она определяется только шириной рабочей области отчета. Высота компонента в большинстве типов полос регулируется обычными способами. Исключение составляют типы Detail и SubDetail, высота которых при печати или просмотре зависит от первоначальной высоты и количества за писей в связанном наборе данных.
Таблица 19.3. Важнейшие свойства и методы компонента TQRBam:
Объявление |
Тип |
Описание |
Свойства |
||
property AlignToBottom: boolean; |
Pb |
При значении True полоса печатается в нижней части страницы |
property BandType: TQRBandType . |
Pb |
Определяет тип полосы |
property ChildBand: TQRCustomBand; |
Ro |
Возвращает ссылку на объект дочерней полосы. Свойство времени выполнения |
property ForceNewColumn: boolean; |
Pb |
При значении True новая колонка начинает печататься от верха полосы |
property ForceNewPage: boolean; |
Pb |
При значении True полоса начинает печататься с начала страницы |
property Frame: TQRFrame; |
Pb |
Задает рамку по краям полосы. Настройка индивидуальна для каждой стороны |
property HasChild: boolean; |
Pb |
При значении True создает дочернюю полосу |
property LinkBand: TQRCustomBand; |
Pb |
Связывает полосу с другой полосой. При этом, если обе полосы не могут быть напечатаны на одной странице, осуществляется переход на следующую страницу |
property ParentReport: TcustomQuickRep; |
Pu |
Возвращает ссылку на отчет-владелец полосы |
Методы |
||
function AddPrintable (PrintableClass: TQRNewComponentClas5) : TQRPrintable; |
Pu |
Добавляет к полосе новый компонент |
Методы-обработчики событий |
||
property AfterPrint (Sender: TQRCustomBand; BandPrinted: Boolean) ; |
Pb |
Вызывается после печати или просмотра полосы. Параметр BandPrinted содержит результат выполнения метода-обработчика BeforePrint |
Property BeforePrint (Sender: TObject; var PrintBand: boolean); |
Pb |
Вызывается перед печатью или просмотром полосы. Параметр управляет процессом печати. При значении False печать прерывается |
Основное свойство компонента полосы BandType определяет ее тип и, следовательно, поведение. Это свойство устанавливается вручную только в том случае, когда разработчик переносит новый компонент полосы из Палитры компонентов. При использовании свойства Bands отчета тип полосы устанавливается автоматически. Свойство BandType может принимать следующие значения:
При помощи метода AddPrintable можно изменять оформление полосы во время выполнения приложения. Он переносит на полосу новый компонент, указанный в параметре printabieciass. Оформление можно модифицировать в соответствии с действиями пользователя или при появлении в наборе данных определенной информации. Так как функция AddPrintable возвращает ссылку на экземпляр компонента, то ее можно использовать и для задания параметров элемента.
Типы отчетов
При помощи набора компонентов QuickReport можно создавать самые разнообразные отчеты. Самые простые отчеты могут вообще не иметь полосу данных Detail, ограничиваясь отображением значений нескольких полей связанного набора данных.
К этой же категории можно отнести отчеты, представляющие данные в виде таблицы. Структура таких простых отчетов обычно состоит из полос заголовка PageHeader и окончания страницы PageFooter, полосы заголовка отчета Title, полосы заголовка колонок ColumnHeader, полосы данных Detail и суммирующей полосы Summary.
Полоса Title печатается один раз в начале первой страницы накладной и содержит общую информацию о заказе. Статические надписи оформления отчета создаются при помощи компонентов TQRLabel.
Следом за полосой заголовка отчета располагается полоса заголовка колонок, которая использована для создания шапки таблицы накладной. Она отображается один раз" на первой странице отчета. Здесь используются компоненты TQRLabel и TQRShape, предназначенные для отрисовки составляющих таблицу линий.
Главную роль в такого рода отчетах играет полоса данных Detail, на которой размешены компоненты TQRDBText, связанные с требуемыми полями набора данных. При создании отчета полоса данных размножает заданную в ней структуру данных в соответствии с числом записей набора данных. Размещенные на полосе компоненты TQRShape создают обрамление для одной строки таблицы. Соответственно при размножении структуры полосы получится настоящая таблица.
Полоса Summary замыкает отчет и используется для размещения обобщающих данных.
Более сложную структуру имеют так называемые групповые отчеты, которые позволяют, подобно запросам SQL, разбивать массив записей набора данных на группы в соответствии с некоторым критерием. Для каждой группы можно задавать собственные полосы заголовка и окончания. Допускается создание вложенных групп. При создании групп используются компоненты TQRGroup.
Еще одна категория отчетов позволяет печатать данные из наборов данных, связанных отношением "один ко многим". В этом случае для каждой записи из главного набора данных создается и соответствующим образом оформляется группа записей из подчиненного набора данных. При этом используется компонент TQRSubDetail.
Разработчик может объединить несколько различных отчетов в один при помощи компонента TQRCompositeReport. Для включения отчета в общий отчет используется метод Add. Отчеты печатаются один за другим в порядке их подключения. Создавать составной отчет можно только программно.
Оформление отчета
Для оформления внешнего вида отчета и представления данных в наборе QuickReport имеется широкий выбор компонентов. Часть из них просто отображается в отчете, часть предназначена для показа значений полей из связанного с отчетом набора данных.
Подавляющее большинство этих компонентов копирует стандартные компоненты VCL, поэтому мы не будем подробно останавливаться на их свойствах и методах.
Чаще всего при оформлении отчетов используются три компонента.
Нижеследующие компоненты используются несколько реже для решения более специальных задач оформления отчетов.
Компоненты TQRMemo и TQRRichText используется для представления нескольких связанных между собой текстовых строк. Набор строк определяется свойством Lines. Компонент TQRExprMenio отличается от компонента
TQRMemo одним свойством RemoveBlankLines, которое при значении True разрешает удаление из свойства Lines пустых строк. Это свойство работает только для исходных данных, заданных во время разработки, новые строки, вносимые в свойство Lines, например, в методе-обработчике Beforeprint, обрабатываться не будут.
Компонент TQRDBRichText предназначен для представления в отчетах полей типа Memo набора данных.
Компонент TQRimage позволяет оформить отчет с картинками. Компонент TQRDBimage представляет в отчете изображения из графического поля набора данных.
Данные в отчетах QuickReport можно представлять и в графическом виде. Для этого используется компонент создания графиков в отчетах TQRChart. Система управления графиком основана на аналогичной системе компонента TDBChart (гл. 18).
При создании отчетов помимо основной информации часто требуется отображать и служебные, вспомогательные данные. Чаще всего это дата и время создания отчета и номера страниц. Для решения этой проблемы отчет имеет набор системных переменных.
Для представления системных данных в отчете применяется компонент TQRSysData. Для определения вида отображаемой компонентом информации используется свойство Data, которое имеет следующие значения:
При создании отчетов (особенно на основе наборов данных) почти всегда требуется подвести итог для каких-либо данных, представленных в отчете. Это может быть сумма поступлений или продаж, количество заказов или поступивших партий товаров. Эти данные обычно имеются в формах приложения и их можно перенести в отчет при помощи стандартных компонентов.
Однако в наборе QuickReport для расчета и представления такого рода данных имеется специальный компонент TQRExpr, использовать который гораздо удобнее. Кроме этого, компонент объединяет гибкий и мощный механизм создания на основе данных из таблиц БД вычисляемых выражений. Добиться аналогичных результатов стандартными средствами Delphi можно, лишь создавая довольно громоздкие дополнительные запросы SQL.
Основную роль в создании вычисляемого выражения в компоненте играет свойство Expression, которое имеет строковый тип.
Свойство Master используется для связывания компонента с отчетом или полосой данных.
Свойство Mask позволяет определить особенности отображения результатов вычислений.
Со свойством Expression связан специализированный редактор Expression Wizard, который автоматизирует процесс создания вычисляемого выражения .
Центральную часть диалога занимает многострочный редактор, который должен содержать текст вычисляемого выражения. Ниже расположены основные элементы управления.
При желании и хорошем знакомстве с синтаксисом вычисляемых выражений компонента TQRExpr текст можно задавать прямо в однострочном редакторе свойства Expression Инспектора объектов.
Кнопка Database field открывает диалоговое окно выбора поля из доступных в данном модуле наборов данных. В его левом списке Select dataset выбирается набор данных, а в правом списке Available fileds — нужное поле.
Кнопка Function открывает диалоговое окно выбора функции. По аналогии с предыдущим диалоговым окном в левом списке представлены типы функций, в правом выбирается нужная функция. После определения конкретной функции открывается диалоговое окно задания параметров функции. В зависимости от числа параметров функции, это диалоговое окно может содержать от одного до трех однострочных редакторов для определения значения параметра. В роли параметра может выступать любое синтаксически верное выражение, включающее любые доступные элементы. Поэтому при щелчке на кнопке справа от однострочного редактора параметра функции открывается новое диалоговое окно, полностью идентичное первоначальному.
После задания параметров функция добавляется к тексту вычисляемого выражения.
Кнопка Variable открывает диалоговое окно для работы с переменными. Первоначально список переменных содержит только шесть системных переменных отчета, о которых говорилось выше.
В списке можно выбрать переменную и затем включить ее в создаваемое вычисляемое выражение.
Группа переключателей в верхней части отображает в списке локальные (Local defines) или глобальные (Global defines) переменные. Значения локальных переменных распространяются на все элементы данного отчета (компонента TQuickRep). Значения глобальных переменных имеют силу для компонентов любого отчета приложения.
Ряд кнопок в нижней части группы Insert at cursor position основного диалога добавляют к выражению арифметические и логические операторы.
Кнопка Validate проверяет правильность вычисляемого выражения и возвращает результат.
Синтаксис вычисляемого выражения полностью соответствует синтаксису построения математических и логических выражений.
Резюме
Механизм генерации печатных отчетов в приложениях баз данных Delphi 5 отличается простотой реализации и компактностью. Для создания отчетов используется набор компонентов QuickReport 3. С помощью компонентов набора можно создавать самые разнообразные отчеты. Основу отчетов составляет компонент TQuickRep.