ACCESS窗體查詢實(shí)例_第1頁(yè)
ACCESS窗體查詢實(shí)例_第2頁(yè)
ACCESS窗體查詢實(shí)例_第3頁(yè)
ACCESS窗體查詢實(shí)例_第4頁(yè)
ACCESS窗體查詢實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一. 概述作為數(shù)據(jù)管理程序,統(tǒng)計(jì)和查詢功能是非常重要的。否則,就和電子表格沒(méi)有區(qū)別了。所以,在每個(gè)ACCESS程序中都不可能缺少查詢的功能。本文的目的是由淺入深的介紹幾種最常用的利用主/子窗體來(lái)實(shí)現(xiàn)查詢的方法,使初學(xué)者和有一定VBA基礎(chǔ)的人可以更好的使用窗體查詢這種手段。附件中的窗體“常用窗體查詢0.MDB”,僅包含3個(gè)數(shù)據(jù)表、1個(gè)查詢和以這個(gè)查詢?yōu)閿?shù)據(jù)源的報(bào)表。是為了大家根據(jù)后面學(xué)習(xí)的內(nèi)容作練習(xí)用的。我們先看查詢中的數(shù)據(jù):書籍編號(hào)書名類別作者出版社單價(jià)進(jìn)書日期22CHIP-01-08報(bào)刊電子計(jì)算機(jī)與外部設(shè)備期刊社電子計(jì)算機(jī)與外部設(shè)備¥16.802001-9-2825電腦新時(shí)代-6光盤光盤UN

2、KNOWN電腦新時(shí)代¥5.002002-7-827學(xué)電腦-7光盤光盤UNKNOWN人民郵電¥5.002002-7-1328CHIP-02-07光盤光盤電子計(jì)算機(jī)與外部設(shè)備雜志社電子計(jì)算機(jī)與外部設(shè)備¥5.002002-7-1316MCSE學(xué)習(xí)指南書籍Syngress Media公司人民郵電¥62.002001-9-2817局域網(wǎng)原理與架設(shè)技術(shù)內(nèi)幕大公開(kāi)書籍蔡昌均中國(guó)青年¥69.002001-9-2819AccessVBA基礎(chǔ)書籍EvanCallahan人民郵電¥39.002001-9-2820中文版Access2001一冊(cè)通書籍趙琳等人民郵電¥42.002001-9-2821VISUALBASI

3、C5.0教程書籍SteveBrown電子工業(yè)¥28.002001-9-2823中文版VisualBasic5.0程序員指南書籍microsoft中國(guó)青年¥70.002001-9-2824Access中文版開(kāi)發(fā)指南書籍Alison Balter人民郵電¥128.002002-2-1629Access 2002數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)實(shí)例導(dǎo)航書籍桂思強(qiáng)中國(guó)鐵道¥25.002003-3-1030中國(guó)名陵集中華古代名陵之大成書籍羅哲文等百花文藝¥14.002003-5-2031邊緣部落福音谷書籍林茨(撰文攝影)河北教育¥27.002003-5-20為了比較有代表性,這個(gè)查詢中包含多種字段類型:數(shù)字類型:【書籍編

4、號(hào)】、【單價(jià)】字符類型:【書名】、【類別】、【作者】、【出版社】日期類型:【進(jìn)書日期】在多條件查詢中,我們會(huì)使用除了【書籍編號(hào)】之外的其他字段作為查詢條件。其實(shí),在下面介紹的窗體查詢方法中,有些代碼或思路也可以應(yīng)用在其它窗體查詢方法中,你對(duì)各種代碼、方法和思路越熟練,就越能充分發(fā)揮它們的作用。這篇文章我是從4月初開(kāi)始構(gòu)思,到5月中旬開(kāi)始動(dòng)筆,花費(fèi)兩周時(shí)間寫成,里面包含了我對(duì)ACCESS窗體查詢所積累的經(jīng)驗(yàn),對(duì)初學(xué)者和有一定VBA基礎(chǔ)的人都有針對(duì)性的方法。另外,希望其他精通ACCESS的高手提出意見(jiàn)。二. 制作主/子窗體的步驟1. 利用向?qū)е谱髦鞔绑w現(xiàn)在的主窗體還太小,要已經(jīng)以下步驟才能變成我們

5、需要的主窗體(如下圖):把窗體面積放大到足以容納條件輸入字段和子窗體,并調(diào)整所有控件的字體;把窗體的“記錄源”和各控件的“數(shù)據(jù)來(lái)源”都刪除(很多初學(xué)者很容易犯的錯(cuò)誤就是這里),把類別和出版社改為組合框(因?yàn)檫@些字段的可能值比較少,直接選擇就好,不必讓用戶輸入);重新調(diào)整各字段的位置,并增加了兩個(gè)空文本框和標(biāo)簽放在單價(jià)和進(jìn)書日期后面(因?yàn)槲掖蛩闶褂靡粋€(gè)范圍來(lái)作查詢條件,而不是一個(gè)固定的值,這樣比較符合實(shí)際);單價(jià)后面的兩個(gè)文本框改名為“單價(jià)開(kāi)始”和“單價(jià)截止”,進(jìn)書日期后面的兩個(gè)文本框改名為“進(jìn)書日期開(kāi)始”和“進(jìn)書日期截止”;畫一個(gè)矩形框包住所有查詢條件,把矩形框背景設(shè)置為常規(guī),背景色為深灰色,

6、特殊樣式為凹陷,此時(shí)矩形框覆蓋了其它控件,要用菜單中“格式”“置于底層”才能讓它們顯示出來(lái);在窗體上用向?qū)Ы⒁粋€(gè)按鈕,按鈕標(biāo)題是“查詢”,名稱是“cmd查詢”先不管里面的代碼,后面再修改;窗體屬性中“記錄選定器”否,“瀏覽按鈕”否。2. 利用向?qū)гO(shè)計(jì)子窗體在主窗體中用工具箱中的“子窗體/子報(bào)表”對(duì)象建立一個(gè)子窗體;以存書查詢?yōu)橛涗浽矗x擇所有字段;把子窗體命名為“存書查詢子窗體”;在主窗體上刪除子窗體的標(biāo)簽,并重新調(diào)整子窗體的大?。魂P(guān)閉主窗體的設(shè)計(jì)視圖,單獨(dú)打開(kāi)子窗體數(shù)據(jù)表視圖,調(diào)整字體和行的大小?,F(xiàn)在,我們得到了如下的窗體:現(xiàn)在還沒(méi)有實(shí)際的查詢功能,我們?cè)诤竺嬉鶕?jù)所使用的方法,修改窗體并

7、增加一些其他的功能。還有一些小的細(xì)節(jié)要注意,比如:按TAB鍵后的獲得光標(biāo)的控件的順序要在設(shè)計(jì)視圖下,視圖菜單的“TAB鍵次序”來(lái)修改;有些文本框獲得焦點(diǎn)后是否要打開(kāi)輸入法,比如輸入單價(jià)和日期的地方要關(guān)閉,輸入書名和作者的地方要打開(kāi),這些要在控件屬性中設(shè)置。三. 查詢方法1:在查詢中加入條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫(kù)是:“常用窗體查詢1.MDB”。1. 設(shè)計(jì)查詢我們打開(kāi)“存書查詢”設(shè)計(jì)視圖如下:在字段【書名】的準(zhǔn)則格內(nèi)寫入:Like IIf(IsNull(Forms!存書查詢窗體!書名),'*','*' & Forms!存書查詢窗體!書名 & 

8、9;*')加入后的設(shè)計(jì)視圖如下:把這個(gè)式子解釋一下:LIKE:是專門用于查詢字符型字段的運(yùn)算符,一般介紹ACCESS的書中都有它的用法。ISNULL(Forms!存書查詢窗體!書名):是用來(lái)判斷窗體“存書查詢窗體”上面的“書名”這個(gè)文本框是否是空的。如果文本框是空的,則:ISNULL(Forms!存書查詢窗體!書名)=TRUE(真)如果文本框不是空的,則:ISNULL(Forms!存書查詢窗體!書名)=FALSE(假)IIF(EXPR, TRUEPART, FALSEPART)函數(shù):EXPR 必要參數(shù)。用來(lái)判斷真?zhèn)蔚谋磉_(dá)式。 TRUEPART 必要參數(shù)。如果 EXPR 為 TRUE,則

9、返回這部分的值或表達(dá)式。FALSEPART 必要參數(shù)。如果 EXPR 為 FALSE,則返回這部分的值或表達(dá)式。所以當(dāng)我們?cè)诖绑w“存書查詢窗體”上面的“書名”里寫上“ACCESS”,整個(gè)式子的結(jié)果是:LIKE *ACCESS*相當(dāng)于查詢所有書名中包含“ACCESS”的書籍,這樣可以實(shí)現(xiàn)模糊查詢。Like IIf(IsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名 & '*')Like IIf(IsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名)如果把準(zhǔn)則改為上面兩

10、句中的一句,同樣情況下當(dāng)我們?cè)诖绑w“存書查詢窗體”上面的“書名”里寫上“ACCESS”,整個(gè)式子的結(jié)果是:LIKE ACCESS*LIKE ACCESS相當(dāng)于查詢以“ACCESS”開(kāi)頭的書籍(半模糊查詢),或者書名就叫“ACCESS”的書(精確查詢)。具體使用那一種形式的查詢要根據(jù)你的實(shí)際情況來(lái)修改。當(dāng)我們?cè)诖绑w“存書查詢窗體”上面的“書名”里什么也沒(méi)有寫,整個(gè)式子的結(jié)果是:LIKE *相當(dāng)于查詢所有的有書名的書。在書寫查詢準(zhǔn)則時(shí),F(xiàn)orms!存書查詢窗體!書名這樣的窗體控件名很難寫,這時(shí)你可以在準(zhǔn)則格內(nèi)點(diǎn)鼠標(biāo)右鍵,選擇生成器,出現(xiàn)如下圖的窗口:在左邊的樹(shù)型列表框里找到控件所在的窗體,在中間列

11、表框出現(xiàn)這個(gè)窗體包含的所有控件,雙擊控件名,就會(huì)出現(xiàn)“Forms!存書查詢窗體!書名”。我們?cè)侔哑渌麕讉€(gè)字段的查詢準(zhǔn)則寫出:【類別】:在窗體上是組合框,所以它肯定是個(gè)精確查詢,跟【書名】一樣,它是文本字段。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms!存書查詢窗體!類別),'*',Forms!存書查詢窗體!類別)【作者】:跟【書名】一樣,它是文本字段。我也打算用模糊查詢。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms!存書查詢窗體!作者),'*','*' & Forms!存書查詢窗體!作者 & '*&

12、#39;)【出版社】:跟【類別】的情況完全一樣。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms!存書查詢窗體!出版社),'*',Forms!存書查詢窗體!出版社)【單價(jià)】:是一個(gè)數(shù)字字段,我在這里準(zhǔn)備讓用戶可以查詢“1.5元6.5元”這樣的范圍。查詢準(zhǔn)則如下:Between IIf(IsNull(Forms!存書查詢窗體!單價(jià)開(kāi)始),0,Forms!存書查詢窗體!單價(jià)開(kāi)始) And IIf(IsNull(Forms!存書查詢窗體!單價(jià)截止),5000,Forms!存書查詢窗體!單價(jià)截止)BETWEEN AND:是查詢符合某個(gè)范圍之內(nèi)的值所需的條件格式?!癇ETWEEN

13、 1 AND 5”相當(dāng)于“【字段】1 AND 【字段】5”。根據(jù)前面講解的IIF的內(nèi)容,我用一個(gè)表格來(lái)解釋一下各種情況下這個(gè)式子的實(shí)際結(jié)果,便于大家理解:(0和5000是我事先在條件中設(shè)定的最小值和最大值)單價(jià)開(kāi)始的值單價(jià)截止的值整個(gè)式子的實(shí)際結(jié)果空空BETWEEN 0 AND 50001.5空BETWEEN 1.5 AND 5000空20BETWEEN 0 AND 201.56.5BETWEEN 1.5 AND 6.5【進(jìn)書日期】:是一個(gè)日期型字段,我在這里準(zhǔn)備讓用戶可以查詢“#2001-5-1#2002-5-1#”這樣的范圍。查詢準(zhǔn)則如下:Between (IIf(IsNull(Forms

14、!存書查詢窗體!進(jìn)書日期開(kāi)始),#2000-1-1#,Forms!存書查詢窗體!進(jìn)書日期開(kāi)始) And (IIf(IsNull(Forms!存書查詢窗體!進(jìn)書日期截止),#2099-12-31#,Forms!存書查詢窗體!進(jìn)書日期截止)在這個(gè)式子中,#2000-1-1#和#2099-12-31#是我設(shè)定的兩個(gè)默認(rèn)的開(kāi)始和截止日期。如果用戶不輸入,就使用默認(rèn)值了。這和前面【單價(jià)】的情況是一樣的。2. 設(shè)計(jì)按鈕及代碼2.1 查詢按鈕查詢按鈕的代碼非常簡(jiǎn)單,關(guān)鍵部分只有一句:Private Sub cmd查詢_Click() Me.存書查詢子窗體.Requery '這句是關(guān)鍵End SubR

15、EQUERY:是用來(lái)重新查詢控件的數(shù)據(jù)源,這樣可以刷新子窗體顯示的記錄。對(duì)于記錄源是表或查詢的控件如窗體、列表框、組合框等經(jīng)常用Requery方法來(lái)刷新顯示內(nèi)容。2.2 清除按鈕有了查詢按鈕的代碼之后,大家就可以自己測(cè)試查詢的效果了。不過(guò),每次想換一個(gè)查詢的條件時(shí)要清除上一個(gè)條件輸入的東西,有時(shí)候比較麻煩。我們?cè)賮?lái)設(shè)計(jì)一個(gè)清除條件的按鈕,控件名稱是“cmd清除”,放在查詢按鈕的下面。按鈕的代碼如下:Private Sub cmd清除_Click() '下面這些控件的值要清空 Me.書名 = Null Me.類別 = Null Me.作者 = Null Me.出版社 = Null Me.

16、單價(jià)開(kāi)始 = Null Me.單價(jià)截止 = Null Me.進(jìn)書日期開(kāi)始 = Null Me.進(jìn)書日期截止 = Null Me.存書查詢子窗體.Requery '清空之后一樣要重新查詢End Sub2.3 打印按鈕有了查詢結(jié)果,想打印出來(lái),很簡(jiǎn)單。由于報(bào)表的記錄源就是“存書查詢”,所以在查詢里設(shè)計(jì)的條件會(huì)直接在報(bào)表里體現(xiàn)出來(lái)。我們只要用按鈕向?qū)е谱饕粋€(gè)預(yù)覽報(bào)表的按鈕就可以了。我們把這個(gè)按鈕放在子窗體下面的右邊??丶Q是“cmd預(yù)覽報(bào)表”。由于完全是采用向?qū)е谱鞯?,不需修改代碼,所以我就不在這里列出代碼了。2.4 導(dǎo)出EXCEL按鈕如果你覺(jué)得ACCESS的報(bào)表邊框太難看,或者你想在報(bào)表

17、上加上一些說(shuō)明什么的。你可能更愿意把數(shù)據(jù)導(dǎo)出到EXCEL里進(jìn)行再加工。為了初學(xué)者容易理解,我打算用一個(gè)宏來(lái)解決這個(gè)問(wèn)題。宏的設(shè)計(jì)如下圖:現(xiàn)在,宏里“輸出文件”為空,運(yùn)行時(shí)會(huì)自動(dòng)跳出對(duì)話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫(kù)所在目錄下的“查詢結(jié)果.xls”里,可以在“輸出文件”一欄里填入:=currentproject.path & "查詢結(jié)果.xls"把這個(gè)宏存為“導(dǎo)出查詢數(shù)據(jù)宏”。然后再在窗體里加入按鈕。當(dāng)按鈕向?qū)С霈F(xiàn)后,直接取消。在按鈕的屬性頁(yè)里,先把按鈕名稱改為“cmd導(dǎo)出”,在按鈕的“單擊事件”里直接用下拉框選擇“導(dǎo)出查詢數(shù)據(jù)宏”,如下圖。這樣就不

18、必編寫代碼了。3. 增加統(tǒng)計(jì)功能經(jīng)常有人需要在主窗體上顯示符合查詢條件的記錄總數(shù),以及子窗體中某一字段的合計(jì)。所以,我們也準(zhǔn)備在主窗體上增加記錄總數(shù)和單價(jià)的合計(jì)。3.1 子窗體上的設(shè)計(jì)單獨(dú)打開(kāi)子窗體的設(shè)計(jì)模式,在窗體頁(yè)腳部分拉出一段窗體;在上面增加兩個(gè)文本框:一個(gè)是“txt計(jì)數(shù)”,控件來(lái)源=Count(*),另一個(gè)是“txt單價(jià)合計(jì)”,控件來(lái)源=Sum(單價(jià));在子窗體的窗體屬性中設(shè)置:瀏覽按鈕否,記錄集類型快照(快照的運(yùn)行速度快,占用內(nèi)存少,但不能編輯更新,正適合我們的需要);3.2 主窗體上的設(shè)計(jì)在子窗體下面的地方設(shè)計(jì)兩個(gè)文本框“計(jì)數(shù)”和“合計(jì)”,把它們的標(biāo)簽改為“符合條件記錄數(shù):”和“單

19、價(jià)合計(jì):”;“計(jì)數(shù)”文本框的控件來(lái)源=存書查詢子窗體.Form.txt計(jì)數(shù),“合計(jì)”文本框的控件來(lái)源=存書查詢子窗體.Form.txt單價(jià)合計(jì);由于主窗體上的這兩個(gè)文本框是自動(dòng)計(jì)算的,為了區(qū)別,設(shè)置它們的是否有效否,是否鎖定是,背景顏色深灰色。4. 方法總結(jié)現(xiàn)在,整個(gè)窗體就已經(jīng)完成了。大家可以使用各種條件組合來(lái)測(cè)試一下窗體的效果。4.1 本方法優(yōu)點(diǎn)在查詢中加入條件這種方法比較簡(jiǎn)單,只要在查詢中設(shè)計(jì)好各字段的條件,那么窗體中的代碼就非常少,而且在打印報(bào)表和導(dǎo)出數(shù)據(jù)方面也很容易設(shè)計(jì),比較適合初學(xué)ACCESS的人使用。4.2 本方法缺點(diǎn)對(duì)查詢中的數(shù)據(jù)有限制,所有設(shè)計(jì)了條件的字段中必須是每條記錄都有數(shù)

20、據(jù)。即使你在窗體中并沒(méi)有在這個(gè)字段對(duì)應(yīng)的文本框中輸入條件。舉例來(lái)說(shuō),假設(shè)你在表“tb藏書情況”中,把【書籍編號(hào)】=16對(duì)應(yīng)的這本書的作者或單價(jià)刪掉,在“存書查詢窗體”中,即使你不輸入任何條件,【書籍編號(hào)】=16對(duì)應(yīng)的這本書你也看不見(jiàn)。如果在某個(gè)查詢組合下,子窗體上根本沒(méi)有符合條件的記錄,則主窗體上的“記錄數(shù)”和“合計(jì)”會(huì)顯示“錯(cuò)誤”。如果把主窗體上的“記錄數(shù)”和“合計(jì)”的控件來(lái)源改為:=IIf(IsError(存書查詢子窗體.Form.txt計(jì)數(shù)),0,存書查詢子窗體.Form.txt計(jì)數(shù))=IIf(IsError(存書查詢子窗體.Form.txt單價(jià)合計(jì)),0,存書查詢子窗體.Form.tx

21、t單價(jià)合計(jì))則不會(huì)出現(xiàn)“錯(cuò)誤”,這是我在下面地址學(xué)到的:報(bào)表不能直接打開(kāi),每次打開(kāi)報(bào)表就會(huì)跳出提示框要求輸入條件。四. 查詢方法2:用VBA生成窗體篩選條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫(kù)是:“常用窗體查詢2.MDB”。主窗體的控件與“常用窗體查詢1.MDB”相同,只是按鈕中的代碼都改了。子窗體則完全相同?!按鏁樵儭敝胁恍枰斎肴魏螚l件。1. 按鈕代碼設(shè)計(jì)1.1 查詢按鈕本按鈕代碼的設(shè)計(jì)思想是根據(jù)主窗體上各個(gè)條件輸入控件的值,用VBA代碼生成一個(gè)條件組合的字符串作為子窗體的窗體篩選的條件。 '判斷【書名】條件是否有輸入的值 If Not IsNull(Me.書名) Then '有輸入

22、 strWhere = strWhere & "(書名 like '*" & Me.書名 & "*') AND " End If&:是字符串鏈接運(yùn)算符,它和“”不同之處在于“&”兩邊如果不是字符串表達(dá)式,它會(huì)自動(dòng)把表達(dá)式的值變成字符串,省了你轉(zhuǎn)換格式了。"(書名 LIKE '*":英文雙引號(hào)是VBA用來(lái)表示字符串的符號(hào),兩個(gè)雙引號(hào)中間是一個(gè)字符串。""兩個(gè)雙引號(hào)中間什么也沒(méi)有,表示一個(gè)空字符串。注意:空字符串NULL(空值)。所以IsNull(&quo

23、t;")=False。'*ACCESS*':英文單引號(hào)是SQL語(yǔ)句中用來(lái)表示字符串的符號(hào),兩個(gè)單引號(hào)中間是一個(gè)字符串。(SQL語(yǔ)句中也可以使用雙引號(hào)來(lái)表示字符串,但在VBA代碼生成SQL語(yǔ)句時(shí),為了簡(jiǎn)化格式,一律用單引號(hào)表示SQL語(yǔ)句內(nèi)的字符串)書名:用表明書名是一個(gè)字段名、表名或查詢名。使用的作用:可以明確中間是一個(gè)名字而不是函數(shù);當(dāng)字段名、表名或查詢名是ACCESS或VBA保留字(如:DATE、NOTE、TYPEOF等)時(shí),一定要用來(lái)標(biāo)明;當(dāng)字段名、表名或查詢名中包含特殊字符(如停止/截止日期、查詢-合計(jì)等)時(shí),一定要用來(lái)標(biāo)明,否則特殊字符會(huì)被當(dāng)作算術(shù)運(yùn)算符而導(dǎo)致

24、出錯(cuò)。ME.書名:是“存書查詢窗體”上文本框“書名”的值。Me.書名= Me.書名.Value。Me是對(duì)代碼所在窗體的引用。如果此時(shí)“存書查詢窗體”上文本框“書名”的值是"ACCESS",那么此時(shí)strWhere的結(jié)果就是:"(書名 like '*ACCESS*') AND "跟查詢方法1中一樣,我們也可以改為半模糊查詢和精確查詢,代碼如下: strWhere = strWhere & "(書名 like '" & Me.書名 & "*') AND " str

25、Where = strWhere & "(書名 like '" & Me.書名 & "') AND "接著看關(guān)于【單價(jià)】的代碼: '判斷【單價(jià)】條件是否有輸入的值,由于有【單價(jià)開(kāi)始】【單價(jià)截止】?jī)蓚€(gè)文本框 '所以要分開(kāi)來(lái)考慮 If Not IsNull(Me.單價(jià)開(kāi)始) Then '【單價(jià)開(kāi)始】有輸入 strWhere = strWhere & "(單價(jià) >= " & Me.單價(jià)開(kāi)始 & ") AND " End If I

26、f Not IsNull(Me.單價(jià)截止) Then '【單價(jià)截止】有輸入 strWhere = strWhere & "(單價(jià) <= " & Me.單價(jià)截止 & ") AND " End If這里用“>=”“<=”來(lái)代替“BETWEEN AND”,效果是一樣的,只是不需要像查詢方法1中那樣如果不填數(shù)字,會(huì)分別寫入0和5000。再來(lái)看看關(guān)于【進(jìn)書日期】的代碼: '判斷【進(jìn)書日期】條件是否有輸入的值,由于有【進(jìn)書日期開(kāi)始】【進(jìn)書日期截止】?jī)蓚€(gè)文本框 '所以要分開(kāi)來(lái)考慮 If Not IsNu

27、ll(Me.進(jìn)書日期開(kāi)始) Then '【進(jìn)書日期開(kāi)始】有輸入 strWhere = strWhere & "(進(jìn)書日期 >= #" & Format(Me.進(jìn)書日期開(kāi)始, "yyyy-mm-dd") & "#) AND " End If If Not IsNull(Me.進(jìn)書日期截止) Then '【進(jìn)書日期截止】有輸入 strWhere = strWhere & "(進(jìn)書日期 <= #" & Format(Me.進(jìn)書日期截止, "yy

28、yy-mm-dd") & "#) AND " End If使用Format(Me.進(jìn)書日期開(kāi)始, "yyyy-mm-dd"),而不是直接用Me.進(jìn)書日期開(kāi)始,是因?yàn)橛袝r(shí)候直接用Me.進(jìn)書日期開(kāi)始的話,會(huì)因?yàn)橛?jì)算機(jī)日期格式設(shè)置的不同而出現(xiàn)一些奇怪的問(wèn)題。ACCESS中的日期條件一直都是比較麻煩的,不管是選擇查詢、追加查詢還是交叉表查詢,設(shè)置日期字段的條件都是要特別注意的。(像查詢方法1中直接在查詢準(zhǔn)則中引用控件值雖然不會(huì)出現(xiàn)類似問(wèn)題,但交叉表查詢中不能使用控件作為日期字段的條件。) '先在立即窗口顯示一下strWhere的值,代碼

29、調(diào)試完成后可以取消下一句 Debug.Print strWhereDEBUG.PRINT:是專門用于調(diào)試的語(yǔ)句,它會(huì)把后面表達(dá)式的值顯示在VB編輯器的立即窗口里。在適當(dāng)?shù)氐胤讲迦隓ebug.Print可以檢查程序運(yùn)行的是否正確。等全部調(diào)試結(jié)束后,可以把他們都刪掉。 '讓子窗體應(yīng)用窗體查詢 Me.存書查詢子窗體.Form.Filter = strWhere Me.存書查詢子窗體.Form.FilterOn = True主窗體或單一窗體設(shè)置篩選字符串時(shí)用:Me.Filter="" 或是 Forms!XX窗體.Filter=""。 '在子窗體篩

30、選后要運(yùn)行一下自編子程序CheckSubformCount() Call CheckSubformCountCheckSubformCount是一個(gè)自編的子程序,CALL是調(diào)用子程序的語(yǔ)句,也可以不寫CALL直接用CheckSubformCount調(diào)用子程序。1.2 清除按鈕代碼里都有說(shuō)明,只講以下的一段代碼: For Each ctl In Me.Controls '根據(jù)ctl的控件類型來(lái)選擇 Select Case ctl.ControlType Case acTextBox '是文本框,要清空(注意,子窗體下面還有兩個(gè)鎖定的文本框不能賦值) If ctl.Locked =

31、 False Then ctl.Value = Null Case acComboBox '是組合框,也要清空 ctl.Value = Null '其它類型的控件不處理 End Select NextFOR EACH CTL IN ME.CONTROLS:意思是把當(dāng)前窗體內(nèi)所有的控件都逐個(gè)引用一次(子窗體控件內(nèi)的控件不算在內(nèi))。這種用“For Each 對(duì)象或?qū)傩?In 對(duì)象集合或?qū)傩约稀钡谋闅v方法在ACCESS編程中屬于比較常見(jiàn)的用法,用處也很多。比如最常見(jiàn)的檢查窗體是否打開(kāi)的代碼中也有:Function IsLoaded(strFrmName As String) As

32、Boolean ' 確定一個(gè)窗體是否已被裝載。 Const conFormDesign = 0 Dim objForm As Form IsLoaded = False For Each objForm In Forms If objForm.FormName = strFrmName Then If objForm.CurrentView <> conFormDesign Then '窗體不是設(shè)計(jì)模式時(shí) IsLoaded = True Exit Function ' 一旦找到了此窗體,就退出本函數(shù)。 End If End If NextEnd Functi

33、on1.3 預(yù)覽報(bào)表按鈕預(yù)覽報(bào)表按鈕中關(guān)鍵是如下語(yǔ)句: strWhere = Me.存書查詢子窗體.Form.Filter '在打開(kāi)報(bào)表的同時(shí)把子窗體的篩選條件字符串也傳遞給報(bào)表, '這樣地話報(bào)表也會(huì)顯示和子窗體相同的記錄。 DoCmd.OpenReport stDocName, acPreview, , strWhere在我曾經(jīng)制作的另一個(gè)例子:“打印當(dāng)前記錄的例子”里也使用過(guò)類似的方法。這個(gè)例子可以在 下載。關(guān)于DoCmd.OpenReport的詳細(xì)幫助,可以在VBA幫助里找到。1.4 導(dǎo)出按鈕導(dǎo)出方法只能把表或者查詢的內(nèi)容導(dǎo)出到EXCEL,但是不能把窗體上的記錄集(REC

34、ORDSET)導(dǎo)出。所以我們要把子窗體的內(nèi)容轉(zhuǎn)變?yōu)橐粋€(gè)查詢。我在查詢中增加了一個(gè)“查詢結(jié)果”,其中的設(shè)計(jì)隨便就行,因?yàn)槊看卧谑褂眠@個(gè)查詢之前,我們都會(huì)用DAO修改查詢的SQL語(yǔ)句。思路很簡(jiǎn)單,如果子窗體的篩選條件字符串是:(類別 Like '書籍') AND (單價(jià)>=20)那么,我們把“查詢結(jié)果”的SQL語(yǔ)句改為:SELECT * FROM 存書查詢 WHERE (類別 Like '書籍') AND (單價(jià)>=20)這樣的話,“查詢結(jié)果”的記錄與子窗體里的記錄就是相同的。對(duì)應(yīng)的代碼如下: strWhere = Me.存書查詢子窗體.Form.Fil

35、ter If strWhere = "" Then '沒(méi)有條件 strSQL = "SELECT * FROM 存書查詢" Else '有條件 strSQL = "SELECT * FROM 存書查詢 WHERE " & strWhere End If這一部分用來(lái)準(zhǔn)備查詢的SQL語(yǔ)句。 Set qdf = CurrentDb.QueryDefs("查詢結(jié)果") qdf.SQL = strSQL qdf.Close Set qdf = Nothing這一部分用來(lái)把做好的SQL語(yǔ)句放在查詢中。

36、DoCmd.OutputTo acOutputQuery, "查詢結(jié)果", acFormatXLS, , True這一部分的作用,和查詢方法1中的“導(dǎo)出查詢數(shù)據(jù)宏”的作用相同。運(yùn)行時(shí)會(huì)自動(dòng)跳出對(duì)話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫(kù)所在目錄下的“查詢結(jié)果.xls”里,可以把這一句改為: strOutputFileName=CurrentProject.Path & "查詢結(jié)果.xls" DoCmd.OutputTo acOutputQuery, "查詢結(jié)果", acFormatXLS, strOutputFileN

37、ame , True如果你想在文件名上保留時(shí)間,以便知道是什么時(shí)候做的查詢,可以改為: strOutputFileName=CurrentProject.Path & "查詢結(jié)果-" & _ Format(Date(),"yyyymmdd") & ".xls" DoCmd.OutputTo acOutputQuery, "查詢結(jié)果", acFormatXLS, strOutputFileName , True_:英文下劃線表明下一行和本行是同一條語(yǔ)句,在語(yǔ)句比較長(zhǎng)時(shí),為了便于閱讀,可以用這種

38、方法把每行變短一些。下劃線之前要有一個(gè)空格作分隔,不然可能會(huì)被當(dāng)作字段名的一部分。1.5 CheckSubformCount子程序這段子程序的目的在代碼中已經(jīng)解釋了。目前實(shí)例數(shù)據(jù)庫(kù)中的代碼中是用代碼設(shè)置文本框的“控件來(lái)源”。也可以直接用代碼設(shè)置控件的值(前提條件是在窗體的設(shè)計(jì)視圖中,把兩個(gè)文本框的控件來(lái)源都刪掉,使控件變成未綁定)。此外,我再加幾句代碼,當(dāng)子窗體無(wú)記錄時(shí),下面的導(dǎo)出和預(yù)覽按鈕都變成灰色。這樣的軟件顯得更專業(yè)一些。代碼如下: If Me.存書查詢子窗體.Form.Recordset.RecordCount > 0 Then '子窗體的記錄數(shù)>0 Me.計(jì)數(shù) =

39、 Me.存書查詢子窗體.Form.txt計(jì)數(shù) Me.合計(jì) = Me.存書查詢子窗體.Form.txt單價(jià)合計(jì) Me.cmd導(dǎo)出.Enabled = True Me.cmd預(yù)覽報(bào)表.Enabled = True Else '子窗體的記錄數(shù)=0 Me.計(jì)數(shù) = 0 Me.合計(jì) = 0 Me.cmd導(dǎo)出.Enabled = False Me.cmd預(yù)覽報(bào)表.Enabled = False End If2. 方法總結(jié)使用VBA來(lái)設(shè)置子窗體篩選條件的方法解決了方法1中的幾個(gè)缺點(diǎn),大家可以逐一測(cè)試。但是編寫這樣的VBA代碼需要對(duì)VBA比較熟悉,而且要求對(duì)邏輯運(yùn)算有一定基礎(chǔ),不然在使用邏輯運(yùn)算符AN

40、D/OR/NOT和括號(hào)組合時(shí)會(huì)出錯(cuò)。不太適合初學(xué)者使用。五. 主子窗體交叉表查詢實(shí)例這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫(kù)是:“常用窗體查詢3.MDB”。交叉表查詢通常作為統(tǒng)計(jì)之用,所以查詢條件少了一些。一般學(xué)習(xí)ACCESS的人,都有可能會(huì)被ACCESS的向?qū)д`導(dǎo),以為子窗體控件里面一定要放一個(gè)子窗體。其實(shí)不是,在我的這個(gè)例子里,子窗體的對(duì)象其實(shí)就是交叉查詢,如下圖。一直有人問(wèn),對(duì)于交叉表這樣字段數(shù)量不固定的,怎樣在子窗體中顯示。其實(shí),直接在子窗體里顯示交叉表本身是最簡(jiǎn)單的辦法。另一種方法是事先設(shè)計(jì)一個(gè)包含很多未綁定字段文本框的數(shù)據(jù)表窗體,在顯示之前,先用VBA設(shè)置窗體的“記錄源”和各文本框的“控件來(lái)源”,

41、同時(shí)還要控制沒(méi)有字段可以顯示的那些列要隱藏,然后再顯示出來(lái)。但這樣設(shè)計(jì)要求編寫比較多的代碼,只適合比較熟悉VBA的人使用。(我在這個(gè)例子的報(bào)表中設(shè)計(jì)了類似的代碼,可以參考。)1. 按鈕設(shè)計(jì)1.1 查詢按鈕先看一下沒(méi)有條件的交叉表查詢的SQL語(yǔ)句:TRANSFORM Sum(存書查詢.單價(jià)) AS 單價(jià)之SumSELECT 存書查詢.類別FROM 存書查詢GROUP BY 存書查詢.類別PIVOT Format(進(jìn)書日期,"yyyy/mm");再看一下設(shè)置了條件的交叉表查詢的SQL語(yǔ)句:TRANSFORM Sum(存書查詢.單價(jià)) AS 單價(jià)之Sum SELECT 存書查詢.類別 FROM 存書查詢WHERE (存書查詢.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論