На этот раз хотел бы поговорить о связанных таблицах в БД 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.

Обязательно, свойство Connected компонента TADOConnection, должно быть установлено в 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;

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

Исходник, можно скачать тут


Если Вы хотите в своей квартире или в своем доме сделать еще более красивый интерьер, то в этом Вам помогут итальянские двери Дариано Порте, которые отличаются качеством, а такжце ценой, что очень важно в настоящее время. А установят Вам самые лучшие специалисты в кратчайший срок.


Метки: , , ,




К записи “Работа с ADO в Delphi. Часть 9. Связанные таблицы” оставлено комментариев: 36.

  1. radar:

    Выражаю огромную благодарность за этот пост. Ты мне жизнь спас! ))
    пол нета перерыл, ничего путного не нашел. думал уже по корявому передавать выбраные id с первой таблицы и делать запросом поиски по второй.
    крепкого здорвья тебе и много полезных тем на данном блоге!

  2. zerdalert:

    Суперский урок. Можно дофига интересных вещиц реализовать таким способом. Спасибо.
    :)

  3. ASta:

    Table2.Id -> Table2.Table1Code выглядело бы красивше.

  4. Evgenous:

    Спасибо!
    Основное понятно. Но как быть, если вместо ADOTable использовать ADOQuery — для него свойства MasterSource я не нашел…

  5. Александр:

    Здравствуйте, подскажите пожалуйста, как вывести в Label количество строк в определенной таблице? Буду очень благодарен.

  6. Владислав:

    Народ подскажите у меня есть 3 формы с DbGrid мне надо в каждом вывести отдельную таблицу,которая хранится в базе данных ms acess(т.е там 3 таблицы).Подскажите как сделать,еще надо чтобы связи работали. Сразу предупреждаю то что все остальное в программе уже реализованно через ADOQuery и желательно через него сделать,но вот как ?

    • Andrey:

      Вам необходимо просто свой AdoQuery подключить к нужной таблицы и связать его с нужным DbGrid и все у Вас будет отображаться

  7. Алексей:

    Статья для чайников, как говорится. Автору конечно респект, что не поленился создать велосипед…

  8. Олег:

    Добрый день, Вы говорили про компонент Tadoquery, не могу его найти в Delphi 7, я его плохо ищу или нужно дополнительно скачивать?
    Мне именно нужно с запросами…

    • Andrey:

      он на вкладке ADO, так что ищите внимательно, в более новых версиях Delphi они на вкладке dbGO, скачивать не надо, они идут с пакетом Delphi

  9. AngelOfTheNight:

    Что использовать в ADOQuery вместо свойства MasterSource ? Скажите, пожалуйста… И еще, что делать, если у меня несколько связанных таблиц и в зависимости от выбора, мне нужно вывести ту или иную связанную таблицу вместе с основной..

  10. AngelOfTheNight:

    *на одной и той же форме..

  11. nixonn:

    Отличный пост для новичков, кем я сейчас и явзяюсь;). Очень хотелось бы увидеть пост про связанные таблицы и DBLookupComboBox.

  12. Абай:

    Здравствуйте! у меня вот вопрос, вы связали таблицы, вот на счет компонентов ADOConnection у вас только одна? или две ставить?

    TADOConnection
    TADOTable — 2 шт
    TDBGrid — 2 шт
    TDataSource — 2 шт
    TEdit
    TButton
    вот это все я поставил. вопрос только с ADOConnection…???

  13. Anton:

    Здравствуйте, нужна помощь. Есть 2 связанных в access таблицы. С помощью запроса вывожу данные из двух этих таблиц в один DBGrid. Все хорошо, проблема в следующем: пытаюсь написать добавление данных в таблицу, все получается, в access данные добавляются, но при повторном запуске приложения этих данных в DBGrid нет(так так id автора таблицы «авторы» не добавляется автоматически в таблицу «книги» ) как это исправить?? мой мэйл , программу выкладываю, напишите, пожалуйста, на почту, если поможете
    http://hdd.tomsk.ru/desk/lrnuyjhx вот прога

  14. Вячеслав:

    Здраствуйте. Очень нужна Ваша помощь. Как реализовать в компоненте dbGrid выпадающий список на примере двух таблиц, связанных в аксесе 1 ко многим. И можно ли сделать так с несколькими полями? Перерыл уже кучу форумов, но нужного результата не добился. Очень надеюсь на Вашу помощь. Заранее спасибо.

  15. Володимир:

    Проверьте наличие примера к статье
    https://zaokomtek.ru/files/masterfields (отсутствует файл)
    и к слову, возможно для начинающих создать ликбез по язику SQL.

    • Andrey:

      язык SQL, он, как говорится и в Африке SQL, так что по нем информации полно! он применяется везде одинаково!

      • Володимир:

        Просто просмотрев большинство комментариев к вашим урокам, напрашивается вивод, что люди спрашивают об основах SQL, а уже потом об работе с компонентами. Но єто мое впечатление.

        • Andrey:

          я могу создать краткий мануал по основам SQL, если конечно это так необходимо!

          • Володимир:

            Думаю, что большинство начинающих изучая Ваши уроки, с большим удовольствием заполнили и етот пробел в своих знаниях. Думаю больше внимания надо уделить различию запросов, реализации их через Дельфи. Также заметил, что читатели не обратили внимание что при фильтрации записей нужно создавать фильтр так, чтоб получалось логическое значение.
            К тому же у вас хорошо виходит виделять главное и подбирать примери.
            Спасибо.

          • Andrey:

            Спасибо, я учту Ваши пожелания!

  16. Sheeby:

    вот красава, Андрей! никто так не смог объяснить, как ты. от души благодарю за разъяснение!

  17. Gigson:

    Статья хорошая только вот у меня как обычно ничего не получилось. Вроде всё по пунктам шло отлично но когда запускаю никакого результата только в первом Гриде выводится таблица и при нажатии ни-че-го.
    Можете исходник перезалить? или на мою почту выслать.. буду очень благодарен.

  18. Абикон:

    Здравствуйте, а как можно связать много таблиц? У меня имеется 9 таблиц. Первая таблица главная, а остальные подчиненные. Жду вашего ответа. Заранее большое спасибо!

  19. Александр:

    >>Andrey:
    04.06.2013 в 2:11 пп
    я могу создать краткий мануал по основам SQL, если конечно это так необходимо!

    Если есть возможность то создайте пожалуйста! Смотрю сколько информации по работе с ADOTable и ADOQuery, и понимаю что нужно учить SQL, но с чего начать не знаю.
    И вопрос, как сделать в делфи экспорт БД в Excel не прибегая к помощи FastReport. Спасибо заранее.

Оставить комментарий на Володимир

Вы можете использовать следующие теги:

*