【问题标题】:Changing Query Criteria doesnt change query results viewed on form更改查询条件不会更改在表单上查看的查询结果
【发布时间】:2018-02-10 20:19:56
【问题描述】:

我有一个在 MS Access 2010 中开发的简单数据库,其中我有一个带有“查看特定”命令按钮和“查看全部”命令按钮的表单。两个按钮都将运行查询:特定的按钮应将条件应用于其中一个字段,而所有按钮应在没有条件的情况下运行查询,或者在该字段中使用 * 条件。还有另一个字段需要两个查询的条件,因此基本上特定按钮应该运行具有两个条件的查询,而所有按钮应该运行一个具有一个条件(或一个和一个 * 条件)的查询。该查询是我通过设计视图创建的存储查询。 “all”SQL 语句的作用是:

SELECT tableA.field1, tableA.field2, tableB.field1, tableB.field2
FROM tableA INNER JOIN tableB ON tableA.field3=tableB.field2
WHERE tableB.field1=True;

我希望根据表单组合框中选择的选项运行特定查询,因此它的 SQL 语句应该看起来相同,除了 WHERE 子句将更改为:

WHERE tableB.field1=True AND tableB.field2=Forms!ViewQryResults!comboSelectSpecific;

问题

我的问题是,我将其称为 Query2 的特定查询按预期工作,但所有查询 Query1 不会改变查看的结果在表格上。两个查询都没有抛出错误消息,并且似乎查询正在再次运行,因为屏幕底部的记录总数消失了,然后在查询完成后返回并再次获取记录总数。

尝试的解决方案

我已经尝试了多种不同的解决方案来尝试让它工作,但都没有。

  1. 我首先尝试建立一个参数,但是 Access 一打开表单就提示用户输入参数值,这是我不想要的。如果我只是在查询的设计视图中使用功能区中的参数按钮声明参数,但不将其分配给作为设计网格中的标准的字段,Access 不再提示我输入参数值,我可以分配它的值通过 VBA,但是我不知道如何使用 VBA 将参数分配给字段条件。我的尝试引发错误,提示 Access 无法识别我的参数名称。

  2. 然后我尝试更改查询的 SQL 字符串,然后重新查询。我使用文本操作函数来查找 WHERE 子句,并将其替换为具有两个条件的 WHERE 子句,然后重新查询。为了确定 SQL 字符串的正确上下文,我在设计视图中更改了查询以执行我想要的操作,然后切换到 SQL 视图并复制 Access 创建的用于表示查询的 SQL 字符串。

    然后我插入了Debug.Print 行以在每一步打印 SQL 字符串,并逐个字符地比较它们并且它们完全匹配,这意味着文本操作正在做它应该做的事情并正确地创建 SQL 字符串,或者至少如果我根本不惹他们的话,Access 会这样。我从两个方向都尝试了这个,即我以一个按钮的方式进行存储的查询,然后使用代码为另一个按钮更改它,然后交换,但是两种方法都没有成功地让两个查询工作.我尝试操作 SQL 字符串的基本代码如下:

    Private Sub Query2_OnClick()
        Dim d As Database
        Dim q As Query
        Dim strSQL As String
        Dim strSQLSelectFrom As String
        Dim strSQLWhereNew As String
    
        Set d = CurrentDb
        Set q = d.QueryDefs("Query2")
        strSQL = q.SQL      'Saves original SQL statement
        'Text Manipulations to create strSQLSelectFrom as just the SELECT and FROM portions
        strSQLWhereNew = "tableB.field1=True AND tableB.field2=Forms!ViewQryResults!comboSelectSpecific;"
    
        q.SQL = strSQLSelectFrom & strSQLWhereNew
        DoCmd.Requery
        Me.Refresh
        Debug.Print q.SQL   'Verify text manipulations created SQL String I expect
        q.SQL = strSQL      'Returns SQL to original statement
        Debug.Print q.SQL   'Verify SQL statement properly returned to original statement
    End Sub
    

这种安排可以让我根据我的组合框查询细节。当我单击另一个按钮时,其代码只是重新查询,因为第一个按钮应将 SQL 重置为原来的方式,结果不会改变。查询似乎按照总记录计数器的消失和返回指示运行,但它从不更改结果。如果我返回并从我的组合框中选择另一个选项并查询特定,结果将更新为新的特定选择。

同样,如果我单击“所有查询”按钮,结果仍将基于组合框的选择。如果我更改组合框选择,然后单击所有查询(它根本不关心组合框,因为它没有在该按钮的代码中的任何位置列出),结果将更改为新选择,就像两者一样按钮正在运行特定的查询。那部分是最令人费解的,我可以弄清楚它为什么会这样做。

我知道一个简单的解决方案是创建第二个查询并停止尝试来回更改一个,但我真的觉得我错过了一个我需要在某个时候理解的基本部分,所以我我真的在寻找能够完成这项工作的基础部分。

【问题讨论】:

    标签: sql ms-access vba


    【解决方案1】:

    IIUC - 只需更改表单的 RecordSource 以使用 .Requery 指向所需的已保存查询:

    Private Sub ViewAll_OnClick()
       Me.Form.RecordSource = "Query1"
       Me.Requery
    End Sub
    
    Private Sub ViewSpecific_OnClick()
       Me.Form.RecordSource = "Query2"
       Me.Requery
    End Sub
    

    或者,您可以使用DoCmd.ApplyFilter 保留相同的查询记录源和过滤表单,假设条件控件位于需要过滤的相同表单上。任何有效的 SQL WHERE 子句都可以在第二个参数中使用,甚至可以动态创建。

    DoCmd.ApplyFilter , "field1 = True AND field2 = '" & Forms!ViewQryResults!comboSelectSpecific & "'"
    

    并删除过滤器:

    DoCmd.RunCommand acCmdRemoveAllFilters
    

    【讨论】:

    • 虽然我知道我可以创建第二个查询并使用此解决方案,但我正在尝试了解更多动态查询背后的基本原理。在这种情况下,我只需要两个版本的查询,所以这样做不会有问题,但我可能会遇到需要 50 个查询的情况,而这个解决方案需要我为每种情况创建一个查询,我不想这样做...有没有办法可以让表单记录源属性指向一个查询,并使用 VBA 相应地更改查询以满足需求?
    • 我得到了一些数据库,用户需要超过 100 个查询,所有的样式都相同,但用户的标准发生了变化,过滤器也发生了变化。我所做的只是让String variable 在哪里声明 SQL 指令,然后我做@Parfait suugested 你的事情。我设置了Form.RecordSource=MySQL,其中MySQL 是我的字符串变量,然后Me. Requery 将更新。所以我的表单总是指向 1 个查询,然后我使用 VBA 和 SQL 语言更改记录源
    • @Valiant ... IIUC 你可以使用DoCmd.ApplyFilter。请参阅上面的编辑并将 SQL WHERE 条件作为第二个参数传递。此条件甚至可以动态创建为 VBA 字符串。
    • 谢谢!过滤器选项适用于这种情况,现在在询问和评论之间,我已经学会了如何从 VBA 创建 SQL 字符串,因此我现在可以使用您的第一个选项动态创建我的查询并将它们分配为记录源!我已经为我遇到的另一个不相关的问题这样做了!
    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多