Разработка баз данных в Delphi (рок11)

Посмотреть архив целиком

32


С
оздание баз данных в Delphi

Урок 11: Генерация отчетов

Содержание

Содержание 1

1. Компоненты для построения отчетов 2

2. Компонент TQuickRep 3

Свойства 4

Методы 6

События 8

3. Компонент TQRBand 8

4. Создание простейшего отчета 10

5. Использование компонента TQREXPR 13

6. Использование TQRBand для представления заголовков столбцов 16

7. Использование TQRBand для показа заголовка и подвала страницы. 16

8. Использование компонента TQRSysData 17

9. Группировки данных 18

10. Множественная группировка данных 21

11. Построение отчета главный-детальный 22

12. Построение композитного отчета 25


    1. Компоненты для построения отчетов

На странице палитры компонентов QReport расположено более двух десятков компонентов, применяемых для построения отчетов.

Центральным компонентом является TQuickRep, определяющий поведение отчета в целом. С помощью других компонентов создаются составные части отчета.

TQRBand заготовка для расположения данных, заголовков, титула отчета и др. Отчет, в основном, строится из компонентов TQRBand, которые реализуют:

  • область заголовка отчета;

  • область заголовка страницы;

  • область заголовка группы;

  • область названий столбцов отчета;

  • область детальных данных, предназначенную для отображения данных самого нижнего уровня детализации;

  • область подвала группы;

  • область подвала страницы;

  • область подвала отчета.

TQRStringsBand имеет то же назначение, что и TQRBand. Отличается встроенным списком строк Items, содержимое которого становится видным в режиме печати и предварительного просмотра, если на компонент TQRStringsBand положен компонент TQRExpr. Для каждой строки в Items выводится своя полоса TQRStringsBand.

TQRSubDetail дочерняя полоса. Привязывается к родительской полосе и служит для ее расширения. Любая полоса может стать родительской с помощью установки значения True в ее свойство HasChild.

TQRGroupприменяется для группировок данных в отчетах.

TQRLabelпозволяет разместить в отчете произвольную текстовую строку.

TQRDBText служит для вывода в отчет содержимого текстового поля набора данных.

TQRExpr – применяется для вывода значений, являющихся результатом вычислений выражений. Алгоритм вычисления выражений строится при помощи редактора формул данного компонента.

TQRSysDataслужит для вывода в отчете системной величины: даты, времени, номера страницы и т.п.

TQRMemo вставляет в отчет многостраничный текст.

TQRExprMemo – используется для создания многострочных вычисляемых полей.

TQRRichText вставляет в отчет многострочный текст в формате RTF.

TQRDBRichText служит для вывода в отчете полей НД, содержащих многострочный текст в формате RTF.

TQRShape служит для вывода в отчете графических фигур, например, прямоугольников.

TQRImage служит для вывода в отчете графической информации, источником которой является поле набора данных.

TQRPreview базовый компонент для создания нестандартных окон предварительного просмотра. Стандартное окно реализуется с помощью метода Preview компонента TQuickRep.

TQRXXXFilter фильтрующие компоненты для преобразования отчета в текст, страницу HTML и т.п. при печати отчета.

TQRChart служит для встраивания в отчет графиков.


    1. Компонент TQuickRep

При размещении этого компонента на форме в ней появляется сетка отчета (рис.1). В дальнейшем в этой сетке располагаются составные части отчета, например, полосы TQRBand (рис.2).


Рис. 1. Пустая сетка отчета. Образуется после размещения на форме компонента TQuickRep.


Рис. 2. Сетка отчета с размещенными в ней компонентами отчета.


Перечислим важнейшие свойства, методы и события компонента TQuickRep.


Свойства

Свойство

Назначение

property Bands: TQuickRepBands;

Объект Bands содержит логические свойства, которые после установки в них значений True включают в отчет: HasColumnHeader заголовки столбцов; HasDetail детальную информацию; HasPageFooter – подвал страницы; HasPageHeader заголовок страницы; HasSummary подвал отчета; HasTitle заголовок отчета.

property Dataset: TDataSet;

Указывает набор данных на основе которого создается отчет. Если нужно вывести связанную информацию из нескольких таблиц БД, ее объединяют в одном НД при помощи компонента TQuery. Информацию из нескольких связанных НД можно включать в отчет, если эти НД связаны в приложении отношением главный-подчиненный. В этом случае в качестве НД отчета указывается главный набор, а ссылка на соответствующие подчиненные наборы осуществляется в компонентах TQRSubDetail. Если в отчет нужно включить информацию из несвязанных НД, применяется композитный отчет, то есть отчет, составленный из группы других отчетов.

property Frame: TQRFrame;

Определяет параметры рамки отчета: Color – цвет линий; DrawBottom наличие линии снизу; DrawLeft наличие линии слева; DrawRight наличие линии справа; DrawTop наличие линии сверху; Style стиль линии (сплошная, пунктирная и т.п.); Width толщина линии в пикселях.

property Options: TQuickReportOptions;

Содержит множество из следующих логических значений: HasFirstHeader разрешает печатать заголовок первой страницы; HasLastFooter разрешает печатать подвал последней страницы; Compression разрешает сжимать отчет при выводе его в метафайл.

property Page: TQRPage;

Определяет параметры страницы отчета. Все подсвойства этого сложного свойства доступны в окне Report Setting (см. ниже группы Page size и Margin окна редактора свойств).

property PrintIfEmpty: boolean;

Разрешает/запрещает печатать отчет в том случае если он не содержит данных.

property ReportTitle: String;

Имя отчета (не его заголовок !). Используется для идентификации отчета в задании на сетевую печать, возвращается компонентом QRSysData при Data = ReportTitle и может использоваться для набора одного из нескольких доступных отчетов.

property ShowProgress: boolean;

Разрешает/запрещает показывать индикатор процесса печати отчета.

property SnapToGrid: boolean;

Если содержит True, размещаемые в отчете компоненты привязываются к сетке отчета.

type TQRUnits = (Inches, MM, Pixels, Native, Characters);

property Units: TQRUnits;

Определяет единицы измерения расстояний в отчете: Inches – дюймы; MM – миллиметры; Pixels пиксели; Native внутренние единицы TQuickRep (равны 0,1 мм); Characters символы текста.

property Zoom: Integer;

Определяет масштаб отображения отчета (в процентах от его размеров на листе бумаги) на этапе разработки. Может иметь значение в диапазоне 1..300. Значение свойства не учитывается при печати отчета или в режиме его предварительного показа.


Многие свойства отчета можно установить на этапе конструирования с помощью редактора свойств – вызовите локальное меню компонента TQuickRep и выберите опцию Report Settings.

Рис. 3. Окно установки параметров отчета.


Группа Paper size задает характеристики страницы: ее формат (A4 210 x 270 mm), ширину (Width), длину (Length) и направление печати – вдоль короткой стороны листа (Portait) или вдоль длинной (Landscape).

Группа элементов Margin указывает поля отчета: сверху (Top), снизу (Bottom), слева (Left), справа (Right), а также количество колонок (Number of columns) и расстояние между ними (Column Space).

С помощью элементов группы Other можно задать шрифт (Font), его высоту (Size) и используемые единицы измерения длины (Units).

Группа Page frame определяет свойства рамки: наличие линии сверху (Top), снизу (Bottom), слева (Left), справа (Right), цвет линий (Color) и их толщину (Width).

Группа Bands определяет наличие полос заголовков и подвалов (Page header – заголовок страницы; Title – заголовок отчета; Column header – заголовок колонок; Detail bandполоса для детальной информации; Page footer – подвал страницы; Summaryподвал отчета), а также высоту соответствующей полосы (строка Length справа от переключателя выбора). После выбора типа и высоты полосы она появляется в отчете, если окно закрыто кнопкой OK или была нажата кнопка Applay. Элементы Print first page header и Print last page footer управляют соответственно печатью заголовка на первой странице и подвала на его последней странице.


Методы

Метод

Назначение

procedure NewColumn;

Реализует вывод информации в следующей колонке отчета, а если определена единственная колонка, – в его следующей странице.

procedure NewPage;

Реализует вывод информации в следующей странице отчета.

procedure Prepare;

Готовит отчет для вывода в файл (см. ниже примечание 1).

procedure Preview;

Выводит стандартное окно предварительного просмотра (см. ниже примечание 2).

procedure Print;

Печатает отчет на принтере.

procedure PrintBackGround;

Инициирует печать отчета в фоновом режиме (в отдельном потоке команд). После завершения печати вызывается обработчик события OnAfterPrint.

procedure PrinterSetup;

Вызывает стандартное окно установки параметров принтера.

Примечание 1.

Для вывода отчета в файл нужно сначала подготовить его с помощью обращения к методу Prepare, затем сохранить в файле методом Save объекта TQuickRep.QRPrinter, после чего уничтожить этот объект и поместить NIL в свойстве TQuickRep.QRPrinter:


MyReport.Prepare;

MyReport.QRPrinter.Save(‘REport.QRP’);

MyReport.QRPrinter.Free;

MyReport.QRPrinter := NIL;


Примечание 2.

Стандартное окно предварительного просмотра показано на рис. 4.

Рис. 4. Окно предварительного просмотра отчета.


Чтобы на этапе конструирования просмотреть в окне предварительного просмотра содержимое отчета в том виде, как он будет выводиться на печать, нужно выбрать опцию Preview во вспомогательном меню компонента QuickRep. Следует заметить, что при этом не будут видны некоторые данные, например значения вычисляемых полей. Они будут выводиться только во время выполнения.

Назначение инструментальных кнопок окна:

Масштабирует отчет так, чтобы его страница полностью показывалась в окне.

Отображает отчет в масштабе 1:1.

Масштабирует отчет так, чтобы ширина страницы отчета соответствовала ширине окна.

Показывает первую (последнюю) страницу отчета.

Показывает предыдущую (следующую) страницу отчета.

Вызывает стандартное окно настройки принтера (печатает отчет).

Сохраняет отчет в файле (загружает отчет из файла).


События

Событие

Назначение

property AfterPreview : TQRAfterPreviewPrint;

Возникает в момент закрытия окна предварительного просмотра отчета.

property AfterPrint: TQRAfterPrintEvent;

Наступает после печати отчета или его подготовки к печати.

property BeforePrint: TQRBeforePrintEvent;

Наступает в момент начала генерации отчета (до выдачи окна предварительного просмотра отчета или до его печати).

property OnEndPage: procedure (Sender: TObject);

Возникает в момент подготовки к генерации последней страницы отчета.

property OnNeedData: procedure (Sender: TObject; var MoreData: boolean);

Используется при создании отчета по данным, которые берутся не из НД, а из текстового файла, списка строк, массива и т.п. В параметре MoreData обработчик должен вернуть True, если источник данных еще не исчерпан.

property OnPreview: procedure (Sender: TObject);

Используется для связывания с отчетом нестандартного окна просмотра (см. ниже).

property OnStartPage: procedure (Sender: TObject);

Возникает в момент подготовки к генерации первой страницы отчета.


С помощью компонента QRPreview программист может создать нестандартное окно предварительного просмотра. Для связи с отчетом используется событие OnPreview по следующей схеме:


Procedure RepForm.MyREportOnPreviewEvent(Sender: TObject);

begin

MyPrevForm.QRPreview1.QRPrinter := TQRPrinter(Sender);

MyPreviewForm.Show;

end;


Чтобы явное приведение типа TQRPrinter(Sender) стало возможным, необходима ссылка на модуль QRPrntr в предложении Uses соответствующего модуля (в примере – модуля RepForm).


    1. Компонент TQRBand

Компоненты TQRBand являются основными частями отчета и используются для размещения на них отображающих компонентов, таких как TQRLabel, TQRDBText, TQRImage и т.п.


Свойства компонента:

Свойство

Назначение

property AlignToBottom: boolean;

Если имеет значение True полоса печатается непосредственно над подвалом страницы вместо обычного расположения справа/снизу от предыдущей полосы.

type TQRBandType = (rbTitle, rbPageHeader, rbDetail, rbPageFooter, rbSummary, rbGroupHeader, rbGroupFooter, rbSubDetail, rbColumnHeader);

property BandType: TQRBandType;

Указывает назначение полосы: rbTitle – содержит заголовок отчета; rbPageHeader – содержит заголовок страницы (на первой странице печатается под rbTitle); rbDetaul – содержит информацию из НД; выводится всякий раз при переходе на новую запись НД; эта полоса повторяется для всех записей DataSet, начиная с первой записи и заканчивая последней; позицирование на первую запись и последовательный их перебор осуществляется компонентом TQuickRep автоматически; rbPageFooter – содержит подвал страницы; выводится в конце каждой страницы отчета после всех других полос; rbSummary – подвал отчета; выводится на последней странице отчета после всей иной информации, но перед подвалом последней страницы; rbGroupHeader – содержит заголовок группы; применяется при группировках информации в отчете и выводится всякий раз при выводе новой группы; rbGroupFooter – содержит подвал группы; выводится всякий раз при окончании вывода группы, после всех данных группы; rbSubDetail – содержит детальную информацию из подчиненного НД при выводе в отчете информации из двух или более наборов данных, связанных в приложении как главный-подчиненный; этот тип назначается полосе автоматически при размещении на форме компонента TQRSubDetail; rbColumnHeader – содержит заголовки столбцов; размещается на каждой странице отчета после заголовка страницы.

property Enabled: boolean;

Разрешает/запрещает печать полосы.

property ForceNewColumn: boolean;

Если содержит True, полоса печатается в следующей колонке.

property ForceNewPage: boolean;

Если содержит True, полоса печатается на новой странице.

property HasChild: boolean;

Если содержит True, полоса имеет дочернюю полосу TChildBand. Установка True в это свойство автоматически создает в отчете дочернюю полосу.


События


property AfterPrint: TQRAfterPrintEvent;


и


property BeforePrint: TQRBeforePrintEvent;


наступают соответственно до и после печати полосы. Метод


function AddPrintable(PrintableClass: TQRNewComponentClass): TQRPrintable;



используется для вставки в полосу отображающего компонента в процессе прогона программы. Он автоматически устанавливает между полосами отношение собственности. Два следующих фрагмента выполняют одинаковую работу:

with DetailBand1.AddPrintable(TQRLabel) do

begin

Size.Left := 20;

Size.Top := 5;

Caption := ‘Новая полоса’;

end;


var

aLabel : TQRLabel;

begin

aLabel := TQRLabel.Create(ReportForm);

aLabel.Parent := DetailBand1;

with aLabel do

begin

Size.Left := 20;

Size.Top := 5;

Caption := ‘Новая полоса’;

end;

end;


    1. Создание простейшего отчета

Компоненты TQuickRep и TQRBand являются минимально достаточными для создания простейшего отчета, не содержащего внутри себя группировок информации.

Пусть имеется таблица БД Rashod.DB, содержащая сведения об отпуске материалов со склада. В состав ТБД входят поля

  • N_RASH уникальный номер события отпуска товара;

  • DEN – номер дня;

  • MES – номер месяца;

  • GOD – номер года;

  • TOVAR – наименование отпущенного товара;

  • POKUP – наименование покупателя;

  • KOLVO количество единиц отпущенного товара.

Заметим, что дата отпуска товара хранится в разбивке на день, год и месяц. Сделано так специально, с целью показать, как в отчетах используются выражения и вычисляемые поля.

Создадим простейший отчет, состоящий из заголовка и сведений об отпуске товара. В отчет включаются все факты отпуска товара. Сортировка производится по номеру события отпуска товара. Для этого разместим на форме компонент TTable, свяжем его с таблицей Rashod.DB и откроем (Active = True). Разместим на форме компонент TQuickRep. Поместим в его свойство DataSet значение Table1, назначив таким образом отчету НД, записи которого будут выводиться в отчете. Добавим в отчет компонент TQRBand. В его свойство BandType компонента QRBand1 по умолчанию будет установлено значение rbTitle, то есть компонент QRBand1 определяет заголовок отчета Разместим на QRBand1 компонент TQRLabel. Установим в свойство Caption этого компонента значение Отпуск товаров со склада и выберем в свойстве Font жирный наклонный шрифт высотой 16 пунктов. Вид формы отчета к этому моменту показан на рис.5.

Рис. 5. В отчете определен только его заголовок.


Теперь разместим в отчете данные, соответствующие текущей записи таблицы Rashod. Для этого поместим в отчет новый компонент TQRBand (имя QRBand2) и установим в его свойство BandType значение rbDetail. Затем разместим на полосе QRBand2 шесть компонентов TQRDBText. Свяжем эти компоненты с полями НД – N_RASH, TOVAR, KOLVO, DEN, MES, GOD. Для этого в свойство DataSet каждого компонента QRDBText установим значение Table1, а в свойство DataField имя соответствующего поля. Вид отчета к этому моменту показан на рис.6.


Рис. 6. Отчет с заголовком и группой детальной информации.


Для просмотра получившегося отчета щелкнем по нему правой кнопкой мыши и из всплывающего меню выберем элемент Preview. Окно предварительного просмотра отчета показано на рис. 7.


Рис. 7. Содержимое отчета в окне предварительного просмотра.


Чтобы окно предварительного просмотра открывалось при активизации формы, создадим такой обработчик события OnActivate формы:


procedure TForm1.FormActivate(Sender: TObject);

begin

QuickRep1.Preview;

end;


а чтобы после выхода из окна предварительного просмотра закрывалась бы форма, на которой расположен текст, используем такой обработчик события AfterPreview:


procedure TForm1.QuickRep1AfterPreview(Sender: TObject);

begin

Form1.Close;

end;



    1. Использование компонента TQREXPR

Из рис.7 видно, что в простейшем отчете выводится дата, составленная из трех полей – DEN, MES, GOD. Объединим значения из этих полей в одно значение, являющееся результатом вычисления выражения. Выражение в отчетах формируется при помощи компонента TQRExpr. Удалим из компонента QRBand2 компоненты QRDBText4, QRDBText5 и QRDBText6, связанные с полями DEN, MES, GOD. Вместо них разместим в отчете компонент TQRExpr (имя QRExpr1).

Выражения в TQRExpr формируются с помощью специального редактора, который вызывается в окне инспектора объектов кнопкой в поле данных свойства Expression этого компонента (рис.8).


Рис. 8. Окно редактора формул компонента TQRExpr.


В поле Enter expression можно ввести или отредактировать выражение, которое обычно состоит из имен полей НД, преобразующих функций и переменных, связанных операциями отношения. Имена полей НД добавляются в текущее положение курсора (поле Enter expression) с помощью вспомогательного окна, связанного с кнопкой Function, а переменные – с кнопкой Variable.

Нажмите кнопку Function, в левом окне выберите категорию Other (другие) и функцию STR в правом окне – эта функция преобразует числовое значение в строковое. Нажмите Continue, чтобы перейти к вводу параметров (рис.9). Надпись над строкой ввода окна Expression Wizard напоминает о том, что выбранная нами функция имеет один числовой параметр.


Рис. 9. Формирование части выражения.


Для его ввода нажмите кнопку справа от строки ввода – на экране вновь появится начальное окно редактора формул. Поскольку мы хотим преобразовать в строку номер дня, нажмите кнопку Database field и выберите поле DEN в списке полей таблицы Table1. Нажмите OK, чтобы завершить ввод параметра. В поле Enter expression будет сформирована часть формулы – STR(Table1.DEN). На панели Insert at cursor position нажмем кнопку «+» и вручную введем разделитель ‘.’ (рис.10).


Рис. 10. Создание части формулы выражения.


Продолжите формировать выражение так, чтобы в конце концов оно приобрело такой вид:

STR(Table1.DEN) + ‘.’ + STR(Table1.MES) + ‘.’ + STR(Table1.GOD)

(возможно проще ввести его вручную). Затем нажмите кнопку OK, чтобы закрыть окно редактора формул. С помощью Инспектора объектов установите в свойство AutoSize компонента QRExpr1 значение False, измените размеры компонента так, чтобы он мог отображать примерно 10 символов, и установите выравнивание вправо (свойство Alignment = taRightJustify). Запустите режим предварительного просмотра содержимого отчета (рис.11). Как видим, дата отпуска товара приобрела более привычный вид.


Рис. 11. Результат вычисления выражения появился в отчете.


Замечание.

Другим способом составления значения даты из трех полей могло бы быть создание вычисляемого поля (например, SumData) и определение алгоритма вычисления его значения в таком обработчике события OnCalcFields:


procedure TForm1.TableCalcFields(DataSet: TDataSet);

begin

Table1SumData.Value := Table1DEN.AsString + ‘.’ +

Table1MES.AsString + ‘.’ + Table1GOD.AsString;

end;



    1. Использование TQRBand для представления заголовков столбцов

Компонент TQRBand, у которого в свойство BandType установлено значение rbColumnHeader, используется для размещения заголовков столбцов. Собственно заголовки столбцов формируются при помощи компонентов TQRLabel.

В рассмотренном в предыдущих разделах отчете разместим компонент TQRBand (имя QRBand3) и установим в свойства Caption этих компонентов соответственно значения №№, Товар, Количество, Дата. В свойствах Font компонентов выберем наклонный и подчеркнутый шрифт. Вызовем окно предварительного просмотра отчета – для каждой страницы отчета теперь будут выводиться названия столбцов (рис.12).


Рис.12. В отчете появились заголовки столбцов.


    1. Использование TQRBand для показа заголовка и подвала страницы.

Компонент TQRBand, у которого в свойство BandType установлено значение rbPageHeader, используется для показа заголовка страницы, а если это свойство установлено в rbPageFooter, – для показа подвала страницы. Заголовок выводится в начале каждой страницы, а подвал – в ее конце. Информация в заголовке и подвале страницы может формироваться на основе статического текста (компоненты TQRLabel), значений полей (компоненты TQRDBText) и результатов вычислений выражений (компоненты TQRExpr).

Вернувшись к предыдущему примеру, разместим в отчете компонент TQRBand (имя QRBand4) и установим в его свойство BandType значение rbPageHeader. Не будем размещать в заголовке никакого текста, просто отчеркнем линию вверху страницы. Для этого установим в свойство компонента страницы Frame.DrawTop значение True, что обеспечивает вывод линии по верхнему краю области, занимаемой компонентом. Аналогичным образом определим в отчете компонент подвала страницы (имя QRBand5) и установим в его свойство Frame.DrawBottom значение True, что обеспечивает вывод линии по нижнему краю области, занимаемой компонентом.

Войдя в режим предварительного просмотра, увидим, что вверху и внизу каждой страницы отчета выводятся линии.


    1. Использование компонента TQRSysData

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


property Data: TQRSysDataType;


Ниже указаны возможные значения этого свойства.

Значение

Что выводится

qrsColumnNo

Номер текущей колонки отчета (для одноколоночного отчета всегда 1).

qrsDate

Текущая дата.

qrsDateTime

Текущие дата и время.

qrsDetailCount

Количество записей в НД, а при использовании нескольких НД – количество записей в главном наборе. Для случая, когда НД представлен компонентом TQuery, эта возможность может быть недоступной, что связано с характером работы компонента TQuery, который возвращает столько записей, сколько необходимо для использования в текущий момент, а остальные предоставляет по мере надобности.

qrsDetailNo

Номер текущей записи в НД.

qrsPageNumber

Номер текущей страницы отчета.

qrsPageCount

Общее количество страниц отчета.

qrsReportTitle

Заголовок отчета.

qrsTime

Текущее время


Разместим в компоненте QRBand5 подвала отчета два компонента TQRSysData. В свойство Data первого из них установим значение qrsDate, второго – qrsPageNumber. В режиме предварительного просмотра увидим, что теперь в подвале страницы выводятся номер страницы и текущая дата (рис.13)


Рис. 13. Показ номера страницы и текущей даты в подвале страницы.


    1. Группировки данных

Для группировок информации используется компонент TQRGroup. Его свойство Expression указывает некоторое выражение, которое используется для группировки, иными словами, в группу входят записи, удовлетворяющие условию этого выражения. При смене выражения происходит смена группы.

Для каждой группы выводятся ее заголовок и подвал. В качестве заголовка группы используется компонент TQRBand со значением свойства BandType, равным rbColumnHeader, а в качестве подвала – со значением rbGroupFooter. Свойство FooterBand компонента TQRGroup должно содержать ссылку на компонент подвала группы. В заголовке группы, как правило, выводится группирующее выражение, а в подвале группы – агрегированная информация: суммарные, средние и т.п. значения по группе в целом.


Пример.

Построим отчет о расходе товара со склада, в котором информация группируется по наименованию товара. Для этого определим набор данных отчета (компонент TTable, имя Table1). Установим у НД текущим индекс по полю TOVAR (в свойстве FieldIndexNames или IndexName). Разместим в отчете:


  • заголовок отчета – компонент TQRBand с именем QRBand1, свойство BandType=rbTitle;

  • заголовок столбцов – компонент TQRBand с именем QRBand2, свойство BandType=rbColumnHeader;

  • группу – компонент TQRGroup с именем QRGroup1;

  • область детальной информации – TQRBand с именем QRBand3, свойство BandType=rbDetail;

  • подвал группы – TQRBand с именем QRBand4, свойство BandType=rbGroupFooter;

В компоненте QRGroup1 установим:

  • в свойство FooterBand значение QRBand4;

  • в свойство Expression значение Table1.TOVAR, которое является формулой и строится в редакторе формул.


Поскольку свойство Expression не визуализирует значения выражения, необходимо разместить в группе компонент TQRExpr (имя QRExpr1) и определить значение его свойства Expression так, чтобы оно содержало Table1.TOVAR.

В компоненте подвала группы QRBand4 будем подсчитывать сумму по полю KOLVO (сумму отпущенного конкретного товара). Для этого разместим в подвале группы компонент TQRExpr (имя QRExpr2) и определить значение его свойства Expression так, чтобы оно содержало формулу SUM(Table1.TOVAR).

В группе детальной информации разместим компоненты TQRDBText, связанные с полями Pokup и Kolvo. Заполним области отчета статическим текстом, как это показано на рис.14.


Рис. 14. Макет отчета с группировкой по товару.


Рис. 15. Отчет с группировкой по товару в окне предварительного прсмотра.


    1. Множественная группировка данных

Часто внутри группы должны содержаться другие группы, например, по названию товара и внутри каждой группы – по покупателям. В этом случае внутри одной группы определяют другую посредством дополнительных компонентов TQRGroup.

Пусть требуется представить в отчете сведения о расходе товаров со склада группируя данные по товарам, а внутри группы – по покупателям. Установим текущий индекс по полям TOVAR, POKUP. Общий вид отчета на этапе разработки приводится на рис.17, а в окне предварительного просмотра – на рис.18.


Рис.17. Макет отчета с вложенными группами.


Рис. 18. Отчет с вложенными группами.


    1. Построение отчета главный-детальный

Если необходимо построить отчет на основе более чем одной ТБД, можно поступить двумя способами:

  1. с помощью компонента TQuery произвести соединение данных из нескольких таблиц БД в один НД, после чего определить в отчете нужные группировки;

  2. создать в приложении по одному НД на каждую таблицу, соединить эти наборы между собой связью главный-детальный (используя свойства MasterSource, MasterFields набора данных) и применить в отчете компонент (или несколько компонентов) TQRSubDetail для вывода информации из детального НД (или группы детальных НД); для вывода информации из главного НД, как и в обычных отчетах, применяется компонент TQRBand, у которого в свойстве BandType установлено значение rbDetail.

Построение отчета для первого случая осуществляется аналогично тому, как это описано выше. Построение отчета для второго случая имеет некоторые отличительные особенности. Рассмотрим второй способ.

Компонент TQRSubDetail предназначен для показа в отчете информации из детального НД. Его свойство


Property DataSet: TDataSet;


указывает имя детального НД, информация из которого будет выводиться в пространстве компонента TQRSubDetail. В остальном использование этого компонента аналогично использованию компонента TQRBand, у которого в свойство BandType установлено значение rbDetail.

Пусть имеется таблица БД TOVARY.DB, содержащая помимо прочих поле TOVAR (название товара). Пусть также имеется таблица БД RASHOD.DB, содержащая сведения об отпуске материалов со склада. В ее состав входят поля N_RASH (уникальный номер события отпуска товара), DEN (номер дня), MES (номер месяца), GOD (номер года), TOVAR (наименование отпущенного товара), POKUP (наименование покупателя) и KOLVO (количество единиц отпущенного товара).

Таблицы TOVARY.DB и RASHOD.DB находятся в отношении один-ко-многим, то есть одному товару может соответствовать более одного факта отпуска товара со склада.

Разместим на форме компонент TTable (им TovaryTable), ассоциированный с ТБД TOVARY.DB, и связанный с ним компонент TDataSource (имя DS_TovaryTable). Разместим также еще один компонент TTable (им RashodTable), ассоциированный с ТБД RASHOD.DB, и установим между НД связь главный-детальный. Для этого установим в свойство RashodTable.MasterSource значение DS_TovaryTable, а в свойство RashodTable.MasterFields значение TOVAR (рис.19).


Рис. 19. Установка связи главный-детальный.


Заметим, что после установления связей НД и НД RashodTable текущим индексом должен быть индекс по полю Tovar (свойство RashodTable.IndexFieldNames).

Приступим к разработке отчета. Определим заголовок отчета – компонент TQRBand с именем QRBand1, в свойство BandType которого установлено значение rbTitle. Установим в качестве основного НД отчета TovaryTable, указав QuickRep1.DataSet = TovaryTable. Разместим в отчете компонент TQRBand с именем QRBand2 и установим в его свойство BandType значение rbDetail. Этот компонент будет использоваться для отображения детальной информации из НД TovaryTable.

Разместим в отчете компонент TQRSubTetail (имя QRSubDetail). Установим в его свойство DataSet значение RashodTable, связав таким образом данный компонент с подчиненным НД. Разместим в области компонента QRSubDetail три компонента TQRDBText и свяжем их соответственно с полями Pokup, Kolvo и D НД RashodTable (поле D определено в НД RashodTable как вычисляемое по значениям полей DEN, MES, GOD). Разместим в области компонента QRBand2 заголовки столбцов.

Вид формы отчета показан на рис.20.


Рис. 20. Макет отчета, в котором показываются записи из связанных наборов данных.


В результирующем отчете (рис.21) для каждой записи НД TovaryTable выводятся подчиненные ей записи из НД RashodTable.


Рис. 21. Отчет, в котором показываются записи из связанных наборов данных.


Замечание.

Если необходимо определить заголовок и подвал для информации, группируемой в компоненте TQRSubDetail, следует воспользоваться свойством


property Bands: TQRSubDetailGroupBands;


этого компонента, которое имеет два логических подсвойства (HasHeader и HasFooter), указывающих на наличие или отсутствие соответственно заголовка и подвала.


    1. Построение композитного отчета

Композитный (составной, сложный) отчет объединяет в себе несколько простых отчетов. При печати композитного отчета, входящие в его состав простые отчеты печатаются друг за другом.

Композитный отчет реализуется при помощи компонента TQRCompositeReport. В его обработчике события OnAddReport ранее определенные простые отчеты добавляются в списковое свойство Report. Например, так:


property TCompositnyjOtchet.QRCompositeReport1AddReports(Sender: TObject);

begin

with QRCompositeReport1 do

begin

Reports.Add(ManyGroup.QuickRep1);

Reports.Add(Prostoj.QuickRep1);

end

end;


В этом примере композитный отчет составляется из двух отчетов: QuickRep1 (определенный в форме ManyGroup) и QuickRep1 (определенный в форме Prostoj). Почать композитного отчета или его предварительный просмотр осуществляется так же, как для простых отчетов, например


QRCompositeReport1.Preview;


На рис.22 показан композитный отчет, построенный из двух ранее разработанных нами отчетов – простейшего отчета и отчета с группировками данных.


Рис. 22. Композитный отчет, составленный из двух простых отчетов.



У
рок 11: Создание отчетов