ADOQuery Master / Detail

时间:2009-01-30 16:36:42

标签: delphi

如何设置ADOQuery来过滤数据以显示在DBGrid中有Brook鳟鱼的所有湖泊?

数据:

Nate Pond - LakeMaps.Lake_Name

Brook trout - Species.Species_Name

Creek chub

Golden shiner

黑池塘

Brook trout

Brown bullhead

Common shiner
普拉西德湖

Lake trout

Smallmouth bass

Yellow perch

MDB数据库

ADoTable1 = LakeMaps MASTER

ADOTable2 =物种明细

关系

LakeMaps Table
LakeMaps.Field[0] = Lake_ID: Autonumber --- ]
LakeMaps.Field[1] = Lake_Name: Text---      |
                                            |Relationship set in the access database
Species Table                               |
Species.Field[0] = Species_ID: numeric ---  ]    
Species.Field[1] = Species_Name: text

物种表是LakeMaps是主人的细节

如何设置ADOQuery来过滤数据以显示在DBGrid中有Brook鳟鱼的所有湖泊?

已过滤的数据:

Nate Pond

Brook trout

Creek chub

Golden shiner

黑池塘

Brook trout

Brown bullhead

Common shiner

2 个答案:

答案 0 :(得分:1)

您可以设置Filtered = true,然后使用OnFilterRecord事件并检查详细数据集是否包含请求的值(可以循环或使用Locate数据集过程完成)

对于大量数据,这可能会非常慢。在这些情况下,我通常直接在SQL中过滤主记录。像这样:

SELECT * FROM LakeMaps 
WHERE Lake_ID in (SELECT Lake_ID 
         FROM Species INNER JOIN SpeciesLakesRelation 
             ON (Species.Species_ID = SpeciesLakesRelation.Species_Id) 
         WHERE SPECIES_NAME = 'Brook Trout')

此SQL返回来自具有“Brook Trout”的Lakes的记录。

SpeciesLakesRelation是包含LakeMaps和Species之间关系的表。

答案 1 :(得分:0)

查询问题是查询中的文本必须在撇号中。如果ComboBoxSpecies.Text的值为Brook Trout,则SQL求值为:

SELECT * FROM LakeMaps WHERE Lake_ID in 
  (SELECT Lake_ID FROM Species INNER JOIN LakeMaps ON 
     (Species.Species_ID = LakeMaps.Lake_Id) 
   WHERE SPECIES_NAME = Brook Trout)

请注意,Brook Trout不在撇号中,因此您会从MsAccess中获得语法错误。

修改
正如格里在评论中指出的那样:

  • 撇号应使用QuotedStr函数添加,而不是双撇号。
  • 最佳解决方案是使用查询参数

使用QuotedStr的Delphi代码应如下所示:

ADOQuery1.SQL.Add( 'SELECT * FROM LakeMaps WHERE Lake_ID in ' +
  '(SELECT Lake_ID FROM Species INNER JOIN LakeMaps ON ' +
  '(Species.Species_ID = LakeMaps.Lake_Id) ' +
  'WHERE SPECIES_NAME = ' + QuotedStr(ComboBoxSpecies.Text) + ')');

现在,如果ComboBoxSpecies.Text的值为Brook Trout,那么此字符串为:

'WHERE SPECIES_NAME = ' + QuotedStr(ComboBoxSpecies.Text) + ')'

评估为:

WHERE SPECIES_NAME = 'Brook Trout')