- •Введение
- •Содержание
- •1. Файловые системы
- •История развития
- •Файловые системы, принципы построения
- •Работа с типизированным файлом
- •Недостатки файловых систем
- •Задание
- •Реляционная таблица
- •Определение домена
- •Создание таблиц в среде Microsoft Access
- •Задание
- •Реляционные ключи
- •Связь между таблицами
- •Обеспечение целостности данных
- •Построение схемы данных средствами Microsoft Access
- •Мастер подстановок
- •Задание
- •Концепция ER-модели
- •Задание
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (BCNF)
- •Четвёртая нормальная форма (4NF)
- •Пятая нормальная форма (5NF)
- •Задание
- •Выборка значений из таблиц – SELECT
- •Порядок сортировки – ORDER BY
- •Ограничение набора данных – WHERE
- •Предикат существования EXISTS
- •Агрегатные функции
- •Группировка данных – Group By
- •Псевдонимы столбцов
- •Псевдонимы таблиц
- •Объединение нескольких таблиц
- •Построение запросов в среде Microsoft Access
- •Задание
- •Вставка новой записи – INSERT
- •Редактирование данных – UPDATE
- •Удаление записей – DELETE
- •Задание
- •Основные типы данных SQL-92
- •Язык определения данных – DDL
- •Задание
- •Подготовка отчёта в среде Access
- •Задание
- •3-х уровневая архитектура ANSI-SPARC
- •Создание форм для ввода данных в Microsoft Access
- •Задание
- •Строка соединения ADO
- •Соединение с хранилищем данных, компонент TADOConnection
- •Установка соединения
- •Пример соединения без регистрации пользователя
- •Информирование о БД
- •Задание
- •Базовый класс доступа к данным TDataSet
- •Открытие и закрытие набора данных
- •Обновление набора данных
- •Перемещение по набору данных
- •Создание закладок и переход к закладке
- •Редактирование записей в наборе
- •Фильтрация набора данных
- •Организация поиска данных
- •Взаимодействие с элементами управления данными
- •Задание
- •Поле таблицы – класс TField
- •Классификация полей по функциональному назначению
- •Классификация полей по типу обслуживаемых данных
- •Обращение к отдельному объекту-полю
- •Задание
- •Поля подстановки
- •Вычисляемые поля
- •Организация отношения главная-подчинённая таблица
- •Задание
- •Поля BLOB
- •Задание
- •Источник данных – компонент TDataSource
- •Общие черты компонентов отображения данных
- •Сетка базы данных – компонент TDBGrid
- •Статический текст – компонент TDBText
- •Строка ввода БД – компонент TDBEdit
- •Многострочный текстовый редактор БД – TDBMemo
- •Изображение БД – компонент TDBImage
- •Список БД – TDBListBox
- •Комбинированный список БД – TDBComboBox
- •Флажок БД – TDBCheckBox
- •Радиогруппа БД – TDBRadioGroup
- •Компонент – TDBCtrlGrid
- •Навигатор – TDBNavigator
- •Задание
- •Создание базы данных
- •Удаление базы данных
- •Создание таблиц
- •Пример создания таблиц средствами Transact SQL
- •Создание представлений
- •Задание
- •Определение и использование переменных
- •Операторы управления Transact-SQL
- •Базовые функции Transact-SQL
- •Хранимые процедуры
- •Триггеры
- •Задание
- •Запрос TADOQuery
- •Хранимая процедура TADOStoredProc
- •Транзакции и их изоляция
- •Управление транзакциями и компонент TADOConnection
- •Задание
- •Построение простейшего документа XML
- •Атрибуты
- •Определение документа DTD
- •Задание
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