- •Урок 11: Генерация отчетов Содержание
- •Компоненты для построения отчетов
- •Компонент tQuickRep
- •Свойства
- •События
- •Компонент tqrBand
- •Создание простейшего отчета
- •Использование компонента tqrexpr
- •Использование tqrBand для представления заголовков столбцов
- •Использование tqrBand для показа заголовка и подвала страницы.
- •Использование компонента tqrSysData
- •Группировки данных
- •Множественная группировка данных
- •Построение отчета главный-детальный
- •Построение композитного отчета
Создание простейшего отчета
Компоненты 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;
Использование компонента 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;