通过VBA在SQL查询中使用表单筛选器

通过VBA在SQL查询中使用表单筛选器,sql,ms-access,filter,vba,Sql,Ms Access,Filter,Vba,我在Access 2013中通过VBA在SQL查询中使用“按表单过滤”时遇到问题。我没有创建访问表单,但受委托更正了一个问题。客户还告诉我,它在以前的Office版本中工作,Access数据库在过去几年中没有更改。因此,Access 2013似乎做了一些不同的事情。但我不知道是什么 正如您在下面所了解的,红色突出显示按钮应取消选中所有黄色突出显示的复选框。在我添加一个表单过滤器之前(图像底部的红色框)。具有讽刺意味的是,我只是通过过滤红色下划线字段程序IDF才遇到了这个问题。按其他字段过滤效果良

我在Access 2013中通过VBA在SQL查询中使用“按表单过滤”时遇到问题。我没有创建访问表单,但受委托更正了一个问题。客户还告诉我,它在以前的Office版本中工作,Access数据库在过去几年中没有更改。因此,Access 2013似乎做了一些不同的事情。但我不知道是什么

正如您在下面所了解的,红色突出显示按钮应取消选中所有黄色突出显示的复选框。在我添加一个表单过滤器之前(图像底部的红色框)。具有讽刺意味的是,我只是通过过滤红色下划线字段
程序IDF
才遇到了这个问题。按其他字段过滤效果良好。 此查询应取消选中复选框,但由于
strFilter
的值为:

((Lookup\u program\u IDFS.Name=“ad1incl”))

这可能适用于筛选,但不适用于SQL限制

UPDATE dbo_tbl_ThisForm
SET dbo_tbl_ThisForm.Checkbox = 0,
    dbo_tbl_ThisForm.Statusoffen = '0'
WHERE dbo_tbl_ThisForm.Testfall_ID NOT IN
    (SELECT dbo_tbl_Restrictions1.Testfall_ID
    FROM dbo_tbl_Restrictions1
    WHERE dbo_tbl_Restrictions1.Auftrags_ID = " & gsVariable5 & ")
AND dbo_tbl_ThisForm.Testfall_ID NOT IN
    (SELECT dbo_tbl_Restrictions1.Testfall_ID
    FROM dbo_tbl_Restrictions1
    WHERE dbo_tbl_Restrictions1.Auftrags_ID IN
        (SELECT Auftrag_ID
        FROM dbo_tbl_Restrictions2
        WHERE Auftragstyp = " & Me.kfAuftragstyp & "))
AND " & strFilter & "
此查询应选中所有复选框。它之所以有效,是因为我硬编码了所有的值(实际上这只对strFilter是必需的)

如果您需要更多信息,请随时询问

欢迎提供任何帮助/建议。提前谢谢

编辑:

使用
strFilter=((Lookup\u program\u IDFS.Name=“ad1incl”))运行查询时,
出现以下错误:

“运行时错误'3061'。参数太少。应为1。”

我现在才明白,un-/检查对字段
Funktion
也不起作用。此字段和
program\u IDFS
字段都是表
dbo\u tbl\u ThisForm
中数据类型int的外键

当通过字段
Fachbereich
进行过滤时,它会取消选中复选框,因为该字段的数据类型为varchar,因此
strFilter
设置为有效值:

((dbo_tbl_ThisForm.Fachbereich=“Steuern”))

这些外键都链接到单独的表。现在我该怎么解决这个问题呢?我需要在查询中包含这些表吗?我可以更改一下表格上的内容吗


谢谢

您是否尝试过重新定位过滤器,如:

UPDATE dbo_tbl_ThisForm
SET dbo_tbl_ThisForm.Checkbox = 0,
    dbo_tbl_ThisForm.Statusoffen = '0'
WHERE dbo_tbl_ThisForm.Testfall_ID NOT IN
    (SELECT dbo_tbl_Restrictions1.Testfall_ID
    FROM dbo_tbl_Restrictions1
    WHERE dbo_tbl_Restrictions1.Auftrags_ID = " & gsVariable5 & ")
AND " & strFilter & "
AND dbo_tbl_ThisForm.Testfall_ID NOT IN
    (SELECT dbo_tbl_Restrictions1.Testfall_ID
    FROM dbo_tbl_Restrictions1
    WHERE dbo_tbl_Restrictions1.Auftrags_ID IN
        (SELECT Auftrag_ID
        FROM dbo_tbl_Restrictions2
        WHERE Auftragstyp = " & Me.kfAuftragstyp & "))

可能是嵌套查询有问题?另外,你能告诉我们你得到的错误是什么吗?您可能希望在UPDATE语句之前插入一个代码中断,并针对您知道有效的内容运行它,检查Access认为strFilter是什么,然后针对您遇到问题的内容再次执行该操作,并比较strFilter的值。确保它们符合逻辑,并且它们所限制的列拼写正确,并且值存在。

因为我无法摆脱前面的
查找\uuu
-我决定在VBA中处理它

我使用下面的VBA代码将带有查找\uu[field]的部分更改为相应的SQL查询:

If InStr(strFilter, "Lookup_") <> 0 Then
    If InStr(strFilter, "Programm__IDFS") <> 0 Then
        strFilter = Replace(strFilter, "(Lookup_Programm__IDFS.Name", "dbo_tbl_ThisForm.Programm_IDFS = (SELECT ID_Programm FROM dbo_Programm WHERE Name")
    ElseIf InStr(strFilter, "Funktion") <> 0 Then
        strFilter = Replace(strFilter, "(Lookup_Funktion.Beschreibung", "dbo_tbl_ThisForm.TF_Funktion_IDFS = (SELECT TF_Funktion_ID FROM dbo_TF_Funktionen WHERE Beschreibung")
    End If
End If


这样,它可以更新所有复选框。我没有找到一种方法来删除
查找
-东西,也没有找到为什么它只影响某些组合框。最重要的是它现在可以工作了。:)

最近,我遇到了一个类似的问题,一个应用程序在Access 2003下运行良好后升级到Access 2013。我注意到表单的组合框控件与其源字段的名称完全相同。我怀疑在生成过滤器时,名称模糊可能会混淆访问,因此重命名了控件(给它们一个“cbo”前缀)。这似乎解决了大多数情况下的问题

有些用户仍然会看到这种情况时有发生,但我还没有删除所有模棱两可的名称:我只修复了用于过滤的名称。我计划在下一个版本中为其他人做这件事


在控件的数据源字段中指定不同的名称应该不会有什么坏处,而且我总是发现这会使我更容易理解应用程序。

感谢您的努力和想法。重新定位过滤器不会改变任何东西。我添加了错误消息和strFilter的值,当它工作时-请查看编辑。这个怎么样。它需要一个额外的步骤,但将整个Update语句设置为一个变量。例如,设置strSQL=“updatedbo\u tbl\u ThisForm…”。然后,您可以执行DoCmd.RunSQL(strSQL)来运行代码。这样做的好处是,如果在其中插入代码分隔符,则可以在SQL字符串尝试运行之前准确地看到它是什么。确保任何应该是整数的都是整数,任何应该是文本的都是文本,等等。。。您还可以将strSQL的值打印到即时窗口中,然后将其复制/粘贴到一个空白查询中,看看它是否告诉您任何信息。很抱歉,我忘了在我的问题中提到,我已经尝试过了。我发布的第二个查询与VBA生成的查询类似,只是最后一行是
和((Lookup\u program\u\IDFS.Name=“ad1incl”)
。如果我在一个空白查询中运行它,它只会请求用于查找的参数。。。当我进入某物时,就好像没有任何限制。问题在于形式过滤。它生成了一个奇怪的查找程序…命名为thingy,我不明白。没有这样的领域。数据库也是一个外部MSSQL-DB。但我不认为这有什么关系。你确定Lookup\u program\u\u IDFS是一个表的名称吗?我在SELECT语句中没有看到它。如果它是表单的名称,则需要在其前面加上表单!。或者,你可以用我来代替它。如果它是当前打开的表单。另外,您还没有向我们显示任何详细说明strFilter是如何生成的代码。
If InStr(strFilter, "Lookup_") <> 0 Then
    If InStr(strFilter, "Programm__IDFS") <> 0 Then
        strFilter = Replace(strFilter, "(Lookup_Programm__IDFS.Name", "dbo_tbl_ThisForm.Programm_IDFS = (SELECT ID_Programm FROM dbo_Programm WHERE Name")
    ElseIf InStr(strFilter, "Funktion") <> 0 Then
        strFilter = Replace(strFilter, "(Lookup_Funktion.Beschreibung", "dbo_tbl_ThisForm.TF_Funktion_IDFS = (SELECT TF_Funktion_ID FROM dbo_TF_Funktionen WHERE Beschreibung")
    End If
End If
((Lookup_Programm__IDFS.Name="ad1incl")) 
(dbo_tbl_ThisForm.Programm_IDFS = (SELECT ID_Programm FROM dbo_Programm WHERE Name="ad1incl"))