Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шнырев Базы данных 2011

.pdf
Скачиваний:
113
Добавлен:
16.08.2013
Размер:
26.46 Mб
Скачать

Ниже приводятся процедуры обработки событий при выборе в меню пунктов “Отделы” и “Доступ к файлам”.

procedure TForm1.N2Click(Sender: TObject); // выбор в меню пункта “Отдел”

begin

DBGrid1.Visible:=true;

DBGrid1.DataSource:=DM.dsOtdel; // привязка сетки к нужному набору данных

DBGrid2.Visible:=false; // дополнительые наборы данных отображать не нужно

N7.Enabled:=false; // пункт меню “Дополнительные таблицы” недоступен

Label1.Visible:=true;

Label1.Caption:='Список отделов'; // заголовок набора данных

Label2.Visible:=false;

end;

procedure TForm1.N8Click(Sender: TObject); // выбор пункта

“Доступ к файлам” begin

DBGrid2.Visible:=true;

DBGrid2.DataSource:=DM.DSDostup;

Label2.Visible:=true;

Label2.Caption:='Доступ сотрудников к файлам'; end;

Аналогично программируются остальные пункты меню.

На этом начальную стадию разработки приложения можно считать завершенной. Остается откомпилировать проект, сохранить все изменения и запустить его на исполнение.

Сразу же становится ясно, что работать с наборами данных достаточно сложно: заголовки столбцов читать неудобно, нужная информация во многих случаях недоступна. Например, при выборе набора данных из таблиц File и Dostup (рис. п.10) вместо фамилии сотрудника-владельца данного файла в поле FVlad отображается целое число – значение первичного ключа таблицы Sotrudnik, в

191

поле DSotr вместо фамилий сотрудников, имеющих доступ к данному файлу, также отображается значение первичного ключа таблицы Sotrudnik. Кроме того, поля DostupID и DFile не несут никакой информации, поэтому их отображение не является необходимым.

Рис. п.10. Вид главного окна после запуска приложения на исполнение

Все эти неудобства можно преодолеть с помощью создания так называемых подстановочных полей. Для этого нужно активизировать окно модуля данных, выберать в нем таблицу TDostup и двойным щелчком левой кнопки мыши вызвать окно создания объектовполей. Сначала выполняется команда Add all fields, а затем – команда New Field. В появившемся окне следует установить такие свойства нового поля, как это показано на рис. п.11.

Теперь в данном поле будут отображаться фамилии сотрудников из таблицы Sotrudnik, имеющие доступ к файлу, для которого одно и то же значение поля DFile таблицы Dostup соответствует различным значениям поля DSotr этой же таблицы.

Все остальные поля таблицы Dostup, являющиеся неинформативными, можно скрыть, выбирая в окне их свойств Object Inspector значение false для свойства Visible.

192

Рис. п.11. Окна создания объектов-полей

Аналогичным образом создается подстановочное поле в таблице File для того, чтобы вместо номера сотрудника отображалась его фамилия. Поле FVlad можно скрыть, а заголовки полей FileID, FName и FDate изменить, изменяя значения свойств DisplayLabel.

После проделанных изменений внешний вид главного окна приложения после запуска его на исполнение должен измениться так, как это показано на рис. п.12.

Рис. п.12. Вид главного окна приложения

Если теперь перейти в окно модуля данных Diagram, то можно увидеть (рис. п.13), что, во-первых, появились новые выделенные курсивом подстановочные поля, во-вторых, по этим полям возникли новые связи между таблицами, отличающиеся своим внешним видом и цветом от ранее созданных связей по вторичным индексам.

193

Рис. п.13. Окно модуля данных Diagram

После создания объектов-полей для остальных таблиц, добавления необходимого количества подстановочных полей, исходя из очевидных соображений удобства работы с наборами данных, окно модуля данных Diagram примет вид, изображенный на рис. п.14.

Рис. п.14. Окно модуля данных Diagram после установления всех необходимых связей

194

Запросы к БД

Для того, чтобы излишне не загромождать главное окно приложения компонентами, создадим для запросов отдельное окно Zapros и разместим в этом окне по одному компоненту Button и DBGrid, 2 компонента Label, 9 компонентов RadioButton, а также компоненты Query и DataSourse. Свойства Caption компонентов

Button1, Zapros, RadioButton и Label1 нужно изменить так, как это показано на рис. п.15.

Рис. п.15. Окно запросов к БД

Для компонента DataSourse в качестве значения свойства DataSet укажем Query1, а для компонента DBGrid в качестве значения свойства DataSource укажем DataSource1.

Кроме того, в свойстве AutoSize окна Zapros установим значе-

ние True.

Для вызова данного окна можно создать в главном меню проекта обработчик события Опции\Запрос, запрограммировав его следующим образом:

procedure TForm1.N12Click(Sender: TObject); begin

Zapros.Visible:=true;

Zapros.DBGrid1.Visible:=false;

Zapros.Label1.Visible:=true;

Zapros.Label2.Visible:=false;

end;

195

Реализация запросов осуществляется при возникновении собы-

тия OnClick для компонентов RadioButton.

Рассмотрим два примера.

А) Список файлов, доступ к которым имеют все сотрудники

procedure TZapros.RadioButton3Click(Sender: TObject); begin

Label1.Visible:=false;

Label2.Visible:=true;

Label2.Caption:='Файлы, доступные для всех сотрудников'; Radiobutton1.Visible:=false;

Radiobutton2.Visible:=false;

Radiobutton3.Visible:=false;

Radiobutton4.Visible:=false;

Radiobutton5.Visible:=false;

Radiobutton6.Visible:=false;

Radiobutton7.Visible:=false;

Radiobutton8.Visible:=false;

Radiobutton9.Visible:=false;

DBGrid1.Visible:=true;

Radiobutton3.Checked:=false; with Query1 do begin

Close;

SQL.Clear;

SQL.Add('SELECT File_ID as код, FName as файл'); SQL.Add('FROM "file", "dostup", "sotrudnik", "otdel"'); SQL.Add('WHERE');

SQL.Add(' DFile=File_ID and DSotr=Sotr_ID '); SQL.Add('GROUP BY File_ID, FName '); SQL.Add('HAVING ((COUNT(distinct SOtdel)=3))'); Open;

if RecordCount <> 0

then DataSource1.DataSet := Query1

else ShowMessage('В БД нет записей, удовлетворяющих' + #13 + 'критерию запроса'); // #13 – переход к новой строке

end;

end;

196

Результатом выполнения данного запроса является возникновение приблизительно следующего окна (рис. п.16):

Рис. п.16. Вид окна после реализации запроса

Б) Запрос на сотрудника

В качестве критерия используется ФИО сотрудника. Результатом выполнения запроса является информация о том, в каком отделе этот сотрудник работает.

procedure TZapros.RadioButton9Click(Sender: TObject); var buf:string[30];

begin

buf := InputBox('Выборка информации по сотрудникам', 'Введите Фамилию сотрудника ','');

Label1.Visible:=false;

Label2.Visible:=true; Label2.Caption:='Запрос на сотрудника'; Radiobutton1.Visible:=false; Radiobutton2.Visible:=false; Radiobutton3.Visible:=false; Radiobutton4.Visible:=false; Radiobutton5.Visible:=false; Radiobutton6.Visible:=false; Radiobutton7.Visible:=false; Radiobutton8.Visible:=false; Radiobutton9.Visible:=false;

197

DBGrid1.Visible:=true;

Radiobutton9.Checked:=false; if buf = '' then exit;

with Query1 do begin

Close;

SQL.Clear;

SQL.Add('SELECT OName as Отдел, SName as ФИО'); SQL.Add('FROM "sotrudnik", "otdel" '); SQL.Add('WHERE');

SQL.Add('Sotdel=Otdel_ID and Sotr_ID in (select Sotr_ID from "sotrudnik" where (SName like "' + buf + '%' + '"))');

Open;

if RecordCount <> 0 then

begin

DataSource1.DataSet := Query1; DBGrid1.Columns.Items[0].Width:=150; DBGrid1.Columns.Items[1].Width:=130; end

else ShowMessage(‘По запросу ничего не найдено'); end;

end;

Результат выполнения данного запроса приведен на рис. п.17.

Рис. п.17. Результат выполнения запроса

198

Рис. п.18. Вид окна для реализации поиска в БД

Поиск записей в БД

В данном разделе с использованием метода Filter будет реализован механизм, позволяющий осуществлять поиск записей в БД в соответствии с определенными критериями.

Задача № 1. Нужно разработать метод, который позволяет отыскивать в БД файлы либо по названию, либо по дате создания, либо одновременно по этим двум свойствам. Для этого воспользуемся методом Filter. Прежде всего нужно создать новое окно, в котором будут задаваться критерии фильтрации. Для этого добавим в проект новую форму, свяжем ее с проектом, в окне ее свойств Object Inspector установим значения FilterF для свойства Name и Фильтр для свойства Caption. Далее разместим в этом окне по 2 компонента Label и Edit и один компонент BitBtn из раздела Additional палитры компонентов. Для свойства Kind этого компонента следует установить значение bkOK. После этого вновь созданное окно примет приблизительно следующий вид (рис. п.18):

Для вызова этого окна в меню главного окна проекта добавим новую кнопку Опции\Фильтр.

Алгоритм реализации поставленной задачи поиска файлов следующий. Процедура фильтрации возникает при открытом наборе данных таблицы File в случае нажатия на кнопку главного меню Фильтр и начинается с открытия соответствующего окна:

procedure TForm1.N13Click(Sender: TObject); begin

if DBGrid1.DataSource=DM.DSFile then FilterF:=TFilterF.Create(Self);

end;

199

В этом окне вводятся данные об искомом файле либо в оба поля Edit1 и Edit2, либо только в какое-нибудь одно из них. После этого при нажатии на кнопку OK происходит сравнение введенных данных с данными из таблицы File. Например, если осуществляется поиск по названию файла, операция сравнения выглядит следующим образом:

Filter:=concat('FName=', FilterF.Edit1.Text);

Далее должно возникнуть событие OnFilterRecord, для чего нужно установить значение true для свойства Filtered таблицы

File.

procedure TForm1.N13Click(Sender: TObject); begin

if DBGrid1.DataSource=DM.DSFile then begin

FilterF:=TFilterF.Create(Self);

if FilterF.ShowModal=mrOK then

if (FilterF.Edit1.Text<>'') and (FilterF.Edit2.Text='') then begin

FilterF.Edit1.Text:=chr(39)+FilterF.Edit1.Text+chr(39); with DM,TFile do

begin

Filter:=concat('FName=',FilterF.Edit1.Text);

Filtered:=true;

end;

end;

if (FilterF.Edit2.Text<>'') and (FilterF.Edit1.Text='') then begin

FilterF.Edit2.Text:=chr(39)+FilterF.Edit2.Text+chr(39); with DM,TFile do

begin

Filter:=concat('FDate=',FilterF.Edit2.Text);

Filtered:=true;

end;

end;

if (FilterF.Edit1.Text<>'') and (FilterF.Edit2.Text<>'') then begin

FilterF.Edit1.Text:=chr(39)+FilterF.Edit1.Text+chr(39);

200