Створення звітів у Borland
Для створення звітів у C++ Builder використовується сторінка QReport на панелі компонентів. Цей набір компонентів дозволяє проектувати звіти з таблиць, запитів, списків, текстових файлів, масивів, використовуючи дизайнер форм C++ Builder.
У комплект поставки C++ Builder входять три шаблони звітів, що містяться на сторінці Forms репозитарію об'єктів:
| QuickReport Mailing Labels | Шаблон для створення поштових етикеток |
| QuickReport List | Шаблон для створення простого табличного звіту |
| QuickReport Master/detail | Шаблон до створення звіту Master/Detail. |
Створення простого звіту
Звіти QuickReport базуються на наборі горизонтальних смуг (bands). При побудові звіту форму поміщаються кілька компонентів QRBand (спадкоємець TPanel) різних типів.
Для створення найпростішого звіту розмістимо на формі такі компоненти (рис. 1):
- TQRBand - компонент, що є частиною звіту - контейнер для розміщення даних (наприклад, заголовок звіту, верхній або нижній колонтитул сторінки, верхній або нижній колонтитул групи та ін.). Компоненти TQRBі друкуються в залежності від їх типу в необхідних місцях звіту, незалежно від їх взаємного розташування на формі. Найчастіше використовується властивість цього компонента &ndandash BandType, тип "смуги" (колонтитул сторінки або групи, "смуга" даних та ін). Можливі значення: rbTitle - заголовок звіту, rbPageHeader - верхній колонтитул сторінки, rbColumnHeader - верхній колонтитул колонки в багатоколоночному звіті, rbDetail - смуга з табличними даними (повторюється стількиосновою звіту), rbPageFooter &ndash нижній колонтитул сторінки, rbOverlay &ndash фон сторінки, друкується в лівому верхньому куті кожної сторінки, rbGroupHeader &ndash заголовок групи, rbSubDetail & oter &ndash нижній колонтитул групи, rbSummary &ndash друкується в кінці звіту). Властивості BandType створеного нами компонента надамо значення rbTitle
- TQuickReport (цей компонент відповідає за перетворення форми на звіт).
- TQRLabel, поміщений на QRBand1 (цей компонент призначений для виведення статичного тексту, та його властивості Caption можна присвоїти значення, що дорівнює тексту заголовка майбутнього звіту).

Мал. 1. Створення заголовка звіту
Для модифікації звіту слід змінити властивість BandType компонента QRBand1 на rbDetail і додати форму компонент TTable. Далі потрібно встановити його властивість DataBase рівним імені псевдоніма, наприклад, BCDEMOS, властивість TableName рівним імені таблиці, наприклад, CUSTOMER.DB, а потім властивість Active рівним true. Після цього потрібно додати форму компонент TDataSource і встановити його властивість DataSet рівним імені доданого раніше компонента Table1, а потім встановити властивість DataSource компонента QuickReport рівним імені створеного компонента DataSource1. Після цього можна додати компонент TQRDBText на QRBand1 (цей компонент призначений для виведення вмісту полів таблиці або запиту, що є джерелом даних проектованого звіту), встановити властивість DataSource рівним імені створеного раніше компонента DataSource1 і вибрати потрібне поле як значення властивості DataField. Якщо потрібно, можна додати інші компоненти TQRDBText і вибрати інші полятаблиці для відображення у звіті (рис. 2).

Мал. 2. Модифікація табличного звіту
Якщо тепер з контекстного меню QuickReport вибрати опцію Preview Report, можна побачити модифікований табличний звіт.
Тепер спробуємо створити звіт із заголовком звіту та колонтитулами. Для цього потрібно використовувати під час створення звіту кілька різних компонентів TQRBand.
Для створення звіту із заголовком і колонтитулами слід створити нову форму, розмістити чотири компоненти TQRBand на формі (вони отримають за замовчуванням імена QRBand2. QRBand5) і встановити їх властивості BandType рівними відповідно rbTitle, rbColumnHeading, rbDetail і rbPageFoo Далі слід додати на форму компонент TTable і встановити його властивість DatabaseName рівним BCDEMOS, властивість TableName рівним Customer, а потім властивість Active рівним true. Потім потрібно додати на форму компонент TDataSource і встановити в його властивості DataSet ім'я доданого раніше компонента Table1 і встановити властивість DataSource компонент QuickReport рівним імені створеного компонента DataSource1. Потім слід додати кілька компонентів TQRLabel як заголовок звіту і стовпців поверх відповідних компонентів TQRBand, надавши необхідні значення властивості Caption кожного з них.
Потім слід розмістити три компоненти QRDBText на компонент QRBand з властивістю BandType, що дорівнює DetailBand і встановити їх властивості DataSource рівними DataSource1, а властивості DataField рівними Company, Phone і Fax. Нарешті, для відображення номера сторінки потрібно помістити компонент TQRSysData (цей компонент призначений для виведення відомостей, які не залежать від вмісту даних, таких як номер сторінки, дата, час та ін.) компонент TQRBand з властивістю BandType,рівним rbPageFooter і встановити його властивість Data рівним qrcPageNumber, а властивість Text дорівнює &ldquoСтор. &ldquo
Після цього форма виглядатиме, як на рис. 3.

Мал.3. Звіт із заголовком та колонтитулами
Створення звітів "master-detail"
Перетворимо створений звіт на звіт "master-detail". Для цього слід додати компонент TTable, встановити його властивість DatabaseName рівним BCDEMOS, властивість TableName рівним ORDERS.DB, а потім встановити властивість Active рівним true. Після цього встановимо властивість MasterSource, що дорівнює DataSource1. Потім виберемо властивість MasterFields, викликавши діалогову панель для встановлення зв'язку master/detail (рис. 4) та зі списку доступних індексів виберемо CustNo. Потім виділимо ім'я поля CustNo в обох списках полів та натиснемо кнопку Add, а кнопку OK.

Мал. 4. Встановлення зв'язку master/detail
Додамо на форму компонент TDataSource, встановивши його властивість DataSet рівним Table2. Потім додамо до форми новий компонент TQRBand (з ім'ям QRBand6). Після цього додамо компонент TQRDetailLink, призначений для встановлення зв'язків між джерелами даних у звітах, та встановимо його властивість DataSource рівним DataSource2. Потім встановимо його властивість Master рівним QuickReport, а властивість DetailBand дорівнює QRBand6. Властивість BandType компонента QRBand6 автоматично набуде значення rbSubDetail.
Нарешті, помістимо два компоненти TQRDBText на QRBand6, встановимо їх властивості DataSource рівними DataSource2, а властивості DataField рівними OrderNo і AmountPaid. Зліва від них помістимо два компоненти TQRLabel із назвами цих полів (рис. 5).

Мал. 5. Форма звіту "master-detail".

Мал. 6. Звіт "master-detail".
Зазначимо, що якщо компонент QuickReport не пов'язаний із компонентом DataSource, то під час друку звіту виводиться лише один запис із набору даних, що легко дозволяє друкувати поточний запис.
Відображення графічних та мемо-полів у звітах
QuickReport дозволяє створювати звіти за допомогою будь-яких типів даних. Якщо замість визначення DataSource створити обробник події OnNeedData, можна за допомогою QuickReport надрукувати будь-які дані, змінюючи властивості компонентів TQRLabel, що у багатьох випадках використовується для друку довільної інформації (яка іноді не має відношення до баз даних).
QuickReport не має власного компонента для відображення графічних полів. Натомість можна використовувати стандартні компоненти Timage або TDBImage (рис. 7).

Мал. 7. Використання TDBImage для відображення графічних полів
Слід зазначити, що графічні поля баз даних може друкувати далеко ще не всякий професійний генератор звітів. Наприклад, ReportSmith, що входить у комплект поставки ряду продуктів Borland, може друкувати графічні зображення, які мають безпосереднього відношення до даних (наприклад, взяті з файлів формату *.bmp), але не графічні поля таблиць.

Мал. 7. У лівій нижній частині цього звіту компонент TQRDBText відображає memo-поле

Мал. 8. А ось так виглядають memo-поля у звіті
Якщо таких memo-полів кілька і вони повинні бути розміщені один під одним, можна використовувати кілька компонентів TQRBі одного типу для одного запису. У цьому випадку друкуватимуться вони в порядку їх створення.
Крім того, потрібно внести прототип функції ShowPreview() у відповідний h-файл: