我正在处理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中更改查询或将其设置为设计模式。
答案 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子句匹配的数据。这种方法消除了即时设置表单记录源的需要。
这两种方法都是一次性过滤数据。