在 ms-access 中设置记录源之前设置过滤器?



我正在解决 vba 遗留应用程序中的性能问题,由于我不知道的任何原因 - 通过设置连续表单的记录源

myForm.RecordSource = newRecordsource

在表单已打开后。单击按钮后应用过滤器:

DoCmd.ApplyFilter , "my filter sql"

我想在设置记录源之前设置默认过滤器,以便表单显示得更快。但是我收到错误消息2491:

The action or method is invalid because the form or report isn't bound to a table or query.@You tried to use the ApplyFilter or SearchForRecord action or method. However, the form or report you applied the filter to is not based on a table or query, so the form or report doesn't have any records to apply a filter to.@Use the SelectObject action or method to select the desired form or report before you run the ApplyFilter action. To base a form or report on a table or query, open the form or report in Design view, and enter the table or query name in the RecordSource property.

所以我必须设置过滤器!之后!记录源设置。但在我设置记录源的那一刻,我的应用程序正在发送查询。所以在我的例子中,这一行("myForm.RecordSource = newRecordsource"(将需要大约 13 秒才能执行。之后设置过滤器会导致更多的等待时间。

有没有办法防止表单加载所有数据集,直到我应用过滤器?由于整个应用程序(以及其他几个应用程序(按所述工作,因此我不能只更改 RecordSource 中的查询或在设计模式下设置查询。

这做不到。

Access 会在更改记录源后立即重新查询任何表单。即使您在分配记录源之前设置了筛选器,只要您更改了记录源,该筛选器也会消失。

相反,如果筛选器是静态的,请调整记录源以合并筛选条件。

示例(在罗斯文.accdb上(

DoCmd.OpenForm "Inventory List"
Forms![Inventory List].Filter = "[Product ID] = 5"
Forms![Inventory List].FilterOn = True
Debug.Print Forms![Inventory List].FilterOn 'True
Forms![Inventory List].RecordSource = "Inventory"
Debug.Print Forms![Inventory List].FilterOn 'False, displays all records

实际上,有几种方法可以做到这一点。

首先,您可以(并且应该(简单地使用"where"子句启动表单。这将过滤表单。因此,实际上,不要使用表单"filter",而是在打开表单时使用"where"子句。

如果您在加载表单后有一些文本框和按钮要"过滤",请将表单记录源留空,然后说一个城市过滤器:

Dim strSQL     as string
strSQL = "select * from MyTable where city = '" & me.txtCity & "’"
me.RecordSource = strSQL

因此,以上就是您所需要的 - 只需删除表单记录源,然后获取条件,然后按照上述方式设置表单记录源。

如前所述,您还可以在打开表单之前提示/获取该条件,并且带有"where"子句的打开表单将针对表单绑定数据源,并且筛选器只会出现一次,并且表单将仅提取与您在打开表单命令中提供的 where 子句匹配的数据。此方法消除了动态设置表单记录源的需要。

这两种方法都是数据的一次性筛选器。

最新更新