我最好的猜测是,当您尝试修改或删除非空.Filter
属性时,Access 会尝试从数据提供者重新加载表单的记录集。由于断开连接的记录集没有提供程序,因此该尝试失败。在我的测试中,我实际上触发了错误 #31,“无法初始化数据提供者”。
在您的第一次尝试(成功)中,该.Filter
属性事先是空的。我看到了相同的行为,我猜 Access 可以将 a.Filter
应用于未过滤的记录集,而无需重新访问数据提供者。
对猜测感到抱歉。不幸的是,这是我能提供的最好的解释。
无论如何,我放弃了尝试使用表单的.Filter
属性来完成我认为你想要的。我发现根据在其子句中包含您的.Filter
字符串的查询来简单地重新加载断开连接的记录集更容易。WHERE
代码更改很小,运行时性能成本可以忽略不计……重新加载的记录集在更改组合框选择后立即显示。
首先,我将构建断开连接的记录集的代码移到了Form_Open
一个单独的函数中,该函数的签名是......
Private Function GetRecordset(Optional ByVal pFilter As String) _
As ADODB.Recordset
该函数将一个非空pFilter
参数合并到查询的WHERE
子句中,该子句SELECT
提供断开的记录集。
然后我改成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