Практическое занятие № 17

Тема: "Работа с базами данных"

Цель работы: получить практические навыки по созданию программ для работы из БД

 

Ход работы

 

В СУБД Access спроектируйте базу данных, которая содержит таблицу с именем "Sotr" для хранения информации о сотрудниках:

 

Имя поля

Тип

Размер

Назначение

tabnom

Числовой

Целое, ключевое

Табельный номер

fam

Текстовый

20

Фамилия

imya

Текстовый

15

Имя

otch

Текстовый

20

 Отчество

datar

Дата/время

 

Дата рождения

dolg

Текстовый

20

Должность

oklad

Числовой

Одинарной точности с плавающей запятой

Оклад

foto

Поле объекта OLE

 

Фото

 

 

Заполните таблицу, введя в нее пять записей (поле Фото не заполнять).

 

В среде Delphi создайте программу для работы с данными таблиц. При этом форма должна иметь вид:

 

 

Указания: для главной формы задайте свойства: Caption="Список сотрудников", Position="DesktopCenter", Borderstyle="bsSingle". На форму нанесите компонент ADOConnection (ADO). В свойстве ConnectionString щелкните на кнопке Build, выберите строку "Microsoft Jet …" и укажите имя файла базы данных, удалив полный путь. В свойстве LoginPrompt укажите false, чтобы программа не спрашивала пароль при соединении с базой данных.

Нанесите на форму компонент ADOTable (ADO). В свойстве Connection выберите имя соединения ADOConnection1, в свойстве TableName выберите таблицу "Sotr".

 

Для того чтобы программа корректно подключала таблицу, в событии формы OnCreate введите код:

 

procedure TForm1.FormCreate(Sender: TObject);

begin

//подключаем таблицу к программе

ADOTable1.Active:=true;

end;  

 

Для того чтобы программа корректно отключала таблицу, в событии формы OnDestroy введите код:

 

procedure Tform1.FormDestroy(Sender: Tobject);

begin

//закрываем соединение с БД

ADOConnection1.Connected:=false;

end;

 

В сетке отображаются поля (Табельный номер, Фамилия, Имя, Отчество). Все поля должны иметь название, приемлемую ширину столбцов. Сама сетка заблокирована для редактирования данных.

 

Указания: нанесите на форму компонент DataSource (DataAccess). Установите его свойство DataSet =ADOTable1.

Нанесите на форму компонент DBGrid (Datacontrols). В свойстве DataSource укажите имя компонента DataSource1.Для блокировки сетки в свойстве ReadOnly укажите True.

Для того чтобы в сетке DBGrid отображались только поля Табельный номер, Фамилия, Имя, Отчество щелкните два раза на компоненте ADOTable1. В появившемся окне вызовите контекстное меню, выберите команду Add All Fields. В результате в окне появится список всех полей таблицы. Для нужных полей задайте свойства DisplayLabel – название поля в сетке, DisplayWidth – ширина поля в символах. Для ненужных полей установите свойство Visible=false.

 

Добавьте на сетку поле "Премия", которое вычисляется по формуле: 20% от оклада (оклад*0,2).

 

Указания: для создания поля для премии дважды щелкните на ADOTable1, в появившемся окне вызовите контекстное меню и выберите команду New Field.

В новом окне заполните поля: Name=Prem, Component=Prem, Type=Float, FieldType=Calculated и щелкните ОК.

Выделите созданное поле и задайте свойства: Alignment=taCenter, DisplayLabel=Премия.

Для ввода формулы выделите компонент ADOTable и в событии OnCalcFields введите код:

 

procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet);

begin

ADOTable1.FieldByName('prem').Value:=ADOTable1.FieldByName('oklad').Value*0.2;

end;

 

 Для поля "Оклад" установите ограничение: значение поля не может быть менее 700 грн. Если меньше, то выдать сообщение об ошибке и отменить ввод.

 

Указания: для поля "Оклад" нужно ввести ограничение, при котором в поле нельзя вести число меньше 700. Для этого щелкните два раза на компоненте ADOTable1, выделите поле "Oklad" и в его событии OnValidate введите код:

 

procedure TForm1.ADOTable1OkladValidate(Sender: TField);

begin

//если поле меньше 700   

if ADOTable1.FieldByName('oklad').Value<700 then

begin

//выдаем сообщение об ошибке       

Application.MessageBox('Оклад не может быть менее 700 грн','Ошибка ввода',MB_OK+MB_IconStop);

//отменяем ввод      

Abort;

end;

end;

 

На форме разместите две кнопки для добавления и удаления данных.

При этом с помощью кнопки "Добавить" можно ввести нового сотрудника через вспомогательную страничную форму. Кнопка "Удалить" удаляет текущую запись. Двойной щелчок на записи в сетке открывает вспомогательную страничную форму для редактирования данных.

 

Указания: нанесите на форму компонент Button (Standard). В свойстве кнопки Caption укажите текст "Добавить". Данная кнопка добавляет новую запись и открывает ее для редактирования в другой форме (Form2). Для кнопки напишем код:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

//добавляем новую запись

ADOTable1.Append;

//создаем и открываем вспомогательную страничную форму как модальную

form2:=TForm2.Create(nil);

form2.ShowModal;

end;

 

Нанесите на форму компонент Button (Standard). В свойстве кнопки Caption укажите текст "Удалить". Данная кнопка выдает запрос на удаление текущей записи и удаляет ее. При этом если записей нет, то кнопка не реагирует на нажатие. Для кнопки напишем код:

 

procedure TForm1.Button2Click(Sender: TObject);

begin

    //если число записей в таблице не 0

    if ADOTable1.RecordCount >0 then

    //выдаем запрос на удаление данных

    if Application.MessageBox ('Удалить запись?','Запрос на удаление',

                                MB_YesNo+ MB_IconQuestion)=IdYes then

    //удаляем текущую запись

    ADOTable1.Delete;

end;

 

Для редактирования записи нужно будет выполнять двойной щелчок на нужной записи в сетке.

В событии OnDblClick компонента DBGrid, напишем код:

 

procedure TForm1.DBGrid1DblClick(Sender: TObject);

begin

//переводим таблицу в режим редактирования

ADOTable1.Edit;

//создаем и открываем вспомогательную страничную форму как модальную

form2:=TForm2.Create(nil);

form2.ShowModal;

end; 

 

Вспомогательная страничная форма имеет вид:

 

 

 

Указания: добавьте в проект новую форму Form2. Выполните команду "Project-Options". На закладке "Forms" перенесите форму "Form2" в список "Available Forms".

Для формы задайте свойства: Caption=Анкета, BorderStyle=bsDialog, Position=poOwnerForm.

На форму нанесите 6 компонентов DBEdit (DataControls), один компонент DBImage и один компонент DBLookUpComboBox. Для каждого компонента в свойстве DataSource укажите значение Form1.DataSource1, в свойстве DataField укажите имя поля, которое будет отображаться в соответствующем визуальном компоненте.

Разместите компоненты так, как показано на образце формы и подпишите их с помощью компонента Label (Standard).

Форма Form2 будет создаваться в памяти динамически, поэтому необходимо позаботиться о том, чтобы при ее закрытии происходило корректное удаление формы из памяти. Для этого в событии формы OnClose напишем код:

 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//при закрытии страничной формы удалить ее из памяти

Action:=caFree;

end;

 

Фото сотрудника заполняется через диалог выбора графического файла после двойного щелчка на графическом поле.

 

Указания: для компонента DBImage укажите свойства: DataSource=DataSource1, DataField=foto, Stretch=true.

Нанесите на форму компонент OpenPictureDialog (Dialogs) и в событии OnDblClick компонента DBImage напишите код:

 

procedure TForm2.DBImage1Click(Sender: TObject);

begin

//открываем диалог выбора графического файла

if OpenPictureDialog1.Execute = true then

//загружаем в поле "foto" выбранный файл

TBlobField(Form1.ADOTable1.FieldByName('foto')).LoadFromFile(OpenPictureDialog1.FileName);

end;

 

Для использования функции TBlodField подключите в коде формы модуль db.

 

Поле "Дата рождения" заполняется с помощью календаря.

 

Указания: нанесите на форму компонент DateTimePicker (Win32), задайте ему свойство Visible=False и разместите его так, чтобы он по размеру и положению полностью совпадал с полем "Дата рождения".

Как только пользователь ставит курсор в поле "Дата рождения", на месте этого поля должен появляться календарь, и в календарь загружается та дата, которая отображается в поле "Дата рождения".

 

В событии OnEnter поля "Дата рождения" напишем код:

 

procedure TForm2.DBEdit5Enter(Sender: TObject);

begin

//отображаем календарь

DateTimePicker1.Visible:=true;

//отображаем в календаре значение из поля (если поле не пустое)

if DBEdit5.Text<>'' then

DateTimePicker1.Date:=StrToDate(DBEdit5.Text);

//ставим курсор в поле с календарем

DateTimePicker1.SetFocus;

end;

 

Как только пользователь выходит из поля календаря, снова появляется поле "Дата рождения" и в нем отображается дата, выбранная в календаре. Для этого в событии OnExit компонента DataTimePicker напишем код:

 

procedure TForm2.DateTimePicker1Exit(Sender: TObject);

begin

//делаем календарь не видимым

DateTimePicker1.Visible:=false;

//загружаем в поле выбранную в календаре дату

DBEdit5.Text:=DateToStr(DateTimePicker1.Date);

end;

 

Создание выпадающего списка по таблице

 

Поле  "Должность" заполняется с помощью выпадающего списка, который заполняется значениями из вспомагательной таблицы-справочника.

 

Указания: для работы со списком должностей необходимо внести изменения в исходную базу данных. Приведем таблицу sotr к нормальной форме, вынеся поле dolg в отдельную таблицу и установив связь между таблицами.

 Откройте таблицу sotr, удалите из нее поле dolg и добавьте числовое поле id_dolg для связывания. Создайте новую таблицу dolg с полями: id_dolg (счетчик, ключевое), dolg (текстовое). Свяжите две таблицы по полю id_dolg. В таблице dolg введите произвольные названия должностей. В таблице sotr в поле id_dolg введите соответствующие номера должностей. Схема базы данных будет иметь вид:

 

 

Так как в структуру таблицы sotr были внесены изменения, то при запуске программы будет выдаваться ошибка о том, что поле dolg отсутствует (ведь мы его вынесли в отдельную таблицу dolg). Перейдите на главную форму, двойным щелчком откройте компонент ADOTable1, удалите поле dolg и с помощью контекстного меню добавьте поле id_dolg и сделайте его невидимым.

 

Для создания списка-справочника сначала нужно подключить к форме таблицу "Dolg".

Нанесите на форму компонент ADOTable (ADO). В свойстве Connection выберите имя соединения ADOConnection1 , в свойстве TableName выберите таблицу "Dolg".

Для того чтобы программа корректно подключала таблицу в событии формы OnCreate добавьте код:

 

//подключаемся к таблице

ADOTable2.Active:=true;

 

Для того чтобы программа корректно отключала таблицу в событии формы OnDestroy добавьте код:

 

//отключаемся от таблицы

ADOTable2.Active:=false;

 

Нанесите на форму компонент DataSource (Data Access) и задайте свойство Dataset = ADOTable2.

 

Сначала добавим список-справочник в таблицу сотрудников. Двойным щелчком откройте ADOTable1, в контекстном меню выберите команду New Field и задайте параметры: Name = dolg, Type = String, Field Type = Lookup, KeyField = id_dolg (поле, по котрому таблица dolg связана со справочником), Dataset = ADOTable2 (чем заполнять список), Lookup Keys = id_dolg (поле, по которому справочник связан с таблицей sotr), Result Field = dolg (поле из справочника, отображаемое в выпадающем списке). В результате в самой сетке отобразится поле должностей с выпадающем списком. Для размещения этого списка на страничной форме перетащите созданное поле dolg на вторую форму (будет автоматически создан компонент DBLookupComboBox с нужными параметрами)..

 

Кнопка "Сохранить" закрывает окно и сохраняет изменения в таблице. При этом если не заполнено поле "Табельный номер", то сохранение невозможно.

Кнопка "Отменить" закрывает окно и отменяет внесенные изменения.

 

Указания: нанесите на форму компонент Button (Standard). В свойстве Caption укажите текст "Сохранить". Данная кнопка должна сохранять внесенные изменения и закрывать страничную форму. При этом если ключевое поле "Табельный номер" не заполнено, то сохранение записи невозможно. Для кнопки напишем код:

 

procedure TForm2.Button1Click(Sender: TObject);

begin

//если поле "Табельный номер" не пустое

if DBedit1.Text<>'' then

begin

//сохраняем запись

Form1.ADOTable1.Post;

//закрываем страничную форму

Close;

end

//если поле "Табельный номер" пустое

else

begin

//выдаем сообщение об ошибке

Application.MessageBox('Табельный номер не может быть пустым',

                       'Ошибка ввода!',MB_OK+MB_IconStop);

//ставим курсор в поле "Табельный номер"

DBEdit1.SetFocus;

end;

end;

 

Нанесите на форму компонент Button (Standard). В свойстве Caption укажите текст "Отменить". Данная кнопка должна отменять внесенные изменения и закрывать страничную форму. Для кнопки напишем код:

 

procedure TForm2.Button2Click(Sender: TObject);

begin

//отменяем изменения

Form1.ADOTable1.Cancel;

//закрываем страничную форму

Close;

end;

 

Справа от выпадающего списка поля "Должность" создайте кнопку с многоточием, которая будет вызывать дополнительную форму для редактирования списка должностей в таблице dolg. На форме разместите сетку для отображения списка должностей и кнопку "Добавить".

 

Указания: добавьте в проект новую форму Form3. Выполните команду "Project-Options". На закладке "Forms" перенесите форму "Form2" в список "Available Forms".

Для формы задайте свойства: Caption=Анкета, BorderStyle=bsDialog, Position=poOwnerForm.

Форма Form3 будет создаваться в памяти динамически, поэтому необходимо позаботиться о том, чтобы при ее закрытии происходило корректное удаление формы из памяти. Для этого в событии формы OnClose напишем код:

 

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//при закрытии страничной формы удалить ее из памяти

Action:=caFree;

end;

 

Нанесите на форму компонент DBGrid (Data Controls). Данная сетка должна ссылаться на таблицу dolg, которая находится на форме Form1. Чтобы выполнить такую  сылку, необходимо в форме Form3 подключить модуль формы Form1. Для этого выполните команду меню File - Use Unit и выберите модуль Unit1. После этого для сетки на форме Form3 задайте свойство DataSource = Form1.DataSource2.

Под сеткой добавьте кнопку для добавления новой должности. Для кнопки напишите код:

 

procedure TForm3.Button1Click(Sender: TObject);

begin

    //добавляем новую запись в конец таблицы

    Form1.AdoTable2.Append;

end;

 

На форме Form2 справа от выпадающего списка для поля "dolg" добавьте кнопку с многоточием и напишите для нее код вида:

 

procedure TForm2.Button3Click(Sender: TObject);

begin

//создаем в памяти и открываем форму Form3

form3:=TForm3.Create(nil);

form3.ShowModal;

end;