【问题标题】:Use the filter of a form in a SQL query via VBA通过 VBA 在 SQL 查询中使用表单的过滤器
【发布时间】:2014-03-13 13:40:36
【问题描述】:

我在 Access 2013 中通过 VBA 在 SQL 查询中使用 filter by form 时遇到问题。我没有创建 Access 表单,但受委托更正一个问题。客户还告诉我,它在以前的 Office 版本中工作,并且 Access-Database 在过去几年中没有更改。看来,Access 2013 做了一些不同的事情。但我不知道是什么。

正如您在下文中所理解的那样,红色突出显示的按钮应该取消/选中所有黄色突出显示的复选框。在我按表单添加过滤器(图像底部的红色框)之前,这非常有效。具有讽刺意味的是,我仅通过过滤 红色下划线字段 Programm_IDFS 才遇到此问题。按其他字段过滤效果很好。 此查询应取消选中复选框,但它会失败,因为 strFilter 的值是:

((Lookup_Programm__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 是必需的)。

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"))

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

谢谢

【问题讨论】:

    标签: sql ms-access filter vba


    【解决方案1】:

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

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

    为控件的数据源字段赋予不同的名称应该不会有什么坏处,而且我一直发现它可以让我更容易理解应用程序。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 已经感谢您的努力和想法。重新定位过滤器不会改变任何东西。我在工作时添加了错误消息和strFilter 的值 - 请查看编辑。
      • 这个怎么样。它需要一个额外的步骤,但将整个 Update 语句设置为一个变量。例如,设置 strSQL = "UPDATE dbo_tbl_ThisForm..."。然后,您可以执行 DoCmd.RunSQL (strSQL) 来运行代码。好处是,如果您在其中放置代码中断,您可以在 SQL 字符串尝试运行之前准确地看到它是什么。确保应该是整数的任何东西都是整数,应该是文本的任何东西都是文本等...您还可以将 strSQL 的值打印到即时窗口,然后将其复制/粘贴到空白查询和看看它能告诉你什么。
      • 对不起,我忘了在我的问题中提到,我已经尝试过了。我发布的第二个查询就像 VBA 生成的查询一样,只是最后一行是AND ((Lookup_Programm__IDFS.Name="ad1incl"))。如果我在一个空白查询中运行它,它只要求 Lookup_Programm_... 的参数,当我输入一些东西时,它就像没有限制一样。问题是按形式过滤。它会生成奇怪的 Lookup_Progra...Name 东西,我不明白。没有这样的领域。该数据库也是一个外部 MSSQL-DB。但我认为这无关紧要。
      • 您确定 Lookup_Programm__IDFS 是表的名称吗?我在 SELECT 语句中看不到它。如果它是表单的名称,那么它需要以 Forms! 开头。或者,如果是当前打开的表单,您可以将其替换为 Me。
      • 另外,您还没有向我们展示任何详细说明如何生成 strFilter 的代码。
      【解决方案3】:

      由于我无法摆脱前面的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_-thing 的方法,也没有找到为什么它只影响某些组合框。最主要的是它现在可以工作。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多