Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв ВУМИП 2012-07-06.doc
Скачиваний:
66
Добавлен:
13.05.2015
Размер:
9.35 Mб
Скачать

3.10.3. Простой отчет

Простой отчет формируется из одного набора данных без группировки данных. Рассмотрим порядок его формирования на примере справочника заказчиков (рис. 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(панельDataAccess) под именем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задает вывод соответствующих полос отчетаPageHeader(заголовок листа),ColumnHeader(заголовки колонок),Detail(детальная полоса),Summary(итоги по отчету).

Разместим компоненты QRExprв детальной полосе для вывода значений полей (значения свойствExpression):Ns(наименование стройки),Ss(сметная стоимость),Fs(фактически освоенная сумма) и значения выра­женияSs-Fs(неосвоенная сумма). Для числовых полей укажем свойствоAlignment=taRightJustify(выравнивание справа). Проверьте отчет, выпол­нив командуPreviewиз контекстного меню компонентаQuickRep1. Если отчет пуcтой, то проверьте значение свойстваActiveдля компонен­та Query1: оно должно быть истинным (True).

В полосе ColumnHeaderсформируем заголовки колонок. Каждый заголовок формируется отдельным компонентомQRLabel.

В полосе PageHeaderразместим наименование отчета (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. Выполним приложение и проверим полученный отчет.