Смекни!
smekni.com

Информационная система компьютерного клуба (стр. 3 из 5)

FROM Комп INNER JOIN (Услуги INNER JOIN ([Инфо игрока] INNER JOIN [Центр данных] ON [Инфо игрока].Игрок=[Центр данных].Игрок) ON Услуги.Номер_услуги=[Центр данных].Код_услуги) ON Комп.Номер_компа=[Центр данных].Номер_компа

WHERE ((([Центр данных].дата_аренды)=[ Введите дату аренды ]));

12.Вывести данные об услугах

SELECT Услуги.Номер_услуги, Услуги.Название, Услуги.Тариф

FROM Комп INNER JOIN (Услуги INNER JOIN ([Инфо игрока] INNER JOIN [Центр данных] ON [Инфо игрока].Игрок=[Центр данных].Игрок) ON Услуги.Номер_услуги=[Центр данных].Код_услуги) ON Комп.Номер_компа=[Центр данных].Номер_компа

GROUP BY Услуги.Номер_услуги, [Центр данных].Код_услуги, Услуги.Название, Услуги.Тариф

HAVING (("номер_компа"="номер_компа"));

4.5 Создание отчетов по базам данных с помощью приложений Office

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

4.5.1 Создание отчета с помощью MicrosoftWord. Откройте новое приложение в Delphi

Поместить на форму компонент TADOConection, два компонента TADODataSet и три компонента TButton ( рис.4.3). Свойствам Caption и Name присвоить значения из таблицы 1.

Таблица 4.1

Компонент Свойство Caption Свойство Name
Tbutton1 Отчет с использованием MSWord Report_Word
Tbutton2 Отчет с использованием MSExcel Report_Excel

Свойству ConnectionString объекта TADODataSet установить значение, которое связывало бы его с базой данных club.mdb.

Объявить глобальные переменные для объектов Application, Document, Range и Table:

Var Forml: TForm1;

// Range и Table

Wd, Doc, Rng, Tbl: Variant;

Свойствам CommandType и CommandText компонентов присвоить значения из таблицы 4.2.

Таблица 4.2

Компонент Свойство CommandType Свойство CommandText
TADODataSet1 cmdText Select КодКлиента, Название, Город From Страны

Реализовываем генерацию табличного отчета в обработчике события OnClick компонента Buttonl:

procedure TForm1.Report_WordClick(Sender: TObject);

varI, Rcnt:integer;

begin

// Открываем базу данных и подсчитываем количество записей

ADODataSet1.Open;

Rcnt:=ADODataSet1.RecordCount;

// Запускаем MS Word

wd:= CreateOleObject('Word.Application');

// Отображаем на экране окно MSWord

wd.Visible :=True;

// Создаем новый документ

wd.Documents.Add;

Doc:= wd.Documents.Item(1);

// Добавляем новый абзац

Doc.Paragraphs.Add;

// Меняем его стиль

Doc.Paragraphs.Item(1).Style:='Заголовок 1';

// Создаем заголовок отчета

Rng := Doc.Range(0);

Rng.InsertBefore('Центр данных');

// Создаем заголовки колонок

Doc.Paragraphs.Add;

Rng.InsertAfter('Комп: Игрок: Дата: Продолжительность: Код услуги: Админ');

// Перемещаемся на первую запись набора данных

ADODataSet1.First;

for I := 1 to Rcnt do begin

// Добавляем новый абзац

Doc.Paragraphs.Add;

// Добавляем поля из текущей записи в новый абзац

Rng.InsertAfter(ADODataSet1.Fields[0].AsString+':'+

ADODataSet1.Fields[1].ASString+':'+

ADODataSet1.Fields[2].AsString+':'+

ADODataSet1.Fields[3].ASString+':'+

ADODataSet1.Fields[4].ASString+':'+

ADODataSet1.Fields[5].ASString);

ADODataSet1.Next;

end;

// Превращаем текст в таблицу

Rng:=Doc.Range(Doc.Paragraphs.Item(3).Range.Start, Doc.Paragraphs.Item(Rcnt+3).Range.End);

Tbl:=Rng.ConvertToTable(':',Rcnt,6);

// Изменяем размеры колонок таблицы

Tbl.Columns.Item(1).Width:=Tbl.Columns.Item(1).Width-30;

Tbl.Columns.Item(2).Width:=Tbl.Columns.Item(2).Width+20;

Tbl.Columns.Item(3).Width:=Tbl.Columns.Item(3).Width-3;

Tbl.Columns.Item(4).Width:=Tbl.Columns.Item(4).Width+20;

Tbl.Columns.Item(5).Width:=Tbl.Columns.Item(5).Width-5;

Tbl.Columns.Item(6).Width:=Tbl.Columns.Item(6).Width+5;

// Подавляем вывод диагностических сообщений

Wd.DisplayAlerts:=False;

// Сохраняем документ

Doc.SaveAs(D:\SOT\Custrep.doc');

// Закрываем Word и освобождаем ресурсы

//Wd.Quit;

Wd:=Unassigned;

end;

Откомпилируйте приложение и проверьте работу кнопки «Отчет с использованием MSWord». При выполнении этого приложения создается документ с отчетом по базе данный club.mdb (рис.4.4).

Пояснения к приведенному выше фрагменту кода.

Во-первых, мы должны создать копию MicrosoftWord, сделать ее видимой и создать новый документ.

wd:= CreateOleObject('Word.Application');

// Отображаемнаэкранеокно MS Word

wd.Visible :=True;

// Создаем новый документ

wd.Documents.Add;

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

// Добавляем новый абзац

Doc.Paragraphs.Add;

// Меняем его стиль

Doc.Paragraphs.Item(1).Style:='Заголовок 1';

// Создаем заголовок отчета

Rng := Doc.Range(0);

Rng.lnsertBefore(Центр данных');

// Создаем заголовки колонок

Doc.Paragraphs.Add;

Rng.InsertAfter('Комп: Игрок: Дата: Продолжительность: Код услуги: Админ');

Затем следует, перемещаясь по записям набора данных, добавить в документ строки, соответствующие этим записям:

// Перемещаемся на первую запись набора данных

ADODataSet1.First;

for I := 1 to Rcnt do begin

// Добавляемновыйабзац

Doc.Paragraphs.Add;

// Добавляем поля из текущей записи в новый абзац

Rng.InsertAter(ADODataSet1.Fields[0].AsString+':'+

ADODataSet1.Fields[1].ASString+':'+

ADODataSet1.Fields[2].AsString+':'+

ADODataSet1.Fields[3].ASString+':'+

ADODataSet1.Fields[4].ASString+':'+

ADODataSet1.Fields[5].ASString);

ADODataSet1.Next;

end;

Далее мы превращаем набор строк в таблицу Word и изменяем ширину ее колонок так, чтобы корректно отобразить содержащиеся в ней данные:

// Превращаем текс в таблицу

Rng:=Doc.Range(Doc.Paragraphs.Item(3).Range.Start, Doc.Paragraphs.Item(rcnt+3).Range.End); Tbl:=Rng.ConvertToTable(':',rcnt.3);

// Изменяем размеры колонок таблицы

Tbl.Columns.Item(1).Width:=Tbl.Columns.Item(1).Width-30;

Tbl.Columns.Item(2).Width:=Tbl.Columns.Item(2).Width+20;

Tbl.Columns.Item(3).Width:=Tbl.Columns.Item(3).Width-3;

Tbl.Columns.Item(4).Width:=Tbl.Columns.Item(4).Width+20;

Tbl.Columns.Item(5).Width:=Tbl.Columns.Item(5).Width-5;

Tbl.Columns.Item(6).Width:=Tbl.Columns.Item(6).Width+5;Теперь нам нужно сохранить документ, подавив при этом вывод диагностических сообщений Word:

// Подавляем вывод диагностических сообщений

Wd.DisplayAlerts:=False;

Почему нужно избавиться от вывода диагностических сообщений? В общем случае приложения, подобные Word, можно запускать удаленно, например, с помощью средств DCOM или универсальных СОМ-клиентов, доступ к которым осуществляется по протоколам TCP/IP или HTTP/HTTPS. В этом случае у пользователя не будет возможности отвечать на вопросы диалоговых окон Word — ведь физически он находитсяна другом компьютере; кроме того, некоторые режимы применения DCOM таковы, что пользовательский интерфейс DCOM-сервера (включая обработку им событий мыши и клавиатуры) может быть просто недоступен никому из пользователей. В этом случае диалоговое окно, созданное в оперативной памяти, получит сообщения о событии, связанном со щелчком на одной из кнопок этого окна, и не будет закрыто, и у пользователя создастся впечатление, что приложение «зависло».

И, наконец, нам следует сохранить документ и освободить ресурсы:

// Сохраняем документ

Doc.SaveAs('D:\SOT\Custrep.doc');

// Закрываем Word и освобождаем ресурсы

Wd.Quit;

Wd:=Unassigned;

4.5.2 Создание генерации отчетов с помощью MicrosoftExcel

Как и в предыдущем случае, нам следует также объявить глобальные переменные для объектов Application, WorkBook и WorkSheet:

var

Forml: TForm1;

. . .

// Переменныедляобъектов Excel Application, WorkBook и WorkSheet

Xl, Wb, Ws: Variant;

Реализуем генерацию табличного отчета в обработчике события OnClick компонента Button2:

procedure TForm1.Report_ExcelClick(Sender: TObject);

varI, Rcnt:integer;

begin

// Открываем базу данных и подсчитываем количество записей

ADODataSet1.Open;

Rcnt := ADODataSet1.RecordCount;

// Запускаем Microsoft Excel

Xl := CreateOleObject('Excel.Application');

// Отображаем окно Microsoft Excel

Xl.Visible := True;

// Создаем рабочую книгу

Xl.WorkBooks.Add;

Wb := XL.WorkBooks[1];

Ws := Wb.WorkSheets[1];

Ws.Name := 'Центр данных';

// Создаем заголовок отчета

Ws.Cells[1,1] := 'Центр данных';

Ws.Cells[1,1].Font.Bold := True;

Ws.Cells[1,1].Font.Size := 16;

Ws.Cells[2,1] := 'Комп';

Ws.Cells[2,2] := 'Игрок';

Ws.Cells[2,3] := 'Дата';

Ws.Cells[2,4] := 'Продолжительность';

Ws.Cells[2,5] := 'Код услуги';

Ws.Cells[2,6] := 'Админ';

for I:=1 to 6 do

Ws.Cells[2,i].Font.Bold := True;

// Перемещаемся на первую запись набора данных

ADODataSet1.First;

for I:=1 to Rcnt do

begin

// Добавляем значения полей текущей записи в новую строку

Ws.Cells[i+2,1] := ADODataSet1.Fields[0].AsString;

Ws.Cells[i+2,2] := ADODataSet1.Fields[1].AsString;

Ws.Cells[i+2,3] := ADODataSet1.Fields[2].AsString;

Ws.Cells[i+2,4] := ADODataSet1.Fields[3].AsString;

Ws.Cells[i+2,5] := ADODataSet1.Fields[4].AsString;

Ws.Cells[i+2,6] := ADODataSet1.Fields[5].AsString;

ADODataSet1.Next;

end;

// Изменяем ширину колонок

Xl.Columns[1].ColumnWidth:=Xl.Columns[1].ColumnWidth+5;

Xl.Columns[2].ColumnWidth:=Xl.Columns[2].ColumnWidth+5;

Xl.Columns[3].ColumnWidth:=Xl.Columns[3].ColumnWidth+5;

Xl.Columns[4].ColumnWidth:=Xl.Columns[4].ColumnWidth+5;

Xl.Columns[5].ColumnWidth:=Xl.Columns[5].ColumnWidth+5;

Xl.Columns[6].ColumnWidth:=Xl.Columns[6].ColumnWidth+5;

// Подавляем вывод диагностических сообщений

Xl.DisplayAlerts:=false;

// Сохраняем документ

Wb.SaveAs('D:\SOT\Custrer.xls');

// Закрываем Excel и освобождаем ресурсы

//Xl.Quit;

Xl:=Unassigned;

end;

Откомпилируем приложение и проверьте работу кнопки «Отчет с использованием MSExcel». При выполнении этого приложения создается документ с отчетом по базе данный club.mdb (рис.4.5).

Пояснения к приведенному выше фрагменту кода

Во-первых, мы должны создать копию MicrosoftExcel, сделав ее видимой и создать новую рабочую книгу:

// Запускаем Microsoft Excel

Xl := CreateOleObject('Excel.Application');

// Отображаемокно Microsoft Excel

Xl.Visible := True;

// Создаем рабочую книгу

Xl.WorkBooks.Add;

Wb := XL.WorkBooks[1];

Ws := Wb.WorkSheets[1];

Ws.Name := ' Список клиентов ';

Затем нужно создать заголовок отчета и заголовки колонок будущей таблицы, добавляя текст в соответствующие ячейки т меняя характеристики шрифта ячеек:

// Создаем заголовок отчета

Ws.Cells[1,1] := 'Центр данных';

Ws.Cells[1,1].Font.Bold := True;

Ws.Cells[1,1].Font.Size := 16;

Ws.Cells[2,1] := 'Комп';

Ws.Cells[2,2] := 'Игрок';

Ws.Cells[2,3] := 'Дата';

Ws.Cells[2,4] := 'Продолжительность';

Ws.Cells[2,5] := 'Кодуслуги';

Ws.Cells[2,6] := 'Админ';

for I:=1 to 6 do

Ws.Cells[2,i].Font.Bold := True;Затем следует, перемещаясь по записям набора данных, добавит в документ строки, соответствующие этим записям:

// Перемещаемся на первую запись набора данных

ADODataSet1.First;

for I:=1 to Rcnt do

begin

// Добавляем значения полей текущей записи в новую строку

Ws.Cells[i+2,1] := ADODataSet1.Fields[0].AsString;

Ws.Cells[i+2,2] := ADODataSet1.Fields[1].AsString;

Ws.Cells[i+2,3] := ADODataSet1.Fields[2].AsString;