通过VBA在SQL查询中使用表单的过滤器

时间:2014-03-13 13:40:36

标签: sql vba ms-access filter access-vba

我在Access 2013中通过VBA在SQL查询中使用filter by form时遇到问题。我没有创建Access表单,但委托他们更正问题。此外,客户告诉我,它在以前的Office版本中有效,并且Access-Database在过去几年中没有被更改。看起来,Access 2013做了不同的事情。但我无法弄清楚是什么。

如您所知,红色突出显示按钮应取消/检查所有黄色突出显示的复选框。这完全正常,直到我按表单添加过滤器(图像底部的红框)。具有讽刺意味的是,我只是通过过滤带红色下划线的字段 Programm_IDFS来遇到此问题。通过其他字段筛选工作正常。 Form whose filter acts strange 此查询应取消选中复选框,但失败,因为strFilter的值为:

  

((Lookup_Programm__IDFS.Name =" ad1incl&#34))

这可能适用于过滤,但它不能作为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}所必需的。

UPDATE dbo_tbl_ThisForm
SET dbo_tbl_ThisForm.Checkbox = -1,
    dbo_tbl_ThisForm.Statusoffen = '-1'
WHERE dbo_tbl_ThisForm.Testfall_ID NOT IN
    (SELECT dbo_tbl_Restrictions1.Testfall_ID
    FROM dbo_tbl_Restrictions1
    WHERE dbo_tbl_Restrictions1.Auftrags_ID = 544)
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 = 9))
AND dbo_tbl_ThisForm.Programm_IDFS = 35

如果您需要更多信息,请随时提出。

任何帮助/建议表示赞赏。提前谢谢。

修改

使用strFilter=((Lookup_Programm__IDFS.Name="ad1incl"))运行查询时出现以下错误:

  

"运行时错误' 3061'。参数太少。预计1。"

我现在只是想通了,对于字段Funktion,取消/检查也不起作用。这个和Programm_IDFS字段都是表dbo_tbl_ThisForm中数据类型 int 的外键。

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

  

((dbo_tbl_ThisForm.Fachbereich =" Steuern&#34))

这些外键都链接到不同的表。现在我该如何解决这个问题?我是否需要在查询中包含这些表格?我可以在表格上更改一些内容吗?

谢谢

3 个答案:

答案 0 :(得分:1)

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

有些用户有时仍会看到它发生,但是我还没有删除所有模糊名称:我只修复了用于过滤的名称。我计划在下一个版本中做其他人。

从数据源字段中提供控件的不同名称并不会有什么坏处,而且我总是发现它让我更容易理解应用程序。

答案 1 :(得分:0)

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

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的值。确保它们是合乎逻辑的,并且它们限制的列拼写正确并且值存在。

答案 2 :(得分:0)

由于我无法摆脱前面的Lookup_ - 我决定在VBA中处理它。

我使用以下VBA代码将 Lookup_ [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

例如,如果我在 Programm_IDFS 字段上使用过滤器,则会更改

((Lookup_Programm__IDFS.Name="ad1incl")) 

(dbo_tbl_ThisForm.Programm_IDFS = (SELECT ID_Programm FROM dbo_Programm WHERE Name="ad1incl"))

这样它可以更新所有复选框。我没有找到如何删除Lookup_ - 事物的方法,也没有找到它只影响某些组合框的原因。最重要的是它现在有效。 :)