【问题标题】:In Access form with disconnected ADO recordset, filter only works one time在具有断开连接的 ADO 记录集的 Access 表单中,筛选器仅工作一次
【发布时间】:2013-01-27 00:28:51
【问题描述】:

感谢对先前question 的出色回答(感谢 Hansup 和 Remou),我制作了一个基于 ADODB 记录集的 Access 表单,该记录集在运行时拉取。这使它有一个仅在内存中的复选框。复选框很好。

我现在被要求将“客户”的下拉过滤器添加到表单中。很容易。我做了下拉框,对控件源做了一点查询,在After_Update事件中,添加了这段代码:

Private Sub Combo_PickClient_AfterUpdate()
    Me.Filter = "Client='" & Combo_PickClient.Value & "'"
    Me.FilterOn = True
    Me.Refresh
End Sub

出于测试目的,我选择了 2 个客户端。当我打开表单时,它显示了两个客户的数据(好)。当我选择一个客户端时,它成功过滤了数据(也很好)。当我选择第二个客户时,它什么也没做(不太好)

为什么这个过滤器只能工作一次?它不会抛出任何错误。屏幕只需刷新即可。

【问题讨论】:

  • 断开连接的记录集功能有限。您需要提及您正在使用这样的记录集。
  • 是否可以让这个下拉菜单按预期工作?
  • 您是指DAO(标题)还是ADO(问题主体)?它们是不同的方法...您是否尝试在应用新过滤器之前清除任何现有过滤器(设置为“”或adFilternone)?
  • 感谢@Hansup 编辑标题。

标签: vba ms-access ms-access-2007


【解决方案1】:

我的最佳猜测是,当您尝试修改或删除非空 .Filter 属性时,Access 会尝试从数据提供程序重新加载表单的记录集。由于断开连接的记录集没有提供程序,因此该尝试失败。在我的测试中,我实际上触发了错误 #31,“无法初始化数据提供者”。

在您的第一次尝试(成功)中,.Filter 属性事先为空。我看到了同样的行为,我猜 Access 可以将 .Filter 应用于未过滤的记录集,而无需重新访问数据提供者。

抱歉,您的猜测。不幸的是,这是我能提供的最好的解释。

无论如何,我放弃了尝试使用表单的.Filter 属性来完成我认为你想要的。我发现根据在其WHERE 子句中包含您的.Filter 字符串的查询来简单地重新加载断开连接的记录集更容易。代码更改很小,运行时性能成本可以忽略不计……重新加载的记录集在更改组合框选择后立即显示。

首先,我将构建断开连接记录集的代码从Form_Open 移到了一个签名为...的单独函数中。

Private Function GetRecordset(Optional ByVal pFilter As String) _
    As ADODB.Recordset

该函数将一个非空的pFilter 参数合并到SELECT 查询的WHERE 子句中,该子句提供断开的记录集。

然后我将Form_Open 改为一个语句...

Set Me.Recordset = GetRecordset()

因此,如果您的组合框和断开连接的记录集都在同一个表单上,则组合的更新后过程可能是...

Private Sub Combo_PickClient_AfterUpdate()
    Set Me.Recordset = GetRecordset("Client='" & _
        Me.Combo_PickClient & "'")
End Sub

在我的例子中,断开连接的记录集显示在子窗体中,组合框位于其父窗体上。所以我在子表单代码模块中创建了一个包装过程,并从组合的更新后调用它:

Call Me.SubFormControlName.Form.ChangeRecordset("Client='" & _
    Me.Combo_PickClient & "'")

包装程序很简单,但我发现它很方便......

Public Sub ChangeRecordset(Optional ByVal pFilter As String)
    Set Me.Recordset = GetRecordset(pFilter)
End Sub

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2012-04-19
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多