2016-04-08 149 views
0

我有一个子窗体显示一个简单的数据网格,允许用户对列进行升序或降序排序。参数化查询在排序上重新评估

Dim query  As DAO.QueryDef 
Dim recordSet As DAO.Recordset 

Set query = CurrentDb.QueryDefs("DatagridQuery") 
query.Parameters("one").Value = combobox_1_value 
query.Parameters("two").Value = combobox_2_value 
Set recordSet = query.OpenRecordSet 
Set Me.subform.From.Recordset = recordSet 

在这方面combobox_1_value和combobox_2_value分别由两个不同的组合框提供:

该数据网格的数据由一个刷新功能,使用参数化的查询来设置数据网格的记录源提供在父母的形式。

现在出现的问题是,每次设置排序或过滤器属性时,datagrid似乎都会重新评估基础查询,提示用户手动输入参数,而不是从组合框中获取参数值。

有没有一种方法,我可以将我的组合框的值绑定到查询的参数或重写排序和过滤功能,以便我可以直接在vba中实现记录集的排序?

回答

0

如果您(重新)设置记录集,该表单将始终被重新查询。

你可以做什么,是要设置窗体的过滤属性:

Me!subform.Form.Filter = "[SomeField] = somevalue" 
Me!subform.Form.FilterOn = True 

对于排序它的排序依据属性:

Me!subform.Form.OrderBy = "[SomeField] Asc" 
Me!subform.Form.OrderByOn = True 
+0

如果我没有弄错,那不会从datagrid中捕获排序事件。 – narain

+0

在UI中排序不需要。如果这是你所看到的,那么其他事情正在发生。 – Gustav

+0

是的,这是我遇到的问题。当我选择一个列并为其升序或降序时,重新评估基础查询。 – narain

0

我找到了解决办法,这显然导致运行时间更长。

我已经重写了查询子窗体使用一个全局函数作为查询参数:

Public Function GetComboboxValue() 
    GetComboboxValue = Forms!Form1!Combobox.Value 
End Function 

相应的查询则是这样的:

SELECT * FROM sampleTbl 
WHERE ForeignID = GetComboboxValue() 

另外我已经设置了afterUpdateEvent的Combobox重新查询子表单:

Private Sub combobBox_AfterUpdate() 
    Me.subform.Requery 
End Sub 

虽然硫s的工作,因为我想,似乎查询的参数化不能正常工作了。显然,查询返回查询表中的所有记录,并仅在之后过滤记录集。

+0

使用子窗体控件的'MasterLinkFields'和'ChildLinkFields'属性会更简单 - 使用master的combox值和子项的ForeignID。 – Gustav