У меня есть база данных "Предметы", которые назначены нескольким "категориям". Категории могут иметь несколько элементов, и наоборот. Соответствующая часть структуры базы данных выглядит следующим образом:
[tblItem]
ItemID (AutoNumber)
MainText (Текст)
[tblCategory]
CategoryID (AutoNumber)
Имя (Текст)
[tblItemCategory]
ItemID (длинное целое)
CategoryID (длинное целое)
Я хочу построить компонент панели, который показывает название категории вверху, с сеткой элементов данных, принадлежащих к этой сетке, внизу. Будет много экземпляров этого компонента панели, и конечный пользователь должен иметь возможность создать новый элемент и одновременно назначить его для рассматриваемой категории из любого из них.
В MS Access можно создать вложенную форму с дочерним элементом, привязанным к запросу, к которому относится «MasterFields», связанный с полем «Категория» в базе данных в «родительской» форме, таким образом, что сетка элементы изменяются при изменении поля категории. Эта сетка элементов также может легко добавлять новые записи в нее, причем как ItemID (в tblItem AND таблица tblItemCategory), так и связанное поле CategoryID (в tblItemCategory) заполняются автоматически.
Запрос для сетки этой формы доступа:
ВЫБЕРИТЕ tblItemCategory.CategoryID, tblItem. *
ОТ tblItemCategory ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ К tblItem ON tblItemCategory.ItemID = tblItem.ItemID
ЗАКАЗАТЬ ПО tblItemCategory.CategoryID;
Если я попробую то же самое в Delphi, поле ItemID AutoNumber не будет заполнено, что приведет к следующей ошибке:
.. класс исключений EOleException с сообщением 'Поле' tblItemCategory.ItemID 'не может содержать значение Null, поскольку для свойства Required для этого поля установлено значение True. Введите значение в это поле '.
.. и поле ItemID соответственно пустое в сетке.
Есть ли способ заставить Delphi / ADO обрабатывать скрытое заполнение ItemID из двух таблиц так же легко и аккуратно, как это делает Access, без ручной обработки программно? Если нет, то какой самый лучший / самый элегантный способ обращаться с ним программно?
Я бы хотел, чтобы любое решение, которое я получу, было как можно более тесно связано с традиционным подходом TDataSet / TDataSource, так как я использую несколько различных типов элементов управления с привязкой к данным, каждый из которых должен иметь дело с этим же структура данных.
(Примечание. Я использую Delphi 2007 и файл MDB в формате MSAccess 2000.)