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;