我在Access 2013中通过VBA在SQL查询中使用filter by form
时遇到问题。我没有创建Access表单,但委托他们更正问题。此外,客户告诉我,它在以前的Office版本中有效,并且Access-Database在过去几年中没有被更改。看起来,Access 2013做了不同的事情。但我无法弄清楚是什么。
如您所知,红色突出显示按钮应取消/检查所有黄色突出显示的复选框。这完全正常,直到我按表单添加过滤器(图像底部的红框)。具有讽刺意味的是,我只是通过过滤带红色下划线的字段 Programm_IDFS
来遇到此问题。通过其他字段筛选工作正常。
此查询应取消选中复选框,但失败,因为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))
这些外键都链接到不同的表。现在我该如何解决这个问题?我是否需要在查询中包含这些表格?我可以在表格上更改一些内容吗?
谢谢
答案 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_
- 事物的方法,也没有找到它只影响某些组合框的原因。最重要的是它现在有效。 :)