【问题标题】:Setting the filter before setting the Recordsource in ms-access?在 ms-access 中设置 Recordsource 之前设置过滤器?
【发布时间】:2018-09-26 09:20:21
【问题描述】:

我正在解决一个 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 已设置。但是在我设置 RecordSource 的那一刻,我的应用程序正在发送查询。所以在我的情况下,行 ("myForm.RecordSource = newRecordsource") 将需要大约 13 秒来执行。之后设置过滤器会导致更多的等待时间。

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

【问题讨论】:

  • 通常的方法是首先使用“空白”记录加载表单记录集,例如 SELECT * from YourTable WHERE PkID = 0。然后在用户在相关表单上设置了一些标准
  • 哦,我忘了提到我正在使用连续形式

标签: database vba ms-access filter


【解决方案1】:

这是做不到的。

只要您更改记录源,Access 就会重新查询任何表单。即使您要在分配记录源之前设置过滤器,一旦您更改记录源,它也会消失。

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

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

【讨论】:

    【解决方案2】:

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

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

    如果你在表单加载后有一些文本框和按钮要“过滤”,那么将表单记录源留空,然后去说一个城市过滤器:

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

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

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

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

    【讨论】:

    • 不幸的是 - 如上所述 - 这对我来说不是解决方案。我正在使用许多非常大的遗留应用程序,它们大量使用过滤器,我无法按照您描述的方式更改记录源。
    • 您可以用 select * from table where id = 0 替换表单,但是如果原始开发人员在没有 where 子句的情况下启动表单,我看不到任何方法 - 它们是 #1 推荐的接近,不要拉不必要的记录。如果表单直接绑定到指向 sql server 的链接表,这种方法甚至可以工作。您使用 where 子句启动并说出发票编号或“id”作为标准,并且只有一条记录被拉下网络管道。并且即使网络上没有sql server,再次访问也只会拉取一条记录。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多