--PAGE_BREAK--Рекомендуется вначале установить связи в схеме базы данных, а затем заносить данные, что предотвратит ошибки, возникающие при попытке внести данные, нарушающие ограничения целостности в базу данных и связанные с их идентификацией.
Особое внимание следует уделить занесению NULL-значений. В теоретическом плане NULL-значения запрещены (значения атрибута атомарны), однако требования практики обусловили их использование в коммерческих пакетах. Следует учитывать разницу в описании NULL-значений в каждом из них. В разрабатываемом проекте NULL-значения задавались средствами пакета ACCESS.
4.4 Создание запросов к базе данных компьютерный клуб
В основном запросы используются для анализа данных. В данной курсовой работе были созданы такие запросы:
1. Данные о дежурстве админа:
SELECT Данные.Дата_аренды, Данные.админ
FROM Комп INNER JOIN (Услуги INNER JOIN ([Инфо игрока] INNER JOIN Данные ON [Инфо игрока].Игрок=Данные.Игрок) ON Услуги.Номер_услуги=Данные.Код_услуги) ON Комп.Номер_компа=Данные.Номер_компа
WHERE (((Данные.Дата_аренды)=[ Введите дату аренды ]));
2.Доход в заданную дату.
SELECT Sum([Центр данных].Цена) AS Сумма
FROM [Центр данных]
WHERE ((([Центр данных].Дата_аренды)=[ Введите дату аренды ]));
3.Вывести игроков, которые не состоят в командах
SELECT [Инфо игрока].игрок, [Инфо игрока].фио, [Инфо игрока].адрес
FROM [инфо игрока]
WHERE [Инфо игрока].комманда Is Null;
4.Вывести информацию, если заработано более 5 грн.
SELECT [Центр данных].игрок, [Центр данных].Цена, [Центр данных].Номер_компа, [Центр данных].Дата_аренды, [Центр данных].Код_услуги, [Центр данных].Админ
FROM [Центр данных]
GROUP BY [Центр данных].игрок, [Центр данных].Цена, [Центр данных].Номер_компа, [Центр данных].Дата_аренды, [Центр данных].Код_услуги, [Центр данных].Админ
HAVING ((([Центр данных].Цена)>5));
5.Вывести данные о том, когда и на каком компьютере пользовались определённой услугй.
SELECT Услуги.Название, [Центр данных].Номер_компа, [Центр данных].Дата_аренды, [Центр данных].Время_аренды, [Центр данных].Продолжительность
FROM Комп INNER JOIN (Услуги INNER JOIN ([Инфо игрока] INNER JOIN [Центр данных] ON [Инфо игрока].Игрок=[Центр данных].Игрок) ON Услуги.Номер_услуги=[Центр данных].Код_услуги) ON Комп.Номер_компа=[Центр данных].Номер_компа
WHERE (((Услуги.Номер_услуги)=[ Код услуги ]))
ORDER BY [Центр данных].Дата_аренды;
6.Вывести сумму, заработанную определённым администратором
SELECT Sum([Центр данных].Цена) AS Сумма
FROM [Центр данных]
WHERE ((([Центр данных].админ)=[ Администратор ]));
7.Вывести данные о работе клуба, отсортировать по дате и игроку
SELECT [Центр данных].Номер_компа, [Центр данных].Дата_аренды, [Центр данных].Время_аренды, [Центр данных].Продолжительность, [Центр данных].Код_услуги, [Центр данных].Игрок, [Центр данных].Цена, [Центр данных].Админ
FROM [Центр данных]
ORDER BY [Центр данных].Дата_аренды, [Центр данных].Игрок;
8.Вывести информацию о самой поздней аренде компьютера
SELECT MAX([центр данных].время_аренды) AS Время
FROM [центр данных];
9.Вывести информацию о самой ранней аренде компьютера
SELECT MIN([центр данных].время_аренды) AS Время
FROM [центр данных];
10.Вывести данные об аренде компьютера в заданное время
SELECT [Центр данных].Время_аренды, [Центр данных].Код_услуги, [Центр данных].Игрок, [Центр данных].Номер_компа
FROM Комп INNER JOIN (Услуги INNER JOIN ([Инфо игрока] INNER JOIN [Центр данных] ON [Инфо игрока].Игрок=[Центр данных].Игрок) ON Услуги.Номер_услуги=[Центр данных].Код_услуги) ON Комп.Номер_компа=[Центр данных].Номер_компа
WHERE ((([Центр данных].Время_аренды)=[ Введите время аренды ]));
11.Вывести данные об аренде компьютера в заданную дату.
SELECT [Центр данных].Дата_аренды, [Центр данных].Код_услуги, [Центр данных].Игрок, [Центр данных].Номер_компа
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, входящую в комплект стандартной поставки пакета Microsoft Office.
4.5.1 Создание отчета с помощью MicrosoftWord. Откройте новое приложение в Delphi
Поместить на форму компонент TADOConection, два компонента TADODataSet и три компонента TButton ( рис.4.3). Свойствам Caption и Name присвоить значения из таблицы 1.
Таблица 4.1
Компонент
Свойство Caption
Свойство Name
Tbutton1
Отчет с использованием MS Word
Report_Word
Tbutton2
Отчет с использованием MS Excel
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);
var I, Rcnt:integer;
begin
// Открываем базу данных и подсчитываем количество записей
ADODataSet1.Open;
Rcnt:=ADODataSet1.RecordCount;
// Запускаем MS Word
wd:= CreateOleObject('Word.Application');
// Отображаем на экране окно MS Word
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;
Откомпилируйте приложение и проверьте работу кнопки «Отчет с использованием MS Word». При выполнении этого приложения создается документ с отчетом по базе данный club.mdb (рис.4.4).
Пояснения к приведенному выше фрагменту кода.
Во-первых, мы должны создать копию Microsoft Word, сделать ее видимой и создать новый документ.
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);
var I, 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;
Откомпилируем приложение и проверьте работу кнопки «Отчет с использованием MS Excel». При выполнении этого приложения создается документ с отчетом по базе данный club.mdb (рис.4.5).
Пояснения к приведенному выше фрагменту кода
Во-первых, мы должны создать копию Microsoft Excel, сделав ее видимой и создать новую рабочую книгу:
// Запускаем 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;
Теперь нам нужно сохранить документ, подавив при этом вывод диагностических сообщений Excel. Как и в Word, приложение Excel может быть запущено удаленно, и в этом случае пользователь также может не иметь возможности взаимодействовать с диалоговыми окнами Excel:
// Подавляем вывод диагностических сообщений
продолжение
--PAGE_BREAK--