Delphi DB grid:如何使用一行的当前行的列作为另一行的索引?

Delphi DB grid:如何使用一行的当前行的列作为另一行的索引?,delphi,dbgrid,tdbgrid,Delphi,Dbgrid,Tdbgrid,我不确定问题标题是否足够清楚,请随意编辑 基本上,我有两个DB网格,它们反映了两个数据库表,每个网格显示一个数据库表 当用户在第一个表中选择一行(我们称之为orders)时,我想用与第一个表中所选行的列匹配的任何行的详细信息更新第二个表 例如,表orders有一列customer\u id,我想用来自该客户的所有订单的详细信息填充第二个表(我们称之为order\u details),每行一个订单 我可以连接2@datasource,查询并连接到两个TDbGrids,但是我被困在如何编码order

我不确定问题标题是否足够清楚,请随意编辑

基本上,我有两个DB网格,它们反映了两个数据库表,每个网格显示一个数据库表

当用户在第一个表中选择一行(我们称之为
orders
)时,我想用与第一个表中所选行的列匹配的任何行的详细信息更新第二个表

例如,表
orders
有一列
customer\u id
,我想用来自该客户的所有订单的详细信息填充第二个表(我们称之为
order\u details
),每行一个订单

我可以连接2@datasource,查询并连接到两个
TDbGrid
s,但是我被困在如何编码
order\u细节
SQL上

订单的SQL只是从订单中选择*而不是另一个

我想要一些类似于
SELECT*from order\u details,其中客户id=.currentRow.FieldByName(“客户id”).AsInteger
-但我不知道怎么做

有人能帮我写一些Delphi代码吗

另外,一旦我建立了这种关系,在
orders
DB网格中选择一个新行是否会自动更新
order\u详细信息
DB网格?或者我需要为此添加代码


p.s我知道已经没有
书籍
标签了(更遗憾的是),但是有人能推荐一本好书来解释编程DB感知控件的基本原理吗?我显然需要一个。谢谢

对详细信息(子)数据库使用参数化查询:

SELECT * FROM Order_Details od WHERE od.CustomerID = :CustomerID
然后将子查询的
MasterSource
设置为父(
Order
)数据源,并将
MasterFields
设置为
CustomerID
。(如果有多个列链接这两个,请通过
将它们分开,如
CustomerID;OrderNumber
中所示)


每次滚动父项(更改父DBGrid中的选定记录)时,子项查询将自动执行,并将父项行的ID作为参数传递。

对详细信息(子项)数据库使用参数化查询:

SELECT * FROM Order_Details od WHERE od.CustomerID = :CustomerID
然后将子查询的
MasterSource
设置为父(
Order
)数据源,并将
MasterFields
设置为
CustomerID
。(如果有多个列链接这两个,请通过
将它们分开,如
CustomerID;OrderNumber
中所示)


每次滚动父项(更改父DBGrid中选定的记录)时,子查询都会自动执行,并将父行的ID作为参数传递。

这就是所谓的主-详细关系和本主题的教程。也许你会感兴趣,也许不会。就书籍推荐而言,这个问题在这里是离题的。这不是一个图书推荐引擎。然而,任何一本旧书(例如,作者的书)都有关于数据库编程的章节,对于大多数版本的Delphi来说都是非常有用的参考。这就是所谓的主-细节关系和本主题的教程。也许你会感兴趣,也许不会。就书籍推荐而言,这个问题在这里是离题的。这不是一个图书推荐引擎。然而,任何一本旧书(例如,作者的书)都有关于数据库编程的章节,对于大多数版本的Delphi来说都是非常有用的参考资料。实际上我是手工实现的。在master的OnClick()处理程序中,我设置了“salve”查询的一个参数,该参数执行相同的操作。再次讨论这个问题,我想我会按照您的方式进行,并发现查询具有
MasterSource
属性,但没有
MasterField
(Delphi XE2 starter edition,使用AnyDac)对不起;我不使用任何DAC,上面的问题或标签中没有任何内容表明您正在使用它。他们的文档对
MasterSource
有何描述?您还没有提到您使用的是哪个DBMS,所以我甚至无法尝试为您找到它,因为我不知道您使用的是什么查询组件。根据他们的,
TADDataSet
确实包含一个
MasterFields
属性,并且正如我上面所描述的那样使用。自从我给出这个答案以来,已经有一段时间了。实际上我是手工实现的。在master的OnClick()处理程序中,我设置了“salve”查询的一个参数,该参数执行相同的操作。再次讨论这个问题,我想我会按照您的方式进行,并发现查询具有
MasterSource
属性,但没有
MasterField
(Delphi XE2 starter edition,使用AnyDac)对不起;我不使用任何DAC,上面的问题或标签中没有任何内容表明您正在使用它。他们的文档对
MasterSource
有何描述?您还没有提到您正在使用哪个DBMS,所以我甚至无法尝试为您找到它,因为我不知道您正在使用哪个查询组件。根据他们的,
TADDataSet
确实包含一个
MasterFields
属性,并且使用方式与我前面描述的相同。