Создание отчетов к БД в Delphi. Формирование отчетов "вручную". Содержимое запроса. Настройка TurboDelphiExplorer для работы с отчетами с помощью компонентов FastReport

Страницы работы

Содержание работы

Лабораторная работа № 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

Похожие материалы

Информация о работе