2017-02-28 110 views
0

我試圖找到類似帖子中的答案,但我找不到需要放置額外語法或刪除的地方。訪問vba錯誤3075語法

,如果我把它放在一個列表框記錄在屬性窗口,在其自己的作品查詢:

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

誰能幫我給Insight在我做錯了什麼還是什麼我忘了嗎?

+0

'Nz'不是SQL語法,所以需要在字符串之外設置。 – finjo

+0

這很奇怪。正常的SQL查詢(第一個代碼)也有'NZ',它可以工作。翻譯成VBA不會(第二段代碼)翻譯成多麼複雜,你說的是真的嗎? – TimB

+0

我不認爲'Nz'是問題所在。閱讀本文:[如何在VBA中調試動態SQL](http://stackoverflow.com/questions/418960/managing-and-debugging-sql-queries-in-ms-access/1099570#1099570)。很可能你需要圍繞所有包含字符串的控件。 – Andre

回答

2

考慮一個參數化的查詢,它避免了任何需要報價附件。隨着DAO,你跟Parameters收集指定的佔位符名稱和數據類型,並先於通常的SQL命令這樣做(即SELECTUPDATEINSERTDELETEALTER):

' 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() 
... 

事實上,上述準備的語句可以綁定參數值作爲PARAMETERS條款被保存爲一個存儲查詢,然後就被稱爲按名稱訪問SQL完全符合:

Set db = CurrentDb 
Set qdf = db.QueryDefs("SavedQueryName") 

' 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() 
+0

感謝您的反饋!我已經解決了它我會後您的文章下方的其他方式。 – TimB

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 

正如你可以看到我擺脫了不同的過濾器,並只提供一個過濾器,看起來整個查詢/表。

感謝大家與我思考,並給我洞察如何解決不同過濾器的問題。

+0

通過將通配符在每個語句訪問搜索數據將不會使用任何索引的前面。乘上了七場,每記錄,一旦你作爲一箇中等這個查詢將運行緩慢痛苦,然後記錄大小數可能掛起。您應該構建您的where子句動態,包括你需要的唯一標準。看一看這裏的優秀導遊http://allenbrowne.com/ser-62.html – Minty

+0

感謝您的有用的文章! – TimB

+0

也如上圖所示,考慮參數化站(行業最佳實踐),以避免需要處理比,誰可以運行或表單[SQL注入](http://bobby-tables.com/)惡意用戶。對於LIKE,添加帶有綁定值的通配符。即使使用保存的查詢來優化器的最佳計劃。 – Parfait