在ms-access中设置Recordsource之前设置过滤器?

时间:2018-09-25 11:03:56

标签: database vba ms-access filter

我正在处理vba遗留应用程序中的性能问题-出于任何我不知道的原因,它会通过

设置连续表格的记录源
myForm.RecordSource = newRecordsource

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

DoCmd.ApplyFilter , "my filter sql"

我想过在设置RecordSource之前先设置默认过滤器,这样可以更快地显示表单。但是我收到了错误消息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.

所以我必须设置过滤器!之后!记录源已设置。但是,当我设置RecordSource时,我的应用正在发送查询。因此,在我的情况下,该行(“ myForm.RecordSource = newRecordsource”)将需要大约13秒的时间来执行。然后再设置过滤器会导致更多的等待时间。

在应用过滤器之前,有没有办法防止表单加载所有数据集?由于整个应用程序(以及其他几个应用程序)都按照描述的那样工作,所以我不能只在RecordSource中更改查询或将其设置为设计模式。

2 个答案:

答案 0 :(得分:1)

这无法完成。

访问在更改记录源后立即查询任何表格。即使您在分配记录源之前先设置过滤器,更改记录源后该过滤器也会消失。

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

示例(在Northwind.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

答案 1 :(得分:1)

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

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

如果在加载表单后有一些文本框和按钮可以“过滤”,则将表单记录源留空,然后说出城市过滤器:

Dim strSQL     as string

strSQL = "select * from MyTable where city = '" & me.txtCity & "’"

me.RecordSource = strSQL

因此,您所需要的就是所有这些–只需删除表单记录源,然后获取条件,然后按照上述步骤设置表单记录源。

如前所述,您还可以在打开表单之前提示/获取该条件,并且带有“ where”子句的打开表单将针对与表单绑定的数据源起作用,并且过滤器只会出现一次,并且该表单只会提取与您在open form命令中提供的where子句匹配的数据。这种方法消除了即时设置表单记录源的需要。

这两种方法都是一次性过滤数据。