Delphi 2009, MyDAC и реляционная база данных - PullRequest
2 голосов
/ 24 мая 2009

У меня довольно много проблем с использованием концепций реляционных баз данных в Delphi 2009 с MyDAC.

У меня есть структура базы данных, которая выглядит примерно так:


Item

  • id
  • имя

Хранение

  • ID
  • имя

StorageItem

  • ID
  • item_id
  • storage_id
  • место

Теперь, когда у меня есть активный набор данных из «Предмета», как я могу отобразить все связанные хранилища, например, в DBGrid?

Кстати: было бы лучше не использовать «id» в каждой таблице, а изменить его и использовать что-то вроде, например, «id_item» или «id_storage»?

Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 24 мая 2009
  • С StorageItem вы создали
    отношения многие ко многим. Если вы
    нужно только один ко многим (много хранилищ связаны с одним предметом, но вы
    не надо наоборот), то ты может просто добавить другое поле в Таблица хранения (item_id), которая будет быть внешним ключом для таблицы товаров. Затем вы создаете индекс на item_id в таблице хранения и соединить две таблицы в
    отношения мастер-деталь.
  • Если вам нужно много ко многим, тогда вы может добавить компонент запроса с SQL
    (выберите * из StorageItem, где
    item_id: =: current_storage_id) и current_storage_id - это ваш запрос
    параметр.
1 голос
/ 24 мая 2009
Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)

Приведенный выше запрос вернет все элементы в таблице StorageItem с его именем, теперь, если вы хотите отфильтровать его, чтобы возвращались только элементы для определенного элемента, добавьте условие where, подобное

Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)
where a.item_id = 1 -- place the item id here

Вы можете использовать где с такими параметрами, как:

MyQuery.Sql.Text := ' Select a.ID, b.Name, a.Place from StorageItem a
+ ' inner join Storage b on (a.id = b.id) '
+ ' where a.item_id = :ItemNo ';
MyQuery.ParamByName('ItemNo').asInteger := 1;
MyQuery.Open;

и присвойте приведенный выше запрос к dbGrid

также вы можете использовать свойство MasterSource для создания отношений без использования части "где"

1 голос
/ 24 мая 2009

Я лично не знаком с MyDAC, но у большинства компонентов набора данных есть какой-то способ установить отношения мастер-детали. Проверьте, есть ли свойство MasterSource в вашем наборе данных, или какой-либо подобный способ связать набор подробных данных с основным набором данных. Если нет, вы можете использовать TDatasetField для установления связи и отфильтровать вложенный набор данных для отображения только правильных записей.

Что касается имен столбцов идентификаторов, то хорошей идеей будет дать описательное имя каждому полю, чтобы вы могли определить, взглянув на код, что у вас есть правильные ссылки. Если вы называете свой столбец идентификаторов «id», это может быть любой столбец идентификаторов, и это может сбить с толку, если вы начнете передавать ссылки на наборы данных. Но если он называется item_id каждый раз (не item_id иногда, а id_item иногда), то вы всегда точно знаете, на что смотрите. Это облегчает понимание того, что ваш код тоже прав. Фильтр с надписью "master.item_id = detail.item_id" легче читать как "master.id = detail.item_id". Это может быть неправильно и молча завершиться ошибкой, если, например, master назначен неверному набору данных.

...