【问题标题】:Using filtered records from a form in a query在查询中使用来自表单的过滤记录
【发布时间】:2016-05-11 19:56:12
【问题描述】:

我有一张大桌子。我正在制作一个显示表格的表单,并允许用户在许多不同的字段上使用 Access 的标准过滤器来仅选择一些数据。然后,在用户使用过滤器仅选择部分数据后,我希望能够在各种查询中仅包含结果记录集(而不是整个原始表)。

我不确定是否可以在查询中直接引用表单的基础记录集。

显而易见的事情是使用 vba 来遍历记录集,或者用它填充一个临时表,以便在查询中使用,或者直接对数据执行我想要的操作而不使用 sql。但我相信遍历记录集比查询慢得多。有什么方法可以直接从查询中引用表单的记录集,或者将记录集的全部内容转储到临时表中?

【问题讨论】:

    标签: sql vba ms-access dao


    【解决方案1】:

    使用Form.RecordsetClone 将复制子表单的记录集并包括通过 Access 的内置过滤器应用的任何过滤器。

    注意:Form. 是标准的,并不引用您的表单。因此,如果从主表单触发,您的参考将需要为 Me!SubformName!Form.RecordsetCloneMSDN

    创建克隆后,您似乎可以使用 sql 将记录集放入临时表中。但正如@Andre 所提到的,仅添加 PK 是减少大型记录集负载的理想选择。我发现的 SQL 字符串创建很简单:

    sql = "INSERT INTO TEMPTable VALUES" & rs.Fields("YourPKFieldNameFromSUBFORM")

    假设sqlrs 已分别声明为字符串和您的克隆记录集,并且已经为您的PK 创建了一列TEMPTable。 Source: #5MSDN 但是,您仍然需要遍历克隆的每条记录,因为 sql 语句一次只输出一行。

    【讨论】:

    • 我也认为RecordsetClone 是要走的路,但他仍然必须将数据插入到临时表中(要么仅 PK,然后将其加入主表,要么全部列)。
    • 换句话说,没有办法直接将RecordsetClone直接放入表中,我必须像我在问题中建议的那样遍历它并手动插入它?
    • @clum 看起来是这样的。 :( 我尝试使用 sql 字符串转储所有行,但它只输出第一条记录。您需要循环将所有值从克隆中获取到表中。
    【解决方案2】:

    作为对 Christopher D. 回答的补充,这是我最终使用的最终代码:

    CurrentDb.Execute "DELETE FROM FilteredJobs"
    Dim rs As Recordset
    Set rs = Search_subform.Form.RecordsetClone
    rs.MoveFirst
    While Not rs.EOF
        CurrentDb.Execute "INSERT INTO FilteredJobs VALUES (" & rs.Fields("JobID") & ")"
        rs.MoveNext
    Wend
    

    【讨论】:

    • 一个重要提示:在开发过程中,使用一小部分数据时效果很好。在现实生活中使用时,当数据集仍然很大时(例如没有过滤器或几乎没有限制过滤器时),这需要很长时间。我仍然没有一个好的解决方案。
    猜你喜欢
    • 2016-09-22
    • 2014-05-30
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多