【发布时间】:2012-01-06 16:20:01
【问题描述】:
我有一个“项目”数据库,它被分配到多个“类别”。类别可以有多个项目,反之亦然。数据库结构的相关部分如下:
[tblItem]
项目 ID(自动编号)
正文(正文)
[tblCategory]
类别 ID(自动编号)
名称(文字)
[tblItemCategory]
ItemID(长整数)
CategoryID(长整数)
我想构建一个面板组件,它在顶部显示一个类别名称,下面是属于该网格的项目的数据绑定网格。这个面板组件会有很多实例,最终用户应该能够创建一个新项目,并同时从其中的任何一个中将其分配给相关类别。
在 MS Access 中,可以创建一个嵌套表单,其中“子”一个数据绑定到一个查询,该查询是“MasterFields”链接到“父”表单上的数据绑定“类别”字段,这样的网格项目随着类别字段的变化而变化。这个 Items 网格还可以轻松地添加新记录,同时自动填充 ItemID(在 tblItem AND 表 tblItemCategory 中)和链接的 CategoryID 字段(在 tblItemCategory 中)。
对该 Access 表单的网格的查询是:
选择 tblItemCategory.CategoryID,tblItem.*
从 tblItemCategory 左连接 tblItem ON tblItemCategory.ItemID = tblItem.ItemID
按 tblItemCategory.CategoryID 排序;
如果我在 Delphi 中尝试相同的操作,ItemID 自动编号字段不会被填充,从而导致以下错误:
..exception class EOleException with message 'The field 'tblItemCategory.ItemID' 不能包含 Null 值,因为该字段的 Required 属性设置为 True。在此字段中输入一个值'。
..并且 ItemID 字段在网格中相应地是空白的。
有没有办法让 Delphi/ADO 像 Access 一样轻松/整齐地处理幕后的两表 ItemID 填充,而无需以编程方式手动处理?如果没有,以编程方式处理它的最佳/最优雅的方式是什么?
我希望我最终得到的任何解决方案都尽可能与传统的 TDataSet / TDataSource 方法密切相关,因为我使用了许多不同类型的数据绑定控件,所有这些都必须处理同样的问题数据结构。
(注意:我使用的是 Delphi 2007 和 MSAccess 2000 格式的 MDB 文件。)
【问题讨论】:
-
表之间的关系我不清楚,可以补充一些信息(架构...)
-
我对您所描述的 Access 功能很熟悉,但我不太明白您想要实现什么。您是否尝试自动填充 tblItemCategory 中的两个键列?如果表中没有其他字段,这样做的目的是什么?另外:您在哪里以及如何选择第二个键列的值?如果您“只是”尝试自动填充类别 id 列(因为您已经加入了项目),@Tony 的回答完全中肯,我不明白您对他的回答的评论。