Лабораторная работа № 5.
Создание отчетов к БД в Delphi
Отчеты БД – это бумажные документы, формируемые программой работы с БД. Отчет является конечным результатом работы с БД. Данные, содержащиеся в отчете, являются выходной информацией информационной системы. Как правило, эти данные отформатированы в соответствии с требованиями международных, государственных, межотраслевых и отраслевых стандартов, стандартов предприятия и т.п.
Для создания отчетов в Delphi традиционно использовались либо стандартные компоненты Delphi, расположенные на странице QReport, либо компоненты сторонних производителей – компоненты семейств RaveReport и FastReport. Стандартные компоненты имеют один существенный недостаток: отчеты, формируемые с их помощью, имеют свой собственный формат, который «не понимают» программы Microsoft Word и Excel. Отчеты такого типа можно экспортировать во внешние файлы типов *.txt (при этом, разумеется, почти все форматирования теряются) и *.html (качество html –кода также оставляет желать лучшего). Компоненты семейств RaveReport и FastReport способны экспортировать отчет в файл типа *.rtf , распознаваемый подавляющим большинством текстовых процессоров. К сожалению, лицензионные ограничения Turbo Delphi не допускают установки этих компонентов (через IDE!), а страница Qreport отсутствует.
С приемами создания отчетов средствами компонентов FastReport можно познакомиться ниже, сейчас же рассмотрим полностью ручное создание отчета.
5.1 Формирование отчетов «вручную»
Здесь же мы рассмотрим радикально отличающийся способ создания отчетов – генерация *.doc, *.rtf, *.html файлов вручную. Для первых двух форматов требуется использовать компоненты TWordApplication и TWordDocument закладки Servers палитры компонентов (главный недостаток, в том, что надо знать не меньше чем десятка полтора свойств этих компонентов и их методов). Для ручного формирования *.html документа достаточно знать только три-четыре функции работы с файлами, одну API функцию Windows и, разумеется, основные тэги языка разметки гипертекста - html. При примерно одинаковых затратах времени на написание программного кода по этим двум вариантам, вариант с html выполняется на порядок быстрее, чем формирование *.doc или *.rtf файла. Рассмотрим программный код, формирующий такой отчет как «Экзаменационная ведомость» в формате *.html.
Добавим на главной форме кнопку «Экзаменационная ведомость», два компонента CheckBox для управления настройками отчета при распечатке. В обработчике нажатия кнопки напишем следующий код:
procedureTSDIAppForm.Button1Click(Sender: TObject);
varF: textFile;
h: hwnd; //переменная описывающая динамически открываемое окно
s, ball,chislo: string;
i:integer;
begin
assignFile(f,'C:\temp\vedom1.html'); // {*} создадим временный html-файл
rewrite(f); //Откроем его на запись
With DataModule1 do
begin
TempSQL.Close;
TempSQL.SQL.Clear;
TempSQL.SQL.Add('Select * from Session_Result ');
TempSQL.SQL.Add(' where (Dis_shifr =' + chr($27)+ Disc_table.FieldByName ('Dis_Shifr').value +chr($27)+')');
TempSQL.SQL.Add(' and (forma_otchetnosti ='+chr($27)+ SDIAppForm.Otchetnost.Text +chr($27)+')');
TempSQL.SQL.Add(' and (st_bilet in ');
TempSQL.SQL.Add('(Select Student.st_bilet from student where gruppa='+chr($27) +SDIAppForm.GrName.Text +chr($27)+'));');
// SDIAppForm.Memo1.lines.Assign(TempSQL.SQL);
TempSQL.Open;
TempSQL.First;
//строки ниже формируют заголовок html-документа.
// т.е. шапку ведомости
Write(f,'<html><title> экзаменационная ведомость </title>');
write(f,'<body><h2> <center>Федеральное агентство по образованию<br> ');
write(f,'Московский государственный университет <br> ');
write(f,'Приборостроения и информатики. <br> ');
write(f,'');
write(f,' </h2> ');
write(f,' <h3> Ведомость ('+otchetnost.Text+')<br>');
write(f,' по дисциплине: '+dm1.Disc_table.FieldByName('Dis_name').Value+ '<br>');
write(f,' преподаватель: '+TempSQL.FieldByName('teacher').value +'<br> </h3>');
write(f,'</center><br>');
//рисуем шапку таблицы
if NoGrid.Checked then //без прорисовки сетки
s:='<table border="0"> <tr><td width="5%"> №</td>'
else // и с таковой
s:='<table border="1"> <tr><td width="5%"> №</td>';
s:=s+'<td width="40%"> ФИО</td>';
s:=s+'<td width="10%"> № ст. билета</td>';
s:=s+'<td width="15%"> Оценка</td>';
s:=s+'<td width="15%"> Подпись</td>';
s:=s+'<td width="15%"> Дата</td></tr>';
write (f,s);
i:=1; // первый студент в списке
whilenotTempSQL.Eofdo // пока не закончилось содержимое запроса
begin
if empty.Checked then
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.