Специфичные события. AfterPreview,BeforePrint/fterPrint‑ закончен просмотр, перед/после печати.
AfterPreview,BeforePrint/fterPrint‑ закончен просмотр, перед/после печати.
OnEndPage, OnStartPage‑ создана страница, начата генерация новой.
OnPreview‑ отчет будет предварительно просмотрен.
Компоненты отчета
Многие компоненты аналогичны соответствующим компонентам формы (аналог указывается в скобках).
QRSubDetail‑ подчиненная таблица. Связь организуется через свойство Master/Dеtail. В свойстве DataSet указывается подчиненный набор данных, а в свойстве Master указывается отчет, привязанный к главной таблице (п. 3.10.5).
QRStringsBand‑ полоса строк типа TStrings в свойстве Items (QRStringsBand1.Items.LoadFromFile(‘Fam.Txt’).
QRBand‑ полоса отчета. Компоненты размещаются на соответствующих полосах. Свойство BandType ‑ задает тип полосы: rbTiltle (заголовок отчета, печатается в начале отчета), rbPageHeader (заголовок листа), rbDetail (записи отчета), rbPageFooter (подножие листа, выводимое внизу каждого листа), rbSummary (итоги по всему отчету), rbGroupHeader (заголовок группы, выводимый в начале группы), rbGroupFooter (подножие группы, выводимое в конце группы; обычно выводятся итоги по группе), rbSubDetail (данные подчиненного набора для отчета «мастер/детальный», rbColumnHeader (заголовки столбцов, выводимые один раз на странице над данными), rbChild (дочерняя полоса, выводимая после родительской).
QRChildBand‑ подчиненная полоса. Используется, когда размеры родительской полосы заранее не известны. Полоса добавляется к родительской снизу.
QRGroup‑ заголовок группы элементов. Свойство Expression содержит имя поля (в квадратных скобках, если имя с пробелами) или выражение, по которому производится группировка. Свойство FooterBand задает имя компонента (полосы отчета), являющиеся подножием данной группы (п. 3.10.4) и свойство Master=QuickRep1.
QRLabel‑ текстовая надпись (Label).
QRDBText‑ вывод в детальной полосе значения поля (свойство DataField) набора данных (свойство DataSet). Свойство AutoStretch=True и AutoSize=False задает вывод значения в несколько строк.
QRExpr‑ вычисляемое поле отчета. Выражение или имя поля указывается в свойстве Expression (обычно выражение строится мастером (рис. 3.10.2.1), а значение задается свойством Value).
QRSysData‑ системная информация, используемая в составных отчетах для единой настройки и вывода дополнительной информации, используя свойство Data: qrsColumnNo (номер текущего столбца многоколоночного отчета), qrsData (текущая дата), qrsDataTime (текущая дата и время), qrsDetailCount (число выведенных записей), qrsDetailNo (номер текущей записи главной таблицы), qrsPageNumber (номер текущего листа), qrsPageCount (число листов в отчете, требует второго чтения таблицы, что увеличивает время), qrsReportTitle (заголовок отчета), qrsTime (текущее время). Свойство Text задает поясняющий текст.
QRMemo‑ многострочное поле (Memo).
QRExprMemo‑ многострочное вычисляемое поле. Включает в строки (свойство Lines) выражения в фигурных скобках, которые вычисляются при формировании отчета.
QRRichText‑ форматированный текст.
QRDBRichText‑ вывод форматированного текста, на основе поля Blod, указанного в свойстве DataField.
QRShape‑ фигура (Shape).
QRImage‑ рисунок (Image).
QRDBImage‑ рисунок, который хранится в поле Blob.
QRCompositeReport‑ формирование составного отчета из нескольких других отчетов. Свойство Reports содержит список отчетов. Добавляется отчет в обработчике события OnAddReport методом Add (QRComopziteReport1.Reports.Add(fmReport1.QuickRep1) (п. 3.10.6).
QRPreview‑ создание окна просмотра отчета в событии OnPreview.
QRTextFilter‑ экспорт отчета в текстовый файл, щелкнув по кнопке Save.
QRCSVFilter‑ аналогичен предыдущему, но данные заключаются в кавычки и между ними выводится разделитель (свойство Separator).
QRHTMLFilter‑ экспорт отчета в файл формата HTML (в каталог Web ‑ сервера Интернет) для его просмотра из броузера.
QRChart‑ вывод диаграммы на принтер (Chart).
Основные свойства компонентов
Alignment‑ выравнивание текста внутри компонента.
Font‑ параметры шрифта.
Frame‑ оформление рамки вокруг отдельного элемента.
Событие OnPrintвозникает непосредственно перед выводом компонента. Процедура обработки этого события имеет два параметра: Sender (имя компонента) и Value (выводимое значение, которое в процедуре обработки можно отредактировать, например, Value:=Value+' тыс.руб.' ).
Для формирования выражения свойства Expression обычно используется мастер выражений (рис. 3.10.2.1), вызываемый кнопкой с троеточием. В окне мастера имеются кнопки: Database Field (список полей набора), Function (список функций по категориям), Variable (список системных переменных), Clear (очистка окна с текстом выражения), Validate (проверка выражения), арифметические, логические операции и операции сравнения.
Рис. 3.10.2.1. Окно мастера выражений
Простой отчет
Простой отчет формируется из одного набора данных без группировки данных. Рассмотрим порядок его формирования на примере справочника заказчиков (рис. 3.10.3.1).
Рис. 3.10.3.1
. Окна проектирования (QuickRep) и просмотра отчета (Preview)
1. Разместим на форме компонент Table со свойствами: Name=Table1, Active=True, DatabasesName=stroiki (псевдоним базы), TableName=zakazhiki.db.
2. Разместим компонент QuickRep под именем QuickRep1. Для всех подсвойств свойства Band укажем значение True (вывод всех полос отчета). Свойство DataSet=Table1.
3. Размеcтим на полосах нужные компоненты отчета: QRLabel (надписи, заголовки колонок), QRDBText (поля Kz, Nz в детальной полосе), QRExpr (поля Data, Count со значениями Data и Count для свойства Expression), QRSysData (вывод номера листа Data=qrsPageNumber).
4. Разместим кнопку Вывод (кнопку лучше размещать на основной форме, а не на форме с отчетом, как в нашем случае) с командой формирования и просмотра отчета QuickRep1.Preview.
5. Проверим правильность, выполнив команду Preview из контекстного меню компонента QuickRep или выполнив все приложения и нажав кнопку Вывод.
3.10.4. Отчет из нескольких таблиц с группировкой данных и итогами
Рассмотрим порядок создания сложных отчетов на примере создания отчета «Состояние строек по заказчикам и подрядчикам» (рис. 3.10.4.3).
Создадим новый проект из двух форм.
Разместим на второй форме компонент Query (панель Data Access) под именем Query1 со свойствами: DatabaseName=Stroiki (псевдоним нашей базы (п. 3.2)), Active=True (активизация запроса) (рис. 3.10.4.2). Для формирования запроса выполним команду SQL Builder из контекстного меню компонента Query. Появится окно построителя (рис. 3.10.4.1). Выберем в поле DataBase базу с псевдонимом Stroiki и перенесем все таблицы базы, используя поле Table.
Рис. 3.10.4.1. Окно построителя запросов
Отметим включаемые в запрос поля. Мышкой свяжем таблицы по полям Kz и Kp (коды заказчиков и подрядчиков) и на странице Joins проверим связи. На странице Sorting укажем поля сортировки Nz и Np (наименования заказчиков и подрядчиков). Нажмем кнопку Execute Query
для проверки запроса. Закроем окно построителя. Выполним команду Fields Editor из контекстного меню компонента Query1 и проверим, чтобы все поля запроса были в окне Form2.Query1. Если их нет, то выполним
команду Add All Fields из контекстного меню окна Form2.Query1.
Рис. 3.10.4.2. Окно проектирования отчета QuickRep
Рис. 3.10.4.3. Окно просмотра сформированного отчета Preview
Разместим на второй форме компонент QuickRep (панель QReport) под именем QuickRep1 со свойствами: DataSet=Query1 (сформированный ранее запрос является исходным набором данных для отчета); составное свойство Bands задает вывод соответствующих полос отчета Page Header (заголовок листа), Column Header (заголовки колонок), Detail (детальная полоса), Summary (итоги по отчету).
Разместим компоненты QRExpr в детальной полосе для вывода значений полей (значения свойств Expression): Ns (наименование стройки), Ss (сметная стоимость), Fs (фактически освоенная сумма) и значения выражения Ss-Fs (неосвоенная сумма). Для числовых полей укажем свойство Alignment= taRightJustify (выравнивание справа). Проверьте отчет, выполнив команду Preview из контекстного меню компонента QuickRep1. Если отчет пуcтой, то проверьте значение свойства Active для компонента Query1: оно должно быть истинным (True).
В полосе Column Header сформируем заголовки колонок. Каждый заголовок формируется отдельным компонентом QRLabel.
В полосе Page Header разместим наименование отчета (QRLabel), текущую дату и время (QRSysData со свойством Data=qrsDateTime), номер текущего листа (QRSysData со свойствами Data=qrsPageNumber, Text=«Лист»).
В полосе Summary сформируем итоги по отчету, размещая компоненты QRExpr со свойствами Expression, в которых используется функция Sum для итогового суммирования полей Ss, Fs и Ss-Fs. и Alignment= taRightJustify.
Выделим QuickRep1 и разместим компонент (двойным щелчком) QRGroup под именем QRGroup1 (для размещения заголовка группы первого уровня ‑ заказчики) со свойствами: Expression=Query1.Nz (группировка производится по полю с наименованием заказчика) и Master=QuickRep1. Разместим компонент QRExpr со свойством Expression=Query1.Nz (наименование заказчика).
Разместим компонент QRGroup под именем QRGroup2 (для размещения заголовка группы второго уровня ‑ подрядчики) со свойствами: Expression= Query1.Np (группировка производится по полю с наименованием подрядчика) и Master=QuickRep1. Разместим компонент QRExpr со свойством Expression=Query1.Np (наименование подрядчика).
Разместим компонент QRBand под именем QRBand1 (для размещения подножия группы первого уровня ‑ заказчики) со свойствами: BandType=rbGroupFooter (подножие группы). Для группы QRGroup1 установим свойство FooterBand=QRBand1 (подножием группы является полоса QRBand1). Разместим поля с итогами аналогично итогам в полосе Summary. Для каждого компонента QRExpr установим свойство ResetAfterPrint=True (очистка итоговых полей после их вывода, иначе - будут нарастающие итоги).
Разместим компонент QRBand под именем QRBand2 (для размещения подножия группы второго уровня ‑ подрядчики) со свойствами: BandType=rbGroupFooter (подножие группы). Для группы QRGroup2 установим свойство FooterBand=QRBand2 (подножием группы является полоса QRBand2). Разместим поля с итогами аналогично итогам в полосе QRBand1.
12. На первой форме разместим кнопку Отчет с процедурой обработки события OnClick (вывода отчета):
Procedure TForm1.Button1Click(Sender: TObject);
Begin Form2.Query1.Active:=False; {закрытие запроса}
Form2.Query1.Active:=True; {открытие запроса для его формирования}
Form2.QuickRep1.Preview; {формирование и просмотр отчета}
Form2.Query1.Active:=False;{закрытие запроса} End;
Внимание! Перед формированием отчета или запроса нужно закрыть ранее открытый запрос и заново его открыть, чтобы запрос сформировался повторно на возможно измененных исходных таблицах, иначе изменения в таблицах не будут учтены.
13. Выполним приложение и проверим полученный отчет.
3.10.5. Отчет типа «мастер/детальный»
Построим отчет «Список строек по заказчикам» из двух связанных таблиц заказчиков (мастер‑таблица или главная таблица) и строек (детальная или подчиненная таблица) (рис. 3.10.5.2).
1. Создадим новый проект из одной формы.
2.
Создадим вторую форму, используя шаблон для формирования отчета типа «мастер/детальный», выполнив команду File/New/Forms/Quick Report Master/Detail (рис. 3.10.5.1).
Рис. 3.10.5.1. Окно проектирования отчета QuickRep
3. Зададим свойства компоненту MasterTable (описание главной таблицы): DatabaseName=«stroiki», TableName=«zakazhiki.db», Active=True, IndexFieldName=Kz (код заказчика).
4. Зададим свойства компоненту DetailTable (подчиненная
таблица): DatabaseName=«stroiki», TableName=«stroiki.db», Active=True. IndexFieldName=Kz (код заказчика), MasterSource=MasterDS, IndexFieldsName=Kz,Ns (сортировка подчиненной таблицы), MasterFields=Kz (поле связи таблиц).
Рис. 3.10.5.2. Окно просмотра сформированного отчета Preview
5. Зададим свойства компоненту QuickRep1: Band (HasColumnHeader=True, HasDetail=True, HasPageHeader=True, HasSummary=True, HasPageFooter=False, HasTitle=False), DataSet=MasterTable.
6. Разместим в полосе Detail компонент QRDBText для вывода поля Nz (наименование заказчика) из главной таблицы заказчиков со свойствами DataSet=MasterTable, DadaField=Nz. Для того чтобы не выводить наименование заказчика, если у него нет строек, составим обработчик события BeforePrint для данной полосы:
Procedure TQRMDForm.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean); Begin Printband:=DetailTable.RecordCount>0 end.
Внимание! При выполнении команды Preview, в отличие от одноименного метода, условия вывода групп отчета игнорируются.
7. Разместим в полосе Sub Detail компоненты QRExpr для вывода из подчиненной таблицы (DetailTable) строек полей Ns (наименование стройки), Ss (смета), Fs (освоенная сумма).
8. Для компонента QRSubDetail установим свойства: HasFooter=True, HasHeader=False (составного свойства Bands) и FooterBand=GroupFooterBand1. Появится полоса GroupFooterBand1 (подножие полосы QRSubDetail. На этой полосе разместим итоги (компоненты QRExpr) по текущему заказчику со свойствами: ResetAfterPrint=True, Master= QRSubDetail1.
9. На полосе Summary разместим итоги (компоненты QRExpr) по всему отчету со свойством Master= QRSubDetail1.
10. Разместим все остальные надписи и служебные поля.
11. На первой форме разместим кнопку Отчет с процедурой обработки события OnClick (вывода отчета):
Procedure TForm1.Button1Click(Sender: TObject);
Begin QRMDForm.QuickRep1.Preview;{формирование отчета} End;
12. Выполним приложение и проверим отчет (рис. 3.10.5.2).
Составной отчет
Для физического объединения нескольких небольших отчетов в один составной отчет (например, с целью экономии бумаги) необходимо:
1. Отдельно подготовить объединяемые отчеты.
2. Разместить на форме компонент QRCompositeReport и подготовить для него обработчик события OnAddReport, например:
procedure TForm1.QRCompositeReport1AddReports(Sender: TObject);Begin QRCompositeReport1.Reports.Add(Form2.QuickRep1);
QRCompositeReport1.Reports.Add(Form3.QuickRep1); End;
Свойство Report содержит список отчетов, дополняемый методом Add.
3. Подготовить кнопку или пункт меню для вызова составного отчета методом Preview (QRCompositeReport1.Preview).
Отчеты будут выводиться в порядке их описания в обработчике события OnAddReport.
Дата добавления: 2016-03-22; просмотров: 736;