多对多自动字段,使用DataSet / Query插入(Delphi / MS Access)

时间:2011-11-25 23:04:42

标签: delphi ms-access ado

我有一个“项目”数据库,它被分配到多个“类别”。类别可以有多个项目,反之亦然。数据库结构的相关部分如下:

[tblItem]
ItemID(自动编号)
MainText(文字)

[tblCategory] ​​
CategoryID(自动编号)
姓名(文字)

[tblItemCategory] ​​
ItemID(长整数)
CategoryID(长整数)

我想构建一个面板组件,它在顶部显示一个类别名称,下面是属于该网格的项目的数据绑定网格。此面板组件将有许多实例,最终用户应该能够创建一个新项目,同时将其分配给相关类别。

在MS Access中,可以创建一个嵌套表单,其中“child”是一个数据绑定到查询的“MasterFields”链接到“父”表单上的数据绑定“类别”字段,这样就可以了项目在更改“类别”字段时更改。此Items网格也可以轻松地添加新记录,同时自动填充ItemID(在tblItem和表tblItemCategory中)和链接的CategoryID字段(在tblItemCategory中)。

该Access表单网格的查询是:
SELECT tblItemCategory.CategoryID,tblItem。*
FROM tblItemCategory LEFT JOIN tblItem ON tblItemCategory.ItemID = tblItem.ItemID
ORDER BY tblItemCategory.CategoryID;

如果我在Delphi中尝试相同的操作,则不会填充ItemID AutoNumber字段,从而导致以下错误:

..异常类EOleException,消息'字段'tblItemCategory.ItemID'不能包含Null值,因为此字段的Required属性设置为True。在此字段中输入值'。

..并且ItemID字段因此在网格中为空白。

有没有办法让Delphi / ADO像Access一样轻松/整齐地处理幕后的双表ItemID填充,而无需以编程方式手动处理它?如果没有,那么以编程方式处理它的最佳/最优雅方式是什么?

我希望尽可能保持与最终TDataSet / TDataSource方法紧密相关的任何解决方案,因为我使用了许多不同类型的数据绑定控件,所有这些都必须处理相同的问题。数据结构。

(注意:我正在使用Delphi 2007和MSAccess 2000格式的MDB文件。)

2 个答案:

答案 0 :(得分:0)

几乎一样的方式。 Theres的主要源和主要字段属性,因此您只需将详细信息链接到主数据。

因此,mastersource将是CustomerID,Customer Source,CustomerID链接的订单。

死了很容易证明这一点,但很难解释。

其他一些家伙写了这一切。

Master Detail Forms And Delphi

答案 1 :(得分:0)

如果要通过网格向表中添加新记录,则必须使用基础查询的BeforePost方法来获取新密钥,然后将其手动插入到链接表中。类别ID。

我承认我从不用可编辑(和可插入)网格编写代码,所以我的答案可能需要稍微调整一下。