Практическое занятие № 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 отсутствует (ведь мы его вынесли в отдельную таблицу 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;