使用ADOQuery1& ADOQuery2

时间:2010-06-25 20:48:56

标签: delphi ado master-detail

我有一个ADOQuery1,这是我的主表,现在我想在我的详细信息表中使用另一个ADOQuery2,但实际上我找不到合适的方法来解决这个问题。

ADOQuery1  nr- Autonum  名称 本地 定量。                   ADOQuery2                     Nro _ Autonum                     命名
                    L1                     L2
                    L3

可以帮助一些人 thank's

2 个答案:

答案 0 :(得分:1)

对于AdoQuery,您应该使用DataSource属性。这是你应该做的:

1-在表单上删除AdoQuery作为主数据集,并使用其SQL属性编写查询。

2-删除表单上的DataSource组件,并将其连接到您在步骤1中构建的主AdoQuery。

3-在表单上删除另一个AdoQuery作为详细数据集。

4-将详细数据集的DataSource属性设置为连接到主数据集的数据源(参阅步骤2)。

5-为您的详细信息编写SQL查询 数据集,使用其SQL属性;在查询中,您应该有一个WHERE子句,它使用与主数据源中的一个字段同名的参数来过滤您的详细数据集。 例如,假设您的主数据集中有一个ID字段,并且您的明细数据集中有一个名为MasterID的字段,该字段是主数据集的ID字段的外键。现在要将详细数据集连接到主数据集,使用这些字段,您可以编写详细数据集的查询,如下所示:

SELECT * FROM DetailTable WHERE MasterID = :ID

如您所见,我们有一个名为ID的SQL参数,它与master数据源中的ID字段同名。现在,无论何时浏览主数据源中的记录,Delphi都会自动检索ID字段的值,并将其用作详细数据集中ID参数的值,并重新查询详细数据集。您无需显式设置参数值和重新查询。这将自动为您完成。

我希望这可以澄清如何使用AdoQuery数据集建立主 - 细节关系。

此致

答案 1 :(得分:0)

我有一些自动执行此操作的组件,但在使用原始TADOQuery时,我就是这样实现的:

在Master TADOQuery.AfterScroll事件上执行此操作:

myDetailQuery.Active := False;
myDetailQuery.Params.ParamByName('ID').Value := DataSet.FieldsByName('ID').AsString;
myDetailQuery.Active := True;

Detail TADOQuery的查询如下所示:

SELECT * FROM DetailTable
WHERE ID = :ID;

如果有更好的方式,我也很乐意看到它。

TADOTable内置了此功能,因此您可以考虑使用它。设置TADOTable.MasterSource。有关Delphi帮助中该属性的更多信息。