設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

12下一頁
返回列表 發(fā)新帖
查看: 6962|回復(fù): 19
打印 上一主題 下一主題

[窗體] VBA易用化研究院:如何在VBA中編寫含有變量的SQL語句而不易出錯

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2017-3-10 13:21:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 紅塵如煙 于 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童鞋寫的代碼如下:
  1. strSQL = "INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
  2.        & "VALUES ('未審核'," & Me.日期 & "'," & Forms!SysFrmMain!Nickname & "'," _
  3.        & Now() & "'," & Me.單號 & "')"
復(fù)制代碼

作為一名常年發(fā)車,具有豐富經(jīng)驗的老司機,本公子瞟了兩眼就看出來了下面幾點問題:
1. 引號使用有問題,單引號不成對。
2. 日期必須要格式化,并且兩端加#號。
3. Now()函數(shù)在SQL中同樣可以用,不需要放到VBA中解析。

于是本公子隨手幫他改寫成了下面這樣:
  1. strSQL = "INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
  2.        & "VALUES ('未審核', " & Format(Me.日期,"\#yyyy-mm-dd\#") & ",'" _
  3.        & Forms!SysFrmMain!Nickname & "',Now(),'" & Me.單號 & "')"
復(fù)制代碼
但是,W童鞋用了我發(fā)給他的代碼試了之后告訴我:仍然不行。這就很尷尬了……

又仔細(xì)看了一下,發(fā)現(xiàn)第1個左圓括號用的有問題,應(yīng)該是半角“(”,結(jié)果他寫成全角的“(”了。

抱歉,這倆孿生兄弟長得太像,我這老司機老眼昏花也難以分辨。改正括號問題再試,一切OK。(中間仍然發(fā)生了一些其它問題,但那都不是我們這里要講的故事了)

最后,做為送一贈一的贈品,我向W童鞋推薦了本公子多年苦修領(lǐng)悟的絕學(xué):偷梁換柱。用 Replace 函數(shù)替換的方式,代替引號、連接號的作用。

改寫后的代碼如下:
  1. strSQL = " INSERT INTO 憑證記錄表 (狀態(tài),日期,制單人,制單時間,關(guān)聯(lián)單號)" _
  2.        & " VALUES ('未審核', #@日期#,'@制單人',Now(),'@關(guān)聯(lián)單號')"

  3. strSQL = Repalce(strSQL, "@日期", Format(Me.日期, "yyyy-mm-dd"))
  4. strSQL = Repalce(strSQL, "@制單人", Forms!SysFrmMain!Nickname)
  5. strSQL = Repalce(strSQL, "@關(guān)聯(lián)單號", Me.單號)
復(fù)制代碼

好了,這下子邋遢女漢子變成清新小美女了。

這一招偷梁換柱大法,雖然看著代碼行數(shù)增加了,但卻更加清晰易懂,不易出錯。
推薦各位即將入門或者剛?cè)腴T的童鞋使用,以后你再也不用犯引號糾結(jié)癥了!

本公子底褲都翻出來了,各位吃瓜的客官,你們就不點個贊?


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2017-3-10 13:37:06 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報

3#
發(fā)表于 2017-3-10 13:38:24 | 只看該作者
雖然沒看懂,但是很佩服前輩

點擊這里給我發(fā)消息

4#
發(fā)表于 2017-3-10 14:00:43 | 只看該作者
老司機啊
回復(fù)

使用道具 舉報

點擊這里給我發(fā)消息

5#
發(fā)表于 2017-3-10 14:31:46 | 只看該作者
佩服佩服,果然思路最重要
6#
發(fā)表于 2017-3-10 15:25:23 | 只看該作者
哈哈哈哈 學(xué)習(xí)了
7#
發(fā)表于 2017-3-10 17:00:24 | 只看該作者
好文,學(xué)習(xí)了!
8#
發(fā)表于 2017-3-10 17:07:42 | 只看該作者
老司機整個多條件綜合查詢插件唄,益下群里兄弟!
9#
發(fā)表于 2017-3-10 21:11:15 | 只看該作者
相當(dāng)適用,相當(dāng)實用
10#
發(fā)表于 2017-3-11 00:33:44 | 只看該作者
作為一個剛可以上高速的新司機,表示這一行好像少了個右括號。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:39 , Processed in 0.105318 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表