更改查询条件不会更改在表单

时间:2018-02-10 20:19:57

标签: sql ms-access access-vba

我有一个简单的数据库,我正在MS Access 2010中开发,我有一个带有"视图特定的表格"命令按钮和"查看全部"命令按钮。这两个按钮都将运行查询:特定的按钮应该将条件应用于其中一个字段,并且所有按钮都应该运行没有条件的查询,或者在该字段中使用*条件。还有另一个字段需要两个查询的条件,因此基本上特定按钮应运行具有两个条件的查询,并且所有按钮应运行具有一个条件(或一个和*条件)的查询。查询是我通过Design View创建的存储查询。 "所有" 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
    
  3. 这种安排可以让我根据我的组合框查询详细信息。当我单击另一个按钮时,其代码只是执行重新查询,因为第一个按钮应该将SQL重置为它的方式,结果不会更改。查询似乎按总记录计数器消失和返回的方式运行,但它永远不会更改结果。如果我返回并从我的组合框中选择另一个选项并查询特定选项,结果将更新为新的特定选择。

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

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

1 个答案:

答案 0 :(得分: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