Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по управлению данными.DOC
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
11 Мб
Скачать
☆

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

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

Компоненту TQuery для выдачи данных документа рекомендуется размещать на форме выходного документа.

Свойство SQL запроса для нашего примера будет иметь вид

select namechi,nameclass,ball from pupil p,class c where p.ncl=c.ncl

order by nameclass,namechi,ball

Остановимся подробнее на свойстве SQL компоненты TQuery:

WHERE может содержать условия соединения (как в предыдущем примере) двух или более таблиц и условия отбора строк, удовлетворяющих условию.

ORDER BY имена полей используется для упорядочения полей при выводе (это особенно полезно при создании запроса для выходного документа, если есть группа, см. ниже).

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

Например, пусть имеется компонента TQuery со свойством SQL:

select * from class c, pupil u where c.ncl=u.ncl and u.ball>:ab,

с помощью которого отбираются ученики классов с баллом, большим определенного значения. ab – параметр запроса. Список параметров можно увидеть, щелкнув по свойству Params:

Каждому параметру, щелкнув по нему, нужно назначить тип данных (Data Type) и тип параметра (ParamType) – обычно входной.

Значения параметров должны быть определены каким-либо образом перед выполнением запроса (например, вводиться на какой-либо форме в поле ввода или выбираться из каких-либо данных).

Выполнение запроса состоит в присвоении значения параметрам и повторном открытии запроса:

DM->CL_Chi->Close();

DM->Cl_Chi->ParamByName(“ab”)->AsFloat=значение;

DM->Cl_Chi->Open();

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

имя формы->QuickRep1->Preview() //Отображение отчета на экране

Прежде всего поместим на эту форму экземпляр компоненты QuickRep со страницы QReport и через свойство DataSet свяжем ее с нужным запросом. При проектировании отчета соответствующий НД должен быть открыт (свойство Active установлено в true).

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

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

HasColumnHeader - заголовка столбцов,

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

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

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

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

HasTitle - заголовка отчета.

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

Если необходимо группировать данные при выводе, то поместим в отчет по одному экземпляру компоненты QRGroup на каждую группу. Свойство Expression этой компоненты позволяет выбрать выражение, при изменении которого выводится заголовок группы (его роль также играет компонента QRGroup). При щелчке по свойству появляется окно построителя выражений, позволяющее сформировать выражение. Это выражение не отображается.

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

При проектировании конкретного выходного документа прежде всего в групповом свойстве Bands компоненты QuickRep следует включить (положить равными true) свойства HasColumnHeader, HasDetail и HasTitle:

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

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

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

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

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

Если считается функция SUM, то для того, чтобы сумма не накапливалась по всем группам, необходимо у компоненты QRExpr задать свойство ResetAfterPrint (очищать после вывода), равным true.

Получим экран вида:

При выводе отчета получим документ вида:

В некоторых задачах прежде, чем выводить отчет, необходимо выбрать или ввести некоторые параметры. Например, пусть необходимо создать отчет – список учеников указанного класса. В этом случае из главной формы надо вызвать форму для выбора нужного класса из таблицы. На форму следует поместить экземпляр компоненты ComboBox со страницы компонент Standard. Эта компонента хранит набор строк и, возможно, сопровождающих их объектов:

В методе OnShow этой формы следует выполнить код для заполнения свойства Items компоненты ComboBox значениями названий классов из таблицы class и сопровождающими их значениями первичных ключей ncl:

DM->CL->Open();ComboBox1->Items->Clear();//очистка списка элементов

while (!DM->CL->Eof)//пока не конец НД

{ComboBox1->Items->AddObject(DM->CL->

FieldByName("Nameclass")->

AsString,(TObject *)DM->CL->FieldByName("NCL")->AsInteger);

//добавить в список строку с именем класса и дополнитнльно – номер класса

DM->CL->Next();

}

ComboBox1->ItemIndex=0;//Установка списка на начало

ncl=(int)ComboBox1->Items->Objects[0];//запоминание номера класса для первой записи

В событии OnChange компоненты CheckBox следует написать строку

ncl=(int)ComboBox1->Items->Objects[ComboBox1->ItemIndex];//Запоминание номера класса для выбранной записи

При нажатии кнопки Выдать отчет следует выполнить передачу запросу для вывода документа параметров (например, таким параметром может быть значение поля ncl) и вывод сформированного документа (вызов метода Preview экземпялра компоненты QuckRep.