2011-11-25 64 views
2

我有一个“项目”,它被分配到多个“类别”的数据库。分类可以有多个项目,反之亦然。数据库结构的相关部分如下:AutoID字段在多对多,插入使用TDataSet /查询(Delphi/MSAccess)

[tblItem]
的ItemID(自动编号)
的mainText(文本)

[tblCategory] ​​
类别ID(自动编号)
名称(Text)

[tblItemCategory] ​​
项目ID(长整型)
类别ID(长整型)

我想建立一个面板组件,它显示了一个类别名称在顶部,与属于低于电网项目的数据绑定网格。这个面板组件会有很多实例,最终用户应该能够创建一个新的项目,并同时将它分配给任何一个有问题的类别。

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

对于访问形式的网格中的查询是:
SELECT tblItemCategory.CategoryID,tblItem *
FROM tblItemCategory LEFT JOIN tblItem ON tblItemCategory.ItemID = tblItem.ItemID
ORDER BY tblItemCategory.CategoryID。

如果我尝试在德尔福同样的事情,该项目ID自动编号字段没有得到填充,导致出现以下错误:

..exception类EOleException与消息“字段‘tblItemCategory.ItemID’不能包含一个Null值,因为该字段的Required属性设置为True。在此字段中输入一个值'。

..并且ItemID字段在网格中相应为空白。

有没有办法让Delphi/ADO像Access一样轻松/整洁地处理幕后两张ItemID群体,而无需手动处理它?如果不是,以编程方式处理它的最好/最优雅的方式是什么?

我想尽可能保留与传统TDataSet/TDataSource方法紧密结合的任何解决方案,因为我使用多种不同类型的数据绑定控件,所有这些控件都必须处理此问题相同的数据结构。

(注:我使用的是2007年德尔福和MSACCESS 2000格式MDB文件)

+0

表格之间的关系对我而言并不明确,您是否可以添加一些信息(模式...) – philnext

+0

我熟悉您所描述的Access功能,但我不太明白您想要实现的功能。你是否想要自动填充tblItemCategory中的两个关键列?如果表中没有其他字段,那么目的是什么? Plus:在哪里以及如何选择第二个关键列的值?如果你只是试图自动填充类别ID列(因为你已经加入了项目),@托尼的答案完全符合要点,我不理解你对他的回答的评论。 –

回答

0

几乎相同的方式。 Theres的主要来源和主域属性,因此您只需将详细信息链接至主。

因此,mastersource将是CustomerID,Detail Source,订单由CustomerID链接。

死容易表现这一点,但很难解释。

其他一些家伙写了它虽然。

Master Detail Forms And Delphi

+0

感谢您的回复。 这很多我明白,可以做。我遇到问题的地方是三张表格(多对多),而不是两张表格“标准版本”(一对多)。两个表格需要添加到,而不仅仅是一个。 – Jamo

+0

啊查找通常是最好的方式来做到这一点。如果这两个id在链接表中都不是空的外键。您选择(或添加并选择)每一个,然后在链接表中插入一个插入。按照您当前的想法,蜿蜒用户界面的唯一方法将是您的链接表中的代理键,并且允许CategoryID和ItemID为空。一个wince制造商的位,或者通过一个连接来更新。 –

0

如果要添加新的记录通过电网的表,那么你将不得不使用底层查询BeforePost方法,以获得新的密钥,然后您可以手动插入链接表以及类别标识。我承认我从来没有用可编辑(和可插入)网格编写代码,所以我的答案可能需要稍微调整一下。