На этот раз хотел бы поговорить о связанных таблицах в БД 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;
Что касается еще одно метода, связывания таблиц, то тут также все просто. Необходимо все самому отслеживать: для какой записи из основной таблицы добавляется запись подчиненной таблицы, что добавляется и самому записывать идентификатор основной таблицы в подчиненную, а затем уже, по выделенной записи (получать ее идентификатор), делать выборку записей из подчиненной таблицы.
Исходник, можно скачать тут
Если Вы хотите в своей квартире или в своем доме сделать еще более красивый интерьер, то в этом Вам помогут итальянские двери Дариано Порте, которые отличаются качеством, а такжце ценой, что очень важно в настоящее время. А установят Вам самые лучшие специалисты в кратчайший срок.
Похожие записи
Метки: Access, Ado, MS Access, Связанные таблицы
Выражаю огромную благодарность за этот пост. Ты мне жизнь спас! ))
пол нета перерыл, ничего путного не нашел. думал уже по корявому передавать выбраные id с первой таблицы и делать запросом поиски по второй.
крепкого здорвья тебе и много полезных тем на данном блоге!
всегда пожалуйста!
Суперский урок. Можно дофига интересных вещиц реализовать таким способом. Спасибо.
Table2.Id -> Table2.Table1Code выглядело бы красивше.
возможно, спасибо!
Спасибо!
Основное понятно. Но как быть, если вместо ADOTable использовать ADOQuery — для него свойства MasterSource я не нашел…
Используйте TADoQuery тоже самое что и TAdoTable, только еще можно и запросы использовать
в adoquery не могу найти свойство masterfields где можно связать таблицы
какая у вас версия IndY?
Здравствуйте, подскажите пожалуйста, как вывести в Label количество строк в определенной таблице? Буду очень благодарен.
Label.Caption:=IntToStr(Table.RecordCount);
Народ подскажите у меня есть 3 формы с DbGrid мне надо в каждом вывести отдельную таблицу,которая хранится в базе данных ms acess(т.е там 3 таблицы).Подскажите как сделать,еще надо чтобы связи работали. Сразу предупреждаю то что все остальное в программе уже реализованно через ADOQuery и желательно через него сделать,но вот как ?
Вам необходимо просто свой AdoQuery подключить к нужной таблицы и связать его с нужным DbGrid и все у Вас будет отображаться
Статья для чайников, как говорится. Автору конечно респект, что не поленился создать велосипед…
этот блог и создан в основном для новичков
Добрый день, Вы говорили про компонент Tadoquery, не могу его найти в Delphi 7, я его плохо ищу или нужно дополнительно скачивать?
Мне именно нужно с запросами…
он на вкладке ADO, так что ищите внимательно, в более новых версиях Delphi они на вкладке dbGO, скачивать не надо, они идут с пакетом Delphi
Что использовать в ADOQuery вместо свойства MasterSource ? Скажите, пожалуйста… И еще, что делать, если у меня несколько связанных таблиц и в зависимости от выбора, мне нужно вывести ту или иную связанную таблицу вместе с основной..
Каким образом у Вас связпаны таблицы?
*на одной и той же форме..
Отличный пост для новичков, кем я сейчас и явзяюсь;). Очень хотелось бы увидеть пост про связанные таблицы и DBLookupComboBox.
Здравствуйте! у меня вот вопрос, вы связали таблицы, вот на счет компонентов ADOConnection у вас только одна? или две ставить?
TADOConnection
TADOTable — 2 шт
TDBGrid — 2 шт
TDataSource — 2 шт
TEdit
TButton
вот это все я поставил. вопрос только с ADOConnection…???
Если база одна, то и AdoConnection один
Здравствуйте, нужна помощь. Есть 2 связанных в access таблицы. С помощью запроса вывожу данные из двух этих таблиц в один DBGrid. Все хорошо, проблема в следующем: пытаюсь написать добавление данных в таблицу, все получается, в access данные добавляются, но при повторном запуске приложения этих данных в DBGrid нет(так так id автора таблицы «авторы» не добавляется автоматически в таблицу «книги» ) как это исправить?? мой мэйл , программу выкладываю, напишите, пожалуйста, на почту, если поможете
http://hdd.tomsk.ru/desk/lrnuyjhx вот прога
Здраствуйте. Очень нужна Ваша помощь. Как реализовать в компоненте dbGrid выпадающий список на примере двух таблиц, связанных в аксесе 1 ко многим. И можно ли сделать так с несколькими полями? Перерыл уже кучу форумов, но нужного результата не добился. Очень надеюсь на Вашу помощь. Заранее спасибо.
Проверьте наличие примера к статье
https://zaokomtek.ru/files/masterfields (отсутствует файл)
и к слову, возможно для начинающих создать ликбез по язику SQL.
язык SQL, он, как говорится и в Африке SQL, так что по нем информации полно! он применяется везде одинаково!
Просто просмотрев большинство комментариев к вашим урокам, напрашивается вивод, что люди спрашивают об основах SQL, а уже потом об работе с компонентами. Но єто мое впечатление.
я могу создать краткий мануал по основам SQL, если конечно это так необходимо!
Думаю, что большинство начинающих изучая Ваши уроки, с большим удовольствием заполнили и етот пробел в своих знаниях. Думаю больше внимания надо уделить различию запросов, реализации их через Дельфи. Также заметил, что читатели не обратили внимание что при фильтрации записей нужно создавать фильтр так, чтоб получалось логическое значение.
К тому же у вас хорошо виходит виделять главное и подбирать примери.
Спасибо.
Спасибо, я учту Ваши пожелания!
вот красава, Андрей! никто так не смог объяснить, как ты. от души благодарю за разъяснение!
незачто, рад что понравилась статья и помог Вам!
Статья хорошая только вот у меня как обычно ничего не получилось. Вроде всё по пунктам шло отлично но когда запускаю никакого результата только в первом Гриде выводится таблица и при нажатии ни-че-го.
Можете исходник перезалить? или на мою почту выслать.. буду очень благодарен.
Здравствуйте, а как можно связать много таблиц? У меня имеется 9 таблиц. Первая таблица главная, а остальные подчиненные. Жду вашего ответа. Заранее большое спасибо!
>>Andrey:
04.06.2013 в 2:11 пп
я могу создать краткий мануал по основам SQL, если конечно это так необходимо!
Если есть возможность то создайте пожалуйста! Смотрю сколько информации по работе с ADOTable и ADOQuery, и понимаю что нужно учить SQL, но с чего начать не знаю.
И вопрос, как сделать в делфи экспорт БД в Excel не прибегая к помощи FastReport. Спасибо заранее.
Фуууух… ну наконец-то получилось!!! Выражаю огромную благодарность автору данной статьи за помощь. Благославений.
Кто подскажет как связано поле «Страна» з таблицей в програме Personal Video Database. И как можно выбрать несколько значений из списка в компоненте DBComboBox как в етой програме в етом поле. Общем подскажите пожалуста де есть такая информация или скиньте урок. Буду очень благодарен.