访问vba错误3075语法

时间:2017-02-28 12:56:51

标签: sql vba ms-access

我试图在相似的帖子中找到答案,但我找不到需要添加额外语法或删除语法的地方。

如果我将它放在属性窗口中的列表框记录集中,则它自身的查询有效:

SELECT Overzicht_codes.code_compleet AS Code, Overzicht_codes.omschrijving1, Overzicht_codes.omschrijving2, Overzicht_codes.omschrijving3, Overzicht_codes.omschrijving4, Overzicht_codes.omschrijving5, Overzicht_codes.omschrijving6 
FROM Overzicht_codes
WHERE (((Nz([opleidingniveau]=[Forms]![OverzichtOpleidingen].[cbOpleiding],[opleidingniveau]))<>False) 
AND ((Nz([subniveau]=[Forms]![OverzichtOpleidingen].[cbopleidingniveau],[subniveau]<>False))<>False) 
AND ((Nz([studiegroep]=[Forms]![OverzichtOpleidingen].[cbstudiegroep],[studiegroep]<>False))<>False) 
AND ((Nz([studierichting]=[Forms]![OverzichtOpleidingen].[cbstudierichting],[studierichting]<>False))<>False))
ORDER BY Overzicht_codes.code_compleet;

现在我想在VBA中使用相同的代码作为一种“重置”。对于VBA,它需要一些改变:

SQL = "SELECT Overzicht_codes.code_compleet AS Code, Overzicht_codes.omschrijving1, Overzicht_codes.omschrijving2, Overzicht_codes.omschrijving3, Overzicht_codes.omschrijving4, Overzicht_codes.omschrijving5, Overzicht_codes.omschrijving6 " _
    & "FROM Overzicht_codes " _
    & "WHERE (((Nz([opleidingniveau]= " & Me.cbOpleiding & ",Overzicht_codes.[opleidingniveau]))<>False) " _
    & "AND ((Nz([subniveau]= " & Me.cbOpleidingNiveau & ",Overzicht_codes.[subniveau]<>False))<>False) " _
    & "AND ((Nz([studiegroep]= " & Me.cbStudiegroep & ",Overzicht_codes.[studiegroep]<>False))<>False) " _
    & "AND ((Nz([studierichting]= " & Me.cbStudierichting & ",Overzicht_codes.[studierichting]<>False))<>False)) " _
    & "ORDER BY Overzicht_codes.[code_compleet]"

我已经阅读了一些关于在代码的字符串部分添加额外'的内容。但经过多次尝试,它仍然会出错。

如需进一步了解,错误信息如下:

Error image

谁能帮助我洞察我做错了什么或忘记了什么?

2 个答案:

答案 0 :(得分:2)

考虑一个参数化查询,它可以避免任何引用封装的需要。使用DAO,您可以使用Parameters集合来指定占位符名称和数据类型,并在通常的SQL命令之前(即SELECTUPDATEINSERT,{ {1}},DELETE):

ALTER

实际上,上面准备好的语句可以保存为存储查询,然后只需按名称调用绑定参数值,因为' PREPARED STATEMENT WITH PLACEHOLDERS strSQL = "PARAMETERS [cbOpleiding_param] TEXT, [cbopleidingniveau_param] TEXT," _ & " [cbstudiegroep_param] TEXT, [cbstudierichting_param] TEXT;" _ & "SELECT Overzicht_codes.code_compleet AS Code, Overzicht_codes.omschrijving1," _ & " Overzicht_codes.omschrijving2, Overzicht_codes.omschrijving3," _ & " Overzicht_codes.omschrijving4, Overzicht_codes.omschrijving5," _ & " Overzicht_codes.omschrijving6 " _ & "FROM Overzicht_codes " _ & "WHERE (((Nz([opleidingniveau]= [cbOpleiding_param], Overzicht_codes.[opleidingniveau]))<>False) " _ & "AND ((Nz([subniveau]= [cbopleidingniveau_param], Overzicht_codes.[subniveau]<>False))<>False) " _ & "AND ((Nz([studiegroep]= [cbstudiegroep_param], Overzicht_codes.[studiegroep]<>False))<>False) " _ & "AND ((Nz([studierichting]= [cbstudierichting_param], Overzicht_codes.[studierichting]<>False))<>False)) " _ & "ORDER BY Overzicht_codes.[code_compleet];" Set db = CurrentDb Set qdf = db.CreateQueryDef("", strSQL) ' BIND VALUES TO PARAMETERS qdf.Parameters("cbOpleiding_param") = Me.cbOpleiding qdf.Parameters("cbopleidingniveau_param") = Me.cbOpleidingNiveau qdf.Parameters("cbstudiegroep_param") = Me.cbStudiegroep qdf.Parameters("cbstudierichting_param") = Me.cbStudierichting Set rst = qdf.OpenRecordset() ... 子句完全符合Access SQL:

PARAMETERS

答案 1 :(得分:0)

我用另一种方式解决了它:

Dim db As dao.Database
Dim rst As dao.Recordset
Dim qdf As dao.QueryDef
Dim SQL As String

SQL = "SELECT code_compleet as Code, omschrijving1, omschrijving2, omschrijving3, omschrijving4, omschrijving5, omschrijving6 " _
    & "FROM Overzicht_codes " _
    & "WHERE omschrijving1 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR omschrijving2 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR omschrijving3 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR omschrijving4 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR omschrijving5 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR omschrijving6 LIKE '*" & Me.tbOmschrijving & "*' " _
    & " OR code_compleet LIKE '*" & Me.tbOmschrijving & "*' " _
    & "ORDER BY [code_compleet] "

Set db = CurrentDb
Set qdf = CurrentDb.CreateQueryDef("", SQL)

Set rst = qdf.OpenRecordset()

Set Me.lbOpleidingOverzicht.Recordset = rst
Me.lbOpleidingOverzicht.Requery

Set qdf = Nothing
Call EmptyRecords

正如您所看到的,我摆脱了不同的过滤器,只应用了一个查看整个查询/表格的过滤器。

感谢大家与我一起思考并让我深入了解如何解决不同过滤器的问题。