更改查询标准不会更改在表单上查看的查询结果



我有一个简单的数据库,我正在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语句应该看起来相同,除了werty子句将更改为:

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

问题

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

尝试解决方案

我尝试了多种不同的解决方案来尝试使其工作,而这些解决方案都没有。

  1. 我首先尝试建立一个参数,但随后访问在表单打开后立即提示用户获取参数值,而我不需要。如果我只是使用功能区中的"查询"功能区中的参数按钮声明参数,但请勿将其作为设计网格中的标准分配给字段,访问不再提示我掌握参数值,我可以分配它通过VBA值的值,但是我不知道如何使用VBA将参数分配给字段标准。我的尝试抛出错误的错误,即访问无法识别我的参数的名称。

  2. i然后尝试更改查询的SQL字符串,然后再进行收集。我使用文本操作函数来查找Where子句,并用具有两个标准的Where子句替换,然后被要求。为了确定SQL字符串的适当上下文,我更改了设计视图中的查询以执行我想要的操作,然后切换到SQL视图并复制了为表示查询而创建的访问的SQL字符串。

    i然后插入Debug.Print行以在每个步骤上打印SQL字符串,并按字符比较它们,并且它们完全匹配,这意味着文本操作正在做应该做的事情并正确创建SQL字符串,或者至少至少创建SQL字符串如果我根本不弄乱他们,访问就会一样。我从两个方向尝试了一下,即,我以一个按钮的方式进行了存储的查询,然后使用代码将其更改为另一个按钮,然后互换,但是两种方法都成功地将两个查询都用于工作。我尝试操作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重置为原样,结果不会更改。该查询似乎按照总记录计数器的指示运行,但它永远不会改变结果。如果我回去从组合框中选择另一个选项,并查询特定于新特定选择的结果更新。

再次,如果我单击"所有查询"按钮,则结果仍基于组合框选择。如果我更改组合框选择,然后单击所有查询(由于该按钮的代码中没有列出的任何位置,因此根本不在乎组合框(,结果将更改为新选择,就像两者一样按钮正在运行特定查询。那部分是最令人困惑的,我可以弄清楚为什么这样做。

我知道一个简单的解决方案将只是创建第二个查询,而停止尝试来回改变一个,但是我真的觉得我缺少一个基本的作品,我需要在某个时候了解到这一点,所以我我真的在寻找可以使这项工作的基本作品。

iiuc-只需更改表格的记录程序,以指向所需的查询,用 .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

最新更新