本帖最后由 紅塵如煙 于 2017-3-17 15:41 編輯
在VBA中編寫含有變量的SQL語句的代碼,歷來是Access初學(xué)者甚至已入門者頭痛的問題。
其中各種引號、連接號的嵌套,看上去紛繁復(fù)雜,眼花繚亂,極易把人搞暈菜,別說初學(xué)者了,縱然是多年老司機,也時常翻車。
因為在VBA中編寫的一句含有多個變量的SQL語句,始終報錯不能正常執(zhí)行,折騰N小時乃至N天,仍然百撕不得騎姐的大有人在。
我們來看一個真實案例(因情節(jié)需要有所改編):W童鞋因為下面這個SQL語句的編寫,折騰了半天時間(實打?qū)嵉陌胩欤。?/font>
頭發(fā)抓掉了幾十根,什么學(xué)生卡、老年卡、公交卡、處男卡、白領(lǐng)卡……他自己能找到的卡都刷了個遍,卻還是上不了Access發(fā)的車!
于是找到我求助。
W童鞋寫的代碼如下: - strSQL = "INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
- & "VALUES ('未審核'," & Me.日期 & "'," & Forms!SysFrmMain!Nickname & "'," _
- & Now() & "'," & Me.單號 & "')"
復(fù)制代碼
作為一名常年發(fā)車,具有豐富經(jīng)驗的老司機,本公子瞟了兩眼就看出來了下面幾點問題: 1. 引號使用有問題,單引號不成對。
2. 日期必須要格式化,并且兩端加#號。
3. Now()函數(shù)在SQL中同樣可以用,不需要放到VBA中解析。
于是本公子隨手幫他改寫成了下面這樣:- strSQL = "INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
- & "VALUES ('未審核', " & Format(Me.日期,"\#yyyy-mm-dd\#") & ",'" _
- & Forms!SysFrmMain!Nickname & "',Now(),'" & Me.單號 & "')"
復(fù)制代碼 但是,W童鞋用了我發(fā)給他的代碼試了之后告訴我:仍然不行。這就很尷尬了……
又仔細(xì)看了一下,發(fā)現(xiàn)第1個左圓括號用的有問題,應(yīng)該是半角“(”,結(jié)果他寫成全角的“(”了。
抱歉,這倆孿生兄弟長得太像,我這老司機老眼昏花也難以分辨。改正括號問題再試,一切OK。(中間仍然發(fā)生了一些其它問題,但那都不是我們這里要講的故事了)
最后,做為送一贈一的贈品,我向W童鞋推薦了本公子多年苦修領(lǐng)悟的絕學(xué):偷梁換柱。用 Replace 函數(shù)替換的方式,代替引號、連接號的作用。
改寫后的代碼如下:
- strSQL = " INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
- & " VALUES ('未審核', #@日期#,'@制單人',Now(),'@關(guān)聯(lián)單號')"
- strSQL = Repalce(strSQL, "@日期", Format(Me.日期, "yyyy-mm-dd"))
- strSQL = Repalce(strSQL, "@制單人", Forms!SysFrmMain!Nickname)
- strSQL = Repalce(strSQL, "@關(guān)聯(lián)單號", Me.單號)
復(fù)制代碼
好了,這下子邋遢女漢子變成清新小美女了。
這一招偷梁換柱大法,雖然看著代碼行數(shù)增加了,但卻更加清晰易懂,不易出錯。 推薦各位即將入門或者剛?cè)腴T的童鞋使用,以后你再也不用犯引號糾結(jié)癥了!
本公子底褲都翻出來了,各位吃瓜的客官,你們就不點個贊?
|