Поле AutoID в поле «многие ко многим», вставка с использованием TDataSet / Query (Delphi / MSAccess) - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть база данных "Предметы", которые назначены нескольким "категориям". Категории могут иметь несколько элементов, и наоборот. Соответствующая часть структуры базы данных выглядит следующим образом:

[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.)

Ответы [ 2 ]

0 голосов
/ 27 ноября 2011

Если вы хотите добавить новые записи в таблицы через сетку, вам придется использовать метод BeforePost базового запроса, чтобы получить новый ключ, который вы затем вставляете вручную в таблицу ссылок вместе с идентификатор категории

Я признаю, что никогда не пишу код с редактируемыми (и вставляемыми) сетками, поэтому мой ответ может потребовать небольшой доработки.

0 голосов
/ 26 ноября 2011

Примерно так же.Свойства основного источника и основных полей Theres, так что вы просто соединяете подробности с основным.

Таким образом, основным источником будет Customer, Detail Source, Orders, связанные с CustomerID.

Слишком просто показать это, но сложноЧтобы объяснить.

Хотя какой-то другой парень все это написал.

Основные детали форм и Delphi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...