【问题标题】:Parameterized Query Reevaluates on Sorting参数化查询重新评估排序
【发布时间】:2016-04-08 16:22:02
【问题描述】:

我有一个子表单,它显示一个简单的数据网格,允许用户对列进行升序或降序排序。

该数据网格的数据由刷新函数提供,该函数使用参数化查询来设置数据网格的记录源:

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 分别由父窗体中的两个不同组合框提供。

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

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

【问题讨论】:

    标签: vba ms-access-2010


    【解决方案1】:

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

    你可以做的是设置表单的 Filter 属性:

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

    为了排序,它是 OrderBy 属性:

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

    【讨论】:

    • 如果我没记错的话,那不会从数据网格中捕获排序事件。
    • UI 中的排序不会重新查询。如果这就是你所看到的,那么还有其他事情正在发生。
    • 是的,这就是我遇到的问题。当我选择一列并对其进行升序或降序排序时,将重新评估基础查询。
    • 但它不应该。只有其他一些代码会导致这种情况。尝试构建一个新的简单表单并将数据网格添加为子表单。没有代码。这应该按照您的要求进行排序,无需重新查询。
    【解决方案2】:

    我找到了一个显然会延长运行时间的解决方案。

    我已经重写了子表单的查询以使用全局函数作为查询参数:

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

    相应的查询如下所示:

    SELECT * FROM sampleTbl
    WHERE ForeignID = GetComboboxValue()
    

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

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

    虽然这可以按我的意愿工作,但查询的参数化似乎不再正常工作。显然查询返回了查询表中的所有记录,然后才过滤记录集。

    【讨论】:

    • 使用子窗体控件的MasterLinkFieldsChildLinkFields 属性会简单得多——主控件的combox 值和子控件的ForeignID。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2012-03-27
    • 2011-12-17
    相关资源
    最近更新 更多