На этот раз хотел бы поговорить о связанных таблицах в БД MS Access. Статья, возможно не новая, но кто часто работает с БД, тому, возможно, будет полезная. В ней расскажу, как я связываю таблицы между собой. По крайней мере, я пользуюсь двумя способами, об одном я расскажу в теоретическом плане, с практикой проблем тут не должно возникнуть, а второй способ, немного рассмотрим и практики.
Для начала, нам необходимо создать базу данных и как минимум две таблицы, которые мы и будем связывать между собой.
В моей БД две таблицы с именами — Таблица1 и Таблица2. Я создам таблицу с фамилиями, а вторая таблица будет с названиями автомобилей. То есть, у каждого владельца, может быть несколько автомобилей (всем бы так). Вот так мы и свяжем наши таблицы. Отношение связи, тут получается, один ко многим. Насколько я помню, бывают следующие типы отношений:
- один ко многим
- многие ко многим
- один к одному
Это так, что сейчас вспомнилось. Ну а теперь, посмотрим на структуры наших таблиц.
Таблица1. Структура.
Таблица2. Структура.
Теперь, нам необходимо связать эти две таблицы в MS Access. Поле id Таблицы2 предназначено для хранения идентификаторов записей из Таблицы1. По ним будет распознаваться, какая запись из Таблицы2 принадлежит записи из Таблицы1.
Для того, чтобы связать наши таблицы, необходимо перейти в Схему данных, добавить наши таблицы и связать следующие поля ,отношением — один ко многим:
Если в БД MS Access добавлять теперь записи, то для каждой фамилии можно добавлять сколько угодно автомобилей, а если выбрать определенную запись, то покажется список автомобилей для данного человека.
В нашем проекте будет что-то похожее, давайте же приступим к нему. На форме у меня следующие компоненты:
- TADOConnection
- TADOTable — 2 шт
- TDBGrid — 2 шт
- TDataSource — 2 шт
- TEdit
- TButton
По поводу подключения к БД, смотрим статью. Ну, а дальше самое интересное. Нам необходимо связать наши компоненты. Выделяем компоненты TADOTable и в каждом, в свойстве Connection, указываем компонент TADOConnection. Дальше выделяем DBGrid1 и связываем его с DataSource1, в свойстве DataSource. Компонент DataSource1, в свойстве DataSet, указываем AdoTable1. Все готово, одна таблица связана, это будет наша главная таблица, а точнее с имена и фамилиями автовладельцев.
Дальше нашу главную таблицу необходимо активировать. Выделяем AdoTable1, в свойстве TableName выбираем Таблица1 и свойство Active устанавливаем в True.
Все, теперь главная таблица полностью готова. Теперь приступим к подчиненной.
Выделяем компонент DBGrid2 и в свойстве DataSource связываем его с компонентом DataSource2, а компонент DataSource2, в свойстве DataSet, связываем с компонентом AdoTable2.
Все, теперь выделяем компонент AdoTable2 и в свойстве TableName выбираем Таблица2, в свойстве MasterSource выбираем DataSource1 (в данном случае необходимо выбрать тут TDataSource главной таблицы, то есть главную таблицу).
Дальше, в свойстве MasterFields, компонента AdoTable2 (подчиненной таблицы), мы указываем связующие поля, следующим образом:
Все, когда у нас все настроено, также активируем данную таблицу, свойство Active устанавливаем в True.
Все, если у Вас есть какие-то данные в Ваших таблицах, то можете запустить проект и выделить запись из главной таблицы, и Вы увидите, что автоматически в DBGrid2 для данной записи из главной таблицы выводятся записи из подчиненной таблицы. Это очень удобно. Добавлять записи необходимо также, выделяем запись из главной таблицы и только после этого, необходимо добавлять запись в подчиненную таблицу.
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable2.Insert;
ADOTable2.FieldByName('auto').AsString:=Edit1.Text;
ADOTable2.Post;
end;
Что касается еще одно метода, связывания таблиц, то тут также все просто. Необходимо все самому отслеживать: для какой записи из основной таблицы добавляется запись подчиненной таблицы, что добавляется и самому записывать идентификатор основной таблицы в подчиненную, а затем уже, по выделенной записи (получать ее идентификатор), делать выборку записей из подчиненной таблицы.
Исходник, можно скачать тут