Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие СУБД 2011.pdf
Скачиваний:
68
Добавлен:
10.06.2015
Размер:
2.75 Mб
Скачать

88

Рисунок 14.5. Поле подстановки в действии

Вычисляемые поля

Вновь возвращаемся к примеру. Ещё раз обратимся к всплывающему меню редактора полей tblSALARY и выберем пункт “New Field”. На экран будет вызван редактор, позволяющий создавать новый экземпляр поля.

В нашем случае мы конструируем вычисляемое поле. Для этого в строке Name указываем имя нового поля – CALC_TAX, в строке Type – определяем тип поля Currency. Убедитесь, чтобы в группе переключателей “Field type” была выделена кнопка “Calculated” (см. рисунок 14.6) и нажмите на кнопку ОК. После того, как окно редактора закроется, загляните в инспектор объектов. В нём появился новый объект – поле tblSALARYCALC_TAX, а его свойство FieldKind установилось в состояние fkCalculated.

Рисунок 14.6. Создание вычисляемого поля

Наступил черёд поломать голову над листингом программы. У компонента tblSALARY находим обработчик события OnCalcFields() и внутри его напишем всего одну строку.

procedure TfrmMain.tblSALARYCalcFields(DataSet: TDataSet); begin tblSALARYCALC_TAX.Value:=tblSALARYSALARY.AsCurrency*13/100; end;

Проверьте состояние свойства AutoCalcFields таблицы, оно должно быть установлено в True. Опять “включаем” таблицу (Active:=True) и запускаем проект на выполнение. Теперь отображающая данные сетка DBGrid1 дополнилась новой колонкой, содержащей рассчитанное значение подоходного налога.

© 2011 г. Д.Л. Осипов

89

Организация отношения главная-подчинённая таблица

Один из полезных приёмов, которым владеют компоненты таблицы, и в том числе TADOTable связан с построением отношения главная-подчинённая (master-detail) таблица. Подобное отношение имеется и в нашей демонстрационной БД книжного магазина (см. рис. 14.7). Таблице поставщиков SUPPLIERS подчиняется таблица контрактов CONTRACTS. Отношение подчинённости реализуется через хранящее ключ поставщика ключевое поле SUPPLIER_KEY.

Рисунок 14.7. Отношение “главный-подчинённый” между таблицами

Функциональные возможности компонента TADOTable позволяют формировать отношение главный-подчинённый при желании даже без единой строки кода. Для претворения такого плана в жизнь достаточно помнить о существовании свойств: MasterSource и MasterFields. Все перечисленные свойства имеют прямое отношение к подчинённой таблице и настраиваются в строгой последовательности. В первую очередь в свойстве:

property MasterSource: TDataSource;

указывается на подключенный к главной таблице источник данных (компонент TDataSource). Затем программист определяет перечень полей, участвующих в организации взаимодействия между таблицами. Для этого в свойстве:

property MasterFields: String;

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

Для практического претворения в жизнь нашего замысла можете взять за основу один из разработанных в прошлой главе проектов. Благо он уже обучен подключаться к хранилищу данных. Добавьте к предыдущей разработке новую форму и следующий перечень компонентов (см. рис 14.8):

две таблицы TADOTable. Переименуйте первую таблицу в tblSUPPLIERS, этот компонент станет обслуживать таблицу поставщиков. Вторую таблицу назовём tblCONTRACTS, мы позднее подключим этот компонент к таблице контрактов.

два источника данных TDataSource. Первый источник переименуем в dsSUPPLIERS и в инспекторе объектов подключаем к таблице поставщиков (свойство DataSet:= tblSUPPLIERS). Второй источник называем dsCONTRACTS и присваиваем свойству DataSet:= tblCONTRACTS.

две сетки TDBGrid. Сетки позволят нам увидеть содержимое таблиц. Первый компонент называем dbgSUPPLIERS и располагаем в левой части формы. Подключаем сетку к источнику данных dsSUPPLIERS (свойство DataSource:= dsSUPPLIERS). Оставшаяся сетка получит имя dbgCONTRACTS, свойство DataSource:=dsCONTRACTS.

©2011 г. Д.Л. Осипов

90

Рисунок 14.8. Форма, демонстрирующая отношение главный-подчинённый

Переименуйте форму в frmSuppliersContracts и найдите событие OnShow() вызываемое в момент вывода формы на экран и внесите в него следующие строки кода.

procedure TfrmSuppliersContracts.FormShow(Sender: TObject); begin

with tblSUPPLIERS do begin

Connection:=frmDM.ADOConnection1;

TableName:='SUPPLIERS';

Open; end;

with tblCONTRACTS do begin

Connection:=frmDM.ADOConnection1;

TableName:='CONTRACTS';

MasterSource:=dsSUPPLIERS; MasterFields:='SUPPLIER_KEY'; Open;

end; end;

Программа готова. Запустите приложение на выполнение внимательно проследите за его работой. Выбор в сетке dbgSUPPLIERS того или иного поставщика приводит к автоматическому отображению в сетке dbgCONTRACTS сведений о заключённых с ним контрактов.

Задание

Дополните ваш проект БД примерами:

1.полей подстановки.

2.вычисляемых полей.

3.отношением главная таблица — подчинённая таблица.

При разработке приложения рекомендуется воспользоваться следующими компонен-

тами: TADOTable, TDataSource, TDBNavigator и TStringGrid.

© 2011 г. Д.Л. Осипов

91

XV. Вторичные индексы, поля BLOB

Вид занятия – лабораторное занятие. Время занятия – 2 часа.

Индекс представляет собой часть БД, в нём содержится информация об организации данных в таблицах БД. Индекс аналогичен предметному указателю, обычно приводимому в конце книги. Благодаря нему, при поиске нужной информации исключается необходимость полистного просмотра книги.

Индекс отвечает за ускорение процесса сортировки и поиска записей в наборе данных.

Различают первичные и вторичные индексы. Первичный индекс это ничто иное, как первичный ключ таблицы – он гарантированно содержит уникальные значения для всех записей в таблице. Если поле (поля) индексирования не является первичным ключом, то оно называется вторичным индексом.

Особенности набора данных при работе с вторичными индексами

Одна и та же таблица вправе обзавестись некоторым перечнем вторичных индексов. Но в один и тот же момент времени таблица имеет право пользоваться услугами одного единственного индекса.

Для выяснения списка имён доступных индексов вызывается процедура: procedure GetIndexNames(List: TStrings);

Перечень имеющихся в наличии индексов процедура возвратит в набор строк List.

Подключение индексов по его имени или по названиям входящих в индекс полей осуществляется с помощью свойств:

property

IndexName: WideString;

//имя индекса

property

IndexFieldNames: string;

//поля индекса

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

procedure TForm1.ADOTable1AfterOpen(DataSet: TDataSet); begin

ADOTable1.GetIndexNames(ComboBox1.Items); //сбор индексов end;

procedure TForm1.ComboBox1Change(Sender: TObject); begin

if ComboBox1.ItemIndex<>-1 then ADOTable1.IndexName:=ComboBox1.Items.Strings[ComboBox1.ItemIndex]; end;

Сразу после соединения с таблицей (в момент возникновения события AfterOpen()) производится сбор имён индексов в комбинированный список ComboBox1. Теперь пользователь приобрёл право определить нужный ему режим сортировки данных, для этого он просто выбирает требуемый индекс из списка ComboBox1.

© Осипов Д.Л., 2011