Вы находитесь на странице: 1из 9

Лабораторная работа №18

Вычисляемые и подстановочные поля

Тема: Вычисляемые и подстановочные поля в базе данных


Цель: Ознакомление с механизмами поиска данных, фильтрации записей и
использование индексов для сортировки.
Оборудование: IBM – совместимые компьютеры.
Место проведения: Компьютерный класс.
Техника безопасности: См. инструкцию.

Выполнение работы:
Для изучения свойств полей разработаем базу данных, состоящую из двух
таблиц, и приложение, работающее с ней. Результатом станет приложение -
меню для столовой, кафе или ресторана.

Разработать главную таблицу Food с полями указанными в таблице 1.

Таблица 1. Поля таблицы Food

Имя
Тип Описание
поля:

FKey счетчик Ключевое поле, служит счетчиком блюд.

FName текстовый Текстовое поле размером 30, название блюда.

FType числовой Поле служит для связи с подчиненной таблицей, в


которой хранятся названия типов (супы, напитки, салаты
и т.п.)

FVeget логический Логическое поле - вегетарианская еда, или нет.


Потребуется для изучения свойств логических полей.

FCena числовой Стоимость блюда.


Подчиненная таблица Tips с полями значения, которых указаны в таблице 2:

Таблица 2. Поля таблицы Tips

Имя
Тип Описание
поля:

TKey счетчик Ключевое поле, служит счетчиком


типов.

TName текстовый Текстовое поле размером 20, название


типов.

Сохранить полученные таблицы в базе данных Menu в формате *.mdb

Загрузить среду Delphi.

Свойству Name главной формы присвойте имя fMain, сохраните модуль


формы как Main, а проект в целом как MyMenu. В свойстве Caption формы
напишите "Изучение свойств полей".

На форму установить компонент Panel с вкладки Standard, свойство


Alignустановите в alTop. Ниже с вкладки Data Controls установите
компонент DBGrid, в свойстве Align которого выберите alClient, чтобы
заполнить оставшееся пространство.

Затем на панель установите простую кнопку, в свойстве Caption которой


напишите "Типы блюд". У вас должна получиться такая форма:
Рис. 18.1 Главная форма проекта

Раз у нас еще будет форма с типами блюд, следовательно, понадобится


и модуль данных, общий для всех форм. Выберите команду File -> New-
> Data Module. В свойстве Name модуля укажите fDM и сохраните модуль
под именем DM.

Добавить в модуль компонент ADOConnection с вкладки ADO


палитры компонентов. Этот компонент обеспечит связь других компонентов
с базой данных при помощи механизма ADO. Связь обеспечивается
свойством компонента ConnectionString.

Щелкнуть дважды по свойству ConnectionString


компонента ADOConnection и установить связь с базой данных Menu.mdb.

Нажмите кнопку "Проверить подключение". Если вышло сообщение


"Проверка подключения выполнена", значит, вы все сделали правильно, и
ошибок нет.

Нажимаем кнопку "ОК", чтобы подтвердить подключение, и еще раз "ОК",


чтобы закрыть окно подключений. Сразу же свойство LoginPrompt
компонента ADOConnection переводим в False, чтобы каждый раз при
подключении программа не запрашивала имя пользователя и пароль.
Далее с вкладки ADO устанавливаем два компонента ADOTable. Выделите
оба компонента, и в их свойстве Connection выберите ADOConnection.
Займемся вначале первой таблицей. В свойстве TableName выберите
таблицу Food, свойство Name переименуйте в FoodT, а свойство Active
переведите в True. Для второго компонента ADOTable выберите таблицу
Tips, а компонент переименуйте в TipsT. Также переведите Active в True.
Далее рядом с таблицами установите два компонента DataSource с
вкладки Data Access. Первый переименуйте в FoodDS, второй - в TipsDS. В
свойстве DataSet каждого выберите соответствующую таблицу.

Не забудьте сохранить проект.

Перейдите на главную форму. Командой File -> Use unit подключитесь к


созданному модулю данных.

В свойстве DataSource сетки DBGridвыберите fDM.FoodDS. На сетке должны


появиться столбцы с данными. Нажмите кнопку Run на панели инструментов
или горячую клавишу F9.

Теперь перейдите на окно модуля данных, щелкните дважды по компоненту


FoodT, чтобы вызвать редактор полей. Затем щелкните по окну редактора
правой кнопкой и выберите команду Add all fields (Добавить все поля). То же
проделайте и со второй таблицей.

Снова сохраните проект, скомпилируйте его и запустите.


Программа запускается и выполняется нормально.

Далее создадим еще одну форму, для редактирования типов блюд:

Рис. 18.2. Форма редактора типов блюд


Форму назовите fMyTypes, сохраните модуль как MyTypes. Чтобы убрать из
окна лишние кнопки системной строки и не позволять пользователю менять
размеры окна, в свойстве BorderStyle формы выберите значение bsDialog.

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


кнопки, поле DBEdit с вкладки Data Controls и сетка DBGrid с этой же
вкладки. В свойстве DataSource и сетки, и поля выберите fDM.TipsDS. У
поля DBEdit, кроме того, в свойстве DataField выберите поле TName.

Дважды нажимаем на верхнюю кнопку, и в обработчике пишем код:

//добавляем запись:
fDM.TipsT.Append;
//переводим фокус:
DBEdit1.SetFocus;

В коде обработки нижней кнопки просто закрываем окно:

Close;

Однако нам нужно убедиться, что если изменения в таблице были, и


пользователь желает их сохранить, то они сохраняются. Поскольку мы не
знаем точно, каким образом пользователь закроет это окно, придется для
проверки сгенерировать событие onClose для формы:

{если изменения есть, спросим что с ними делать. если пользователь


не желает их сохранять, отменяем изменения. иначе сохраняем: }
if fDM.TipsT.Modified then
if Application.MessageBox('Данные изменены! Сохранить?',
'Внимание!', MB_YESNO+MB_ICONQUESTION) <> IDYES then
fDM.TipsT.Cancel
else fDM.TipsT.Post;

Далее переходим на главную форму, командой File -> Use Unit подключаем
модуль MyTypes, дважды щелкаем по кнопке "Типы блюд" и в
сгенерированном событии вызываем новый модуль:

fMyTypes.ShowModal;

Сохраните проект, скомпилируйте его и впишите 5-10 типов блюд, например,


"Напитки", "Супы", "Салаты" и т.п. Это нам будет нужно для
подстановочного поля.

Разработаем форму для редактирования основной таблицы. Командой File -


> New -> Form или аналогичной кнопкой на панели инструментов создайте
новую форму. В свойство Caption этой формы впишите "Редактирование
блюда", в свойстве Name укажите fEditor, а модуль сохраните как Editor.
Сразу же командой File -> Use Unit подключите к этой форме модуль данных
DM. Форма будет выглядеть так:

Рис. 18.3. Форма редактора блюда

Как видно из рисунка, на форме присутствуют поясняющие компоненты


Label, три компонента DBEdit, один DBLookupComboBox, один DBNavigator и
кнопка BitBtn, в свойстве Kind которой выбрано значение bkClose.

Компонент DBLookupComboBox немного сложней остальных. Это


подстановочный компонент. Из основной таблицы Food он будет брать целое
число - значение поля FType. А из дочерней таблицы Tips этот компонент
будет просматривать все значения поля TName. Когда пользователь выберет
какой-нибудь тип блюда, целое число, соответствующее ключевому
полю TKey, попадет в поле FType главной таблицы. Таким образом, у нас
получилась связь один-ко-многим (многие блюда основной таблицы могут
иметь одинаковый тип):

Рис. 18.4. Связь между таблицами

Для установки связи между таблицами выполним следующие действия.

Выделите все компоненты, относящиеся к редактированию данных или


перемещению по ним (начинающиеся на DB …), и в их свойстве DataSource
выберите fDM.FoodDS. Затем с помощью свойства DataField подключите
все DBEdit к соответствующему полю таблицы.

У компонента DBLookupComboBox установите следующие значения:

Таблица 3 . Значения свойств компонента DBLookupComboBox

Свойство Значение

DataSource fDM.FoodDS

DataField FType

ListSource fDM.TipsDS

KeyField TKey

ListField TName

Как видно из таблицы, компонент DBLookupComboBox имеет такие важные


свойства:

 DataSource - свойство содержит ссылку на компонент TDataSource,


связанный с основной таблицей.
 DataField - свойство указывает на имя ссылочного поля основной таблицы.
В это поле после выбора значения из списка DBLookupComboBox попадает
значение ключевого поля подстановочной таблицы.
 ListSource - свойство содержит ссылку на компонент TDataSource,
связанный с подстановочной (дочерней) таблицей.
 KeyField - свойство содержит имя ключевого поля подстановочной
таблицы. По этому полю ищется нужная подстановочная запись.
 ListField - свойство содержит имя поля подстановочной таблицы, по
которому формируется список значений DBLookupComboBox. Эти значения
также можно подставлять в основную таблицу в
виде lookup (подстановочного) поля.

Если говорить еще проще, то при открытии основного и подстановочного


наборов данных, компонент DBLookupComboBox соединяется с
подстановочной таблицей, указанной в свойстве ListSource, и формирует
список значений из поля, указанного в ListField. Далее, при редактировании
основной таблицы, пользователь выбирает из списка
DBLookupComboBox одно из значений. При этом DBLookupComboBox
смотрит, какое значение выбранной записи в подстановочной таблице имеет
ключевое поле KeyField. Как правило, это целое число. Это число
DBLookupComboBox и заносит в ссылочное поле основной таблицы
DataField. Похожим образом действует и компонент DBLookupListBox,
разумеется, учитывая специфику компонента.

Форма fEditor предназначена для редактирования имеющегося блюда или


добавления нового, в зависимости от того, каким способом вызвали форму.
Поэтому здесь нам нужно лишь создать код для события закрытия формы
onClose, куда пропишем:

if fDM.FoodT.Modified then
if Application.MessageBox('Данные изменены! Сохранить?',
'Внимание!', MB_YESNO+MB_ICONQUESTION) <> IDYES then
fDM.FoodT.Cancel
else fDM.FoodT.Post;

Перейдем на главную форму. Командой File -> Use Unit добавим к главной
форме новое окно. Пользователь должен иметь возможность редактировать
имеющуюся запись, поэтому сгенерируем событие onDblClick для
сетки DBGrid1, и пропишем туда следующий код:

fEditor.ShowModal;

Рядом с кнопкой "Типы блюд" добавим еще одну кнопку "Добавить блюдо".
Сгенерируйте событие нажатия на эту кнопку и пропишите такой код:

fDM.FoodT.Append;
fEditor.ShowModal;

Как видите, отличие кода заключается лишь в том, что при нажатии на
кнопку добавляется новая запись, открывается редактор и пользователь
редактирует ее. А если он дважды щелкнет по записи на сетке, то откроется
тот же редактор, в который будет загружена текущая запись. Впрочем,
благодаря навигатору DBNavigator, пользователь и там имеет возможность
перемещаться по записям, добавлять или удалять записи.

Мы, собственно, получили далекую от идеала, но вполне работоспособную


программу. Сохраните проект, скомпилируйте и введите для примера
несколько блюд:
Рис. 18.5. Программа в действии

Как видите, программа имеет множество недостатков: пользователь видит


совершенно ненужные ему ключевые поля, в сетке он видит лишь номер типа
блюда, но не видит название этого типа. В поле FVeget ему вручную
приходится писать True или False вместо привычных Да/Нет. Еще
недостаток: названия полей в сетке соответствуют названиям полей в
таблице, а поле " FType " или " FVeget " мало что скажет пользователю.
Исправлением этих недостатков займемся в следующей лекции, вместе с
изучением свойств полей.

Студент должен знать: Основные положения теории баз данных, хранилищ


данных, баз знаний, создание базы данных

Студент должен уметь: Создавать объекты баз данных в современных


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