Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Простой отчет формируется из одного набора данных без группировки данных. Рассмотрим порядок его формирования на примере справочника заказчиков (рис. 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. IndexField­Name=Kz (код заказчика), MasterSource=MasterDS, Index­FieldsName=Kz,Ns (сортировка подчиненной таблицы), MasterFields=Kz (по­ле связи таблиц).

Рис. 3.10.5.2. Окно просмотра сформированного отчета Preview

 

5. Зададим свойства компоненту QuickRep1: Band (HasColumn­Header=True, HasDetail=True, HasPageHeader=True, HasSummary=True, Has­Page­Footer=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).




Поделиться с друзьями:


Дата добавления: 2014-12-08; Просмотров: 611; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.