Разработка отчета для выдачи выходных документов

Источником данных для получения выходного документа может быть таблица или запрос. Для выходного документа, связанного с информацией об учениках классов с выдачей среднего балла каждого класса, воспользуемся созданным ранее запросом QCl_pupil. В модуле данных должна быть пара TQuery – TDataSource для выходного документа.

Пункт меню главной формы Статистика успеваемости учеников свяжем с новой формой FReport,на которой будем выводить отчет. Поставим в соответствие этому пункту следующие действия:

procedure TMain.N9Click(Sender: TObject);

begin

DM.QCl_pupil.Open;//Открытие запроса

FReport.QuickRep1.Preview;//Отображение отчета

end;

Поместим на эту форму экземпляр компоненты QuickRep со страницы QReport и через свойство DataSetсвяжем ее с нужным запросом QCl_pupil. При размещении компоненты на форме в ней появляется сетка отчета, в которой в дальнейшем располагают составные части отчета.

Компонента QuickRepимеет ряд свойств.

Свойство Bandsсостоит из множества логических значений, которые определяют присутствие или отсутствие в отчете отдельных составляющих: HasColumnHeader – заголовка столбцов

HasDetail – детальной информации

HasPageFooter – заключительной части страницы

HasPageHeader – заголовка страницы

HasSummary – заключительной части отчета

HasTitle – заголовка отчета

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

Метод Previewвыводит отчет в окно предварительного просмотра.

Метод Printпечатает отчет на принтере.

После просмотра отчета, следует закрыть запрос. Для этого свяжем событие AfterPreview отчета QuickRep1 со следующим кодом:

procedure TFReport.QuickRep1AfterPreview(Sender: TObject);

begin

DM.QCl_pupil.Close;

end;

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

Если в отчете необходимо группировать данные при выводе, то следует поместить в отчет по одному экземпляру компоненты QRGroup на каждую группу. Свойство Expressionэтой компоненты позволяет выбрать выражение, при изменении которого выводится заголовок группы (его роль также играет компонента QRGroup). При щелчке по свойству появляется окно построителя выражения (рис. 106-108). В поле Enter Expression можно ввести или отредактировать выражение, которое обычно состоит из имен полей НД, преобразующих функций и переменных, связанных операциями отношения.

Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru

Рис. 106. Окно для построения выражения

Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru

Рис. 107. Выбор полей выражения

Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru Разработка отчета для выдачи выходных документов - student2.ru

Рис. 108. Выбор функций выражения

Для создания заключительной части группы на форму помещается экземпляр компоненты QRBand, свойство BandTypeкоторой полагается равным rbGroupFooter, а свойство FooterBand компоненты QRGroupвыбирается равным имени заключительной компоненты этой группы. Таким образом, можно создать несколько вложенных групп. После этого настраивается весь отчет.

Для отображения в разделах отчета полей следует поместить на них экземпляры компоненты QRLabel(статическое поле) с определением свойства Captionи QRDBText(поле НД). Для этой компоненты определяются свойства Dataset(имя запроса, формирующего НД, в примере DM.QCl_Pupil) и DataField(имя поля НД, например, FIO_pupil).

Вместо компоненты QRDBTextможно размещать компоненту QRExpr(выражение из полей НД) и определять его свойство Expressionаналогично тому, как это описано для компоненты QRGroup.

В заключительной части группы можно размещать выражения, содержащие итоговые (агрегатные) функции типа AVERAGE (среднее), COUNT (количество вхождений), SUM (сумма), MAX (максимальное значение), MIN (минимальное значение).

Итак, после размещения на форму компоненты QuickRep включим (положим равными True) следующие подсвойства в групповом свойстве Bands: HasColumnHeader, HasDetailи HasTitle (рис. 109). Также разместим по экземпляру компоненты QRGroup и QRBand, свойство BandType последнего установим равным rbGroupFooter, а свойство FooterBand компоненты QRGroupвыбирается равным имени заключительной компоненты этой группы (в нашем случае QRBand1).

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 109. Свойства отчета

После размещения на форме отчета различных составляющих отчет примет вид, подобный примеру, изображенному на рис. 110.

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 110. Состав отчета

Поместим заголовок отчета в область Title. Для этого воспользуемся компонентой QRLabel, в свойстве Caption которой введем «Успеваемость учеников школы».

В области Column Header размещаются заголовки столбцов. Разместим здесь компоненту QRLabel c текстом «Класс».

Свойство Expression области GroupHeader установим равным QTCl_pupil.NameClass (для этого можно воспользоваться построителем выражения). Свойство FooterBand должно содержать ссылку на компоненту подвала группы Group Footer(предварительно следует посмотреть ее имя в инспекторе объектов, щелкнув по области Group Footer). Поскольку свойство Expression не визуализирует значения выражения, необходимо разместить в группе Group Header компоненту TQRExpr и определить значение ее свойства Expression так, чтобы оно содержало QTCl_pupil.NameClass.

Также в области группы разместим два экземпляра компоненты QRLabelс текстом «ФИО ученика» и «Балл» соответственно.

В области детальной информации Detail разместим два экземпляра компоненты TQRDBText. Их свойство DataSet установим равным DM.QCl_pupil, а в качестве значения свойства DataField выберем FIO_pupil и Ball соответственно.

В подвале группы Group Footer разметим по экземпляру компонент QRLabel с текстом «Средний балл класса» и TQRExpr. В свойство Expression последней с помощью построителя выражения установим функцию подсчета среднего значения поля Ball: AVERAGE(QCl_pupil.Ball). Для сброса значения предыдущей группы (чтобы средний балл считался по каждому классу, а не накапливался по всем ученикам) следует у компоненты QRExpr свойство ResetAfterPrint установить равным True.

Отчет на этапе проектирования примет следующий вид (рис. 111):

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 111. Отчет на этапе проектирования

Для просмотра сформированного отчета во время проектирования необходимо при нахождении курсора мыши в области отчета нажать правую кнопку мыши и выбрать пункт меню Preview(соответствующий НД должен быть открыт). Это возможно в случае, если все части отчета формируются статически. Получим экран вида (рис. 112):

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 112. Предварительный просмотр отчета

Для выдачи документа, отображающего нагрузку определенного учителя, создадим новую форму, в которую поместим компоненту QuickRep, свойство DataSet которой установим равным DM.Qnagruzka.

Далее разметим дополнительные компоненты и настроим их так, как показано на следующем рисунке (рис. 113):

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 113. Конструирование отчета о нагрузке учителя

Перед выводом отчета осуществим вывод формы для выбора учителя (рис. 114):

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 114. Форма для выбора учителя

В созданную форму FSelectTeacher поместим экземпляр компоненты ComboBox1 со страницы компонент Standard; свойство Sorted установим равным True (ФИО учителей будут упорядочены). При отображении этой формы список должен содержать фамилии всех учителей. Для этого с событием OnShow этой формы свяжем следующий код:

procedure TFSelectTeacher.FormShow(Sender: TObject);

begin

DM.TTeacher.Open;//Открытие таблицы

DM.TTeacher.First;//Устанавливаем указатель на первую запись

ComboBox1.Clear;//Очистка списка

while not DM.TTeacher.eof do //Цикл до конца НД

begin

//Добавление строки в список

ComboBox1.Items.Add(

DM.TTeacher.FieldByName('FIO_teacher').AsString);

DM.TTeacher.Next;//Переход к следующей записи НД

end;

DM.TTeacher.Close;//Закрытие таблицы

ComboBox1.ItemIndex:=0;//Установка на первый элемент списка

//Он же будет использован по умолчанию, если учителя не выбрали

end;

Обработчик события нажатия кнопки ОК выглядит так:

procedure TFSelectTeacher.Button1Click(Sender: TObject);

begin

Close;//Закрываем форму для выбора учителя

DM.QNagruzka.Close;

//Устанавливаем значение параметра ft параметрического запроса

DM.QNagruzka.ParamByName('ft').Value:=FSelectTeacher.ComboBox1.Text;

DM.QNagruzka.Prepare;//Подготовка запроса к выполнению

DM.QNagruzka.Open;//Открываем запрос

FReport2.QuickRep1.Preview;//Отображаем отчет

end;

Пункт меню главной формы Нагрузка учителей свяжем с новой формой FReport2,на которой будем выводить отчет. Поставим в соответствие этому пункту следующие действия:

procedure TMain.N8Click(Sender: TObject);

begin

FSelectTeacher.ShowModal;//Отображаем форму выбора учителя

end;

В обработчике события AfterPreview отчета закроем запрос:

DM.QT_pred.Close;

Вид отчета, отображающего информацию о нагрузке выбранного учителя по каждому предмету с подсчетом суммарной нагрузки, показан ниже (рис. 115):

Разработка отчета для выдачи выходных документов - student2.ru

Рис. 115. Отчета о нагрузке учителя

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

       
    Разработка отчета для выдачи выходных документов - student2.ru
  Разработка отчета для выдачи выходных документов - student2.ru
 

Разработка отчета для выдачи выходных документов - student2.ru

       
    Разработка отчета для выдачи выходных документов - student2.ru
  Разработка отчета для выдачи выходных документов - student2.ru
 

Рис. 116. Стандартная инструментальная панель отчета

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

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

MyPrevForm.Show;

Контрольные вопросы

1. Как создать файлы базы данных локального приложения?

2. Что такое индексы, для чего они необходимы и как их создавать?

3. Какие виды ссылочной целостности Вы знаете?

4. Что такое модуль данных?

5. Какие компоненты используются для связи невизуальных компонент, размещенных в модуле данных, с визуальными?

6. В каких состояниях может находиться набор данных?

7. С помощью какой компоненты Delphi описывается НД для отображения данных из нескольких таблиц?

8. Как сделать доступными компоненты модуля данных другим формам?

9. Что такое параметр запроса и как присвоить ему значение?

10. С помощью каких методов можно организовать последовательный просмотр набора данных?

11. Какие визуальные компоненты Delphi Вы знаете?

12. Какая визуальная компонента Delphi служит для отображения таблиц на форме и как ее настраивать?

13. Какие разделы имеет отчет?

14. Какое свойство группы определяет элемент, по которому происходит группировка?

Наши рекомендации