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

下載本文檔

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

文檔簡(jiǎn)介

1、目錄1 .概述 22 . 制作主 / 子窗體的步驟 41. 利用向?qū)е谱髦鞔绑w 42. 利用向?qū)гO(shè)計(jì)子窗體 53 . 查詢方法1 :在查詢中加入條件 81. 設(shè)計(jì)查詢 82. 設(shè)計(jì)按鈕及代碼 112.1 查詢按鈕 112.2 清除按鈕 112.3 打印按鈕 122.4 導(dǎo)出 EXCEL按鈕 123. 增加統(tǒng)計(jì)功能 133.1 子窗體上的設(shè)計(jì) 133.2 主窗體上的設(shè)計(jì) 144. 方法總結(jié) 144.1 本方法優(yōu)點(diǎn) 144.2 本方法缺點(diǎn) 154 . 查詢方法2:用 VBA 生成窗體篩選條件 161. 按鈕代碼設(shè)計(jì) 161.1 查詢按鈕 161.2 清除按鈕 181.3 預(yù)覽報(bào)表按鈕 191.4

2、導(dǎo)出按鈕 191.5 CheckSubformCount 子程序 202. 方法總結(jié) 215 . 主子窗體交叉表查詢實(shí)例 221. 按鈕設(shè)計(jì) 231.1 查詢按鈕 232. 報(bào)表設(shè)計(jì) 243. 方法總結(jié) 24一 . 概述作為數(shù)據(jù)管理程序,統(tǒng)計(jì)和查詢功能是非常重要的。否則,就和電子表格沒有區(qū)別了。所以,在每個(gè)ACCESS 程序中都不可能缺少查詢的功能。本文的目的是由淺入深的介紹幾種最常用的利用主/子窗體來實(shí)現(xiàn)查詢的方法,使初學(xué)者和有一定VBA 基礎(chǔ)的人可以更好的使用窗體查詢這種手段。附件中的窗體“常用窗體查詢 0.MDB ”,僅包含3 個(gè)數(shù)據(jù)表、1 個(gè)查詢和以這個(gè)查詢?yōu)閿?shù)據(jù)源的報(bào)表。是為了大家根

3、據(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 光盤光盤UNKNOWN電腦新時(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)幕

4、大公開書籍蔡昌均中國(guó)青年¥ 69.002001-9-2819AccessVBA 基礎(chǔ)書籍EvanCallahan人民郵電¥ 39.002001-9-2820中文版Access2001一冊(cè)通書籍趙琳等人民郵電¥ 42.002001-9-2821VISUALBASIC5.0 教 程書籍SteveBrown電子工業(yè)¥ 28.002001-9-2823中文版VisualBasic5.0 程序 員指南書籍microsoft中國(guó)青年¥ 70.002001-9-2824Access 中文版開發(fā)指 南書籍Alison Balter人民郵電¥ 128.002002-2-1629Access 2002 數(shù)據(jù)庫 系

5、統(tǒng)開發(fā)實(shí)例導(dǎo)航書籍桂思強(qiáng)中國(guó)鐵道¥ 25.002003-3-1030中國(guó)名陵集中華 古代名陵之大成書籍羅哲文等百花文藝¥ 14.002003-5-2031邊緣部落福音谷書籍林茨(撰文攝影)河北教育¥ 27.002003-5-20為了比較有代表性,這個(gè)查詢中包含多種字段類型:數(shù)字類型:【書籍編號(hào)】、 【單價(jià)】字符類型:【書名】、 【類別】 、 【作者】 、 【出版社】日期類型:【進(jìn)書日期】在多條件查詢中,我們會(huì)使用除了【書籍編號(hào)】之外的其他字段作為查詢條件。其實(shí),在下面介紹的窗體查詢方法中,有些代碼或思路也可以應(yīng)用在其它窗體查詢方法中,你對(duì)各種代碼、方法和思路越熟練,就越能充分發(fā)揮它們的作用。這

6、篇文章我是從4 月初開始構(gòu)思,到5 月中旬開始動(dòng)筆,花費(fèi)兩周時(shí)間寫成,里面包含了我對(duì)ACCESS 窗體查詢所積累的經(jīng)驗(yàn),對(duì)初學(xué)者和有一定VBA 基礎(chǔ)的人都有針對(duì)性的方法。另外,希望其他精通ACCESS 的高手提出意見。Word 資料1. 利用向?qū)е谱髦鞔绑w制作主 /子窗體的步驟:, 把類別和出版社改為組合框(因?yàn)檫@些字段的可能值比較少,;,進(jìn)書日期后面的;,名稱是“cmd 查詢”“瀏覽按鈕”否。2. 利用向?qū)гO(shè)計(jì)子窗體在主窗體中用工具箱中的“子窗體 /子報(bào)表”對(duì)象建立一個(gè)子窗體;以存書查詢?yōu)橛涗浽?,選擇所有字段;把子窗體命名為“存書查詢子窗體”; 在主窗體上刪除子窗體的標(biāo)簽,并重新調(diào)整子窗體的

7、大小; 關(guān)閉主窗體的設(shè)計(jì)視圖,單獨(dú)打開子窗體數(shù)據(jù)表視圖,調(diào)整字體和行的大小。現(xiàn)在,我們得到了如下的窗體:現(xiàn)在還沒有實(shí)際的查詢功能,我們?cè)诤竺嬉鶕?jù)所使用的方法,修改窗體并增加一些其他的功能。還有一些小的細(xì)節(jié)要注意,比如:按TAB 鍵后的獲得光標(biāo)的控件的順序要在設(shè)計(jì)視圖下,視圖菜單的“TAB 鍵次序”來修改;有些文本框獲得焦點(diǎn)后是否要打開輸入法,比如輸入單價(jià)和日期的地方要關(guān)閉,輸入書名和作者的地方要打開,這些要在控件屬性中設(shè)置。查詢方法1 :在查詢中加入條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫是: “常用窗體查詢 1.MDB1. 設(shè)計(jì)查詢我們打開“存書查詢”設(shè)計(jì)視圖如下:Like IIf(IsNull(Fo

8、rms! 存書查詢窗體! 書名 ),'*','*' & Forms! 存書查詢窗體!書名 & '*')在字段【書名】的準(zhǔn)則格內(nèi)寫入: 加入后的設(shè)計(jì)視圖如下:把這個(gè)式子解釋一下:LIKE: 是專門用于查詢字符型字段的運(yùn)算符,一般介紹ACCESS 的書中都有它的用法。ISNULL(Forms!存書查詢窗體!書名 ): 是用來判斷窗體“存書查詢窗體”上面的“書名”這個(gè)文本框是否是空的。如果文本框是空的,則:ISNULL(Forms! 存書查詢窗體!書名)=TRUE(真)如果文本框不是空的,則:ISNULL(Forms! 存書查詢窗體!書

9、名)=FALSE(假)IIF(EXPR, TRUEPART, FALSEPA函數(shù)RT) :EXPR 必要參數(shù)。用來判斷真?zhèn)蔚谋磉_(dá)式。TRUEPART 必要參數(shù)。如果EXPR 為TRUE,則返回這部分的值或表達(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!存書查詢窗體!

10、書名 &'*')Like IIf(IsNull(Forms!存書查詢窗體! 書名),'*', Forms!存書查詢窗體!書名)如果把準(zhǔn)則改為上面兩句中的一句,同樣情況下當(dāng)我們?cè)诖绑w“存書查詢窗體”上面的“書名”里寫上“ACCESS”,整個(gè)式子的結(jié)果是:LIKE ACCESS*LIKE ACCESS相當(dāng)于查詢以“ ACCESS” 開頭的書籍(半模糊查詢), 或者書名就叫“ ACCESS的書(精確查詢)。具體使用那一種形式的查詢要根據(jù)你的實(shí)際情況來修改。當(dāng)我們?cè)诖绑w“存書查詢窗體”上面的“書名”里什么也沒有寫,整個(gè)式子的 結(jié)果是:LIKE *相當(dāng)于查詢所有的

11、有書名的書。在書寫查詢準(zhǔn)則時(shí),F(xiàn)orms! 存書查詢窗體!書名 這樣的窗體控件名很難寫,這時(shí)你可以在準(zhǔn)則格內(nèi)點(diǎn)鼠標(biāo)右鍵,選擇生成器,出現(xiàn)如下圖的窗口:在左邊的樹型列表框里找到控件所在的窗體,在中間列表框出現(xiàn)這個(gè)窗體包含的所有控件,雙擊控件名,就會(huì)出現(xiàn)“Forms! 存書查詢窗體!書名 ”。我們?cè)侔哑渌麕讉€(gè)字段的查詢準(zhǔn)則寫出:【類別】 :在窗體上是組合框,所以它肯定是個(gè)精確查詢,跟【書名】一樣,它是文本字段。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms! 存書查詢窗體! 類別 ),'*',Forms! 存書查詢窗體! 類別 )【作者】 :跟【書名】一樣,它是文本字段。

12、我也打算用模糊查詢。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms! 存書查詢窗體! 作者 ),'*','*' & Forms! 存書查詢窗體!作者 & '*')【出版社】:跟【類別】的情況完全一樣。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms! 存書查詢窗體! 出版社 ),'*',Forms! 存書查詢窗體!出版社 )【單價(jià)】 :是一個(gè)數(shù)字字段,我在這里準(zhǔn)備讓用戶可以查詢“1.5 元 6.5 元”這樣的范圍。查詢準(zhǔn)則如下:Between IIf(IsNull(Forms! 存書查詢窗體! 單

13、價(jià)開始),0,Forms! 存書查詢窗體! 單價(jià)開始) AndIIf(IsNull(Forms! 存書查詢窗體! 單價(jià)截止),5000,Forms! 存書查詢窗體! 單價(jià)截止)BETWEEN AND: 是查詢符合某個(gè)范圍之內(nèi)的值所需的條件格式。“ BETWEEN 1 AND 5”相當(dāng)于“【字段】1 AND 【字段】5”。根據(jù)前面講解的IIF的內(nèi)容,我用一個(gè)表格來解釋一下各種情況下這個(gè)式子的實(shí)際結(jié)果,便于大家理解:( 0 和 5000 是我事先在條件中設(shè)定的最小值和最大值) 單價(jià)開始 的值單價(jià)截止的值整個(gè)式子的實(shí)際結(jié)果空空BETWEEN 0 AND 50001.5空BETWEEN 1.5 AND

14、 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! 存書查詢窗體! 進(jìn)書日期開始),#2000-1-1#,Forms! 存書查詢窗體!進(jìn)書日期開始) And (IIf(IsNull(Forms! 存書查詢窗體!進(jìn)書日期截止),#2099-12-31#,Forms! 存書查詢窗體 ! 進(jìn)書日期截止)在這個(gè)式子中,#200

15、0-1-1# 和 #2099-12-31# 是我設(shè)定的兩個(gè)默認(rèn)的開始和截止日期。如果用戶不輸入,就使用默認(rèn)值了。這和前面【單價(jià)】的情況是一樣的。2. 設(shè)計(jì)按鈕及代碼2.1 查詢按鈕查詢按鈕的代碼非常簡(jiǎn)單,關(guān)鍵部分只有一句:Private Sub cmd 查詢 _Click()Me. 存書查詢子窗體.Requery '這句是關(guān)鍵End SubREQUERY: 是用來重新查詢控件的數(shù)據(jù)源,這樣可以刷新子窗體顯示的記錄。對(duì)于記錄源是表或查詢的控件如窗體、列表框、組合框等經(jīng)常用Requery 方法來刷新顯示內(nèi)容。2.2 清除按鈕有了查詢按鈕的代碼之后,大家就可以自己測(cè)試查詢的效果了。不過,每次

16、想換一個(gè)查詢的條件時(shí)要清除上一個(gè)條件輸入的東西,有時(shí)候比較麻煩。我們?cè)賮碓O(shè)計(jì)一個(gè)清除條件的按鈕,控件名稱是“cmd 清除” ,放在查詢按鈕的下面。按鈕的代碼如下:Private Sub cmd 清除 _Click()'下面這些控件的值要清空Me. 書名=NullMe. 類別=NullMe. 作者=NullMe. 出版社 = NullMe. 單價(jià)開始= NullWord 資料Me. 單價(jià)截止= NullMe. 進(jìn)書日期開始= NullMe. 進(jìn)書日期截止= NullMe. 存書查詢子窗體.Requery '清空之后一樣要重新查詢End Sub2.3 打印按鈕有了查詢結(jié)果,想打印出

17、來,很簡(jiǎn)單。由于報(bào)表的記錄源就是“存書查詢”,所以在查詢里設(shè)計(jì)的條件會(huì)直接在報(bào)表里體現(xiàn)出來。我們只要用按鈕向?qū)е谱饕粋€(gè)預(yù)覽報(bào)表的按鈕就可以了。我們把這個(gè)按鈕放在子窗體下面的右邊。控件名稱是“cmd 預(yù)覽報(bào)表”。由于完全是采用向?qū)е谱鞯模恍栊薷拇a,所以我就不在這里列出代碼了。2.4 導(dǎo)出EXCEL按鈕如果你覺得ACCESS 的報(bào)表邊框太難看,或者你想在報(bào)表上加上一些說明什么的。你可能更愿意把數(shù)據(jù)導(dǎo)出到EXCEL里進(jìn)行再加工。為了初學(xué)者容易理解,我打算用一個(gè)宏來解決這個(gè)問題。宏的設(shè)計(jì)如下圖:現(xiàn)在,宏里“輸出文件”為空,運(yùn)行時(shí)會(huì)自動(dòng)跳出對(duì)話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫所在目錄

18、下的“查詢結(jié)果.xls”里,可以在“輸出文件”一欄里填入:查詢結(jié)果.xls"把這個(gè)宏存為“導(dǎo)出查詢數(shù)據(jù)宏” 然后再在窗體里加入按鈕。當(dāng)按鈕向?qū)С霈F(xiàn)后,直接取消。在按鈕的屬性頁里,先把按鈕名稱改為“cmd 導(dǎo)出” ,在按鈕的“單擊事件”里直接用下拉框選擇Word 資料,如下圖。這樣就不必編寫代碼了。3. 增加統(tǒng)計(jì)功能經(jīng)常有人需要在主窗體上顯示符合查詢條件的記錄總數(shù),以及子窗體中某一字 段的合計(jì)。所以,我們也準(zhǔn)備在主窗體上增加記錄總數(shù)和單價(jià)的合計(jì)。3.1 子窗體上的設(shè)計(jì)單獨(dú)打開子窗體的設(shè)計(jì)模式,在窗體頁腳部分拉出一段窗體;在上面增加兩個(gè)文本框:一個(gè)是“txt 計(jì)數(shù)” ,控件來源=Coun

19、t(*) ,另一個(gè)是“ txt 單價(jià)合計(jì)”,控件來源=Sum( 單價(jià) );在子窗體的窗體屬性中設(shè)置:瀏覽按鈕否,記錄集類型快照(快照的運(yùn)行速度快,占用內(nèi)存少,但不能編輯更新,正適合我們的需要);3.2 主窗體上的設(shè)計(jì)在子窗體下面的地方設(shè)計(jì)兩個(gè)文本框“計(jì)數(shù)”和“合計(jì)”,把它們的標(biāo)簽改為:”和“單價(jià)合計(jì)“計(jì)數(shù)”文本框的控件來源 =存書查詢子窗體.Form.txt 計(jì)數(shù) , “合計(jì)”文本框的控件來源=存書查詢子窗體.Form.txt 單價(jià)合計(jì);由于主窗體上的這兩個(gè)文本框是自動(dòng)計(jì)算的,為了區(qū)別,設(shè)置它們的是否有效否,是否鎖定是,背景顏色深灰色。4. 方法總結(jié)現(xiàn)在,整個(gè)窗體就已經(jīng)完成了。大家可以使用各種

20、條件組合來測(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ù)據(jù)。即使你在窗體中并沒有在這個(gè)字段對(duì)應(yīng)的文本框中輸入條件。舉例來說,假設(shè)你在表“tb 藏書情況”中,把【書籍編號(hào)】 =16 對(duì)應(yīng)的這本書的作者或單價(jià)刪掉,在“存書查詢窗體”中,即使你不輸入任何條件, 【書籍編號(hào)】 =16 對(duì)應(yīng)的這本書你也看不見。如果在某個(gè)查詢組合下,子窗體上根本沒有符合條件的記

21、錄,則主窗體上的“記錄數(shù)”和“合計(jì)”會(huì)顯示“錯(cuò)誤”。如果把主窗體上的“記錄數(shù)”和“合計(jì)”的控件來源改為:=IIf(IsError( 存書查詢子窗體.Form.txt 計(jì)數(shù) ),0, 存書查詢子窗體.Form.txt 計(jì)數(shù) )=IIf(IsError( 存書查詢子窗體.Form.txt 單價(jià)合計(jì)),0, 存書查詢子窗體.Form.txt 單價(jià)合計(jì))則不會(huì)出現(xiàn)“錯(cuò)誤”,這是我在下面地址學(xué)到的:報(bào)表不能直接打開,每次打開報(bào)表就會(huì)跳出提示框要求輸入條件。Word 資料. 查詢方法2:用VBA 生成窗體篩選條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫是: “常用窗體查詢 2.MDB”。主窗體的控件與“常用窗體查詢 1.

22、MDB”相同,只是按鈕中的代碼都改了。子窗體則完全相同。“存書查詢”中不需要輸入任何條件。1. 按鈕代碼設(shè)計(jì)1.1 查詢按鈕本按鈕代碼的設(shè)計(jì)思想是根據(jù)主窗體上各個(gè)條件輸入控件的值,用VBA 代碼生成一個(gè)條件組合的字符串作為子窗體的窗體篩選的條件。'判斷【書名】條件是否有輸入的值If Not IsNull(Me. 書名 ) Then'有輸入strWhere = strWhere & "( 書名 like '*" & Me. 書名 & "*') AND "End If& : 是字符串鏈接運(yùn)算符,

23、它和“”不同之處在于“& ”兩邊如果不是字符串表達(dá)式,它會(huì)自動(dòng)把表達(dá)式的值變成字符串,省了你轉(zhuǎn)換格式了。"(書名 LIKE '*": 英文雙引號(hào)是VBA 用來表示字符串的符號(hào),兩個(gè)雙引號(hào)中間是一個(gè)字符串。""兩個(gè)雙引號(hào)中間什么也沒有,表示一個(gè)空字符串。注意:空字符串NULL(空值)。所以 IsNull("")=False 。'*ACCESS*': 英文單引號(hào)是SQL語句中用來表示字符串的符號(hào),兩個(gè)單引號(hào)中間是一個(gè)字符串。( SQL 語句中也可以使用雙引號(hào)來表示字符串,但在VBA 代碼生成 SQL 語句時(shí)

24、,為了簡(jiǎn)化格式,一律用單引號(hào)表示SQL 語句內(nèi)的字符串)書名: 用 表明書名是一個(gè)字段名、表名或查詢名。使用的作用:可以明確中間是一個(gè)名字而不是函數(shù);當(dāng)字段名、表名或查詢名是ACCESS 或 VBA保留字(如:DATE、 NOTE、 TYPEOF等)時(shí),一定要用來標(biāo)明;當(dāng)字段名、表名或查詢名中包含特殊字符(如停止/截止日期、 查詢-合計(jì)等)時(shí),一定要用 來標(biāo)明,否則特殊字符會(huì)被當(dāng)作算術(shù)運(yùn)算符而導(dǎo)致出錯(cuò)。ME.書名:是 “存書查詢窗體”上文本框 “書名” 的值。 Me. 書名 = Me. 書名 .Value 。Me 是對(duì)代碼所在窗體的引用。如果此時(shí) “存書查詢窗體”上文本框 “書名” 的值是&q

25、uot;ACCESS", 那么此時(shí)strWhere"( 書名 like '*ACCESS*') AND "跟查詢方法1 中一樣,我們也可以改為半模糊查詢和精確查詢,代碼如下:strWherestrWhere & "(書名 like '" & Me.書名& "*') AND "strWherestrWhere & "(書名 like '" & Me.書名& "') AND "接著看關(guān)于【單價(jià)】

26、的代碼:'判斷【單價(jià)】條件是否有輸入的值,由于有【單價(jià)開始】【單價(jià)截止】?jī)蓚€(gè)文本框'所以要分開來考慮If Not IsNull(Me. 單價(jià)開始) Then'【單價(jià)開始】有輸入strWhere = strWhere & "( 單價(jià) >= " & Me. 單價(jià)開始& ") AND "End IfIf Not IsNull(Me. 單價(jià)截止) Then'【單價(jià)截止】有輸入strWhere = strWhere & "( 單價(jià) <= " & Me. 單價(jià)截止

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

28、 進(jìn)書日期開始, "yyyy-mm-dd") &"#) AND "End IfIf Not IsNull(Me. 進(jìn)書日期截止) Then'【進(jìn)書日期截止】有輸入strWhere = strWhere & "(進(jìn)書日期 <= #" & Format(Me. 進(jìn)書日期截止, "yyyy-mm-dd") &"#) AND "End If使用 Format(Me. 進(jìn)書日期開始, "yyyy-mm-dd") , 而不是直接用Me. 進(jìn)書

29、日期開始, 是因?yàn)橛袝r(shí)候直接用Me. 進(jìn)書日期開始的話,會(huì)因?yàn)橛?jì)算機(jī)日期格式設(shè)置的不同而出現(xiàn)一些奇怪的問題。ACCESS 中的日期條件一直都是比較麻煩的,不管是選擇查詢、追加查詢還是交叉表查詢,設(shè)置日期字段的條件都是要特別注意的。(像查詢方法 1 中直接在查詢準(zhǔn)則中引用控件值雖然不會(huì)出現(xiàn)類似問題,但交叉表查詢中不能使用控件作為日期字段的條件。)'先在立即窗口顯示一下strWhere 的值,代碼調(diào)試完成后可以取消下一句Debug.Print strWhereDEBUG.PRINT: 是專門用于調(diào)試的語句,它會(huì)把后面表達(dá)式的值顯示在VB 編輯器的立即窗口里。在適當(dāng)?shù)氐胤讲迦隓ebug.Pr

30、int 可以檢查程序運(yùn)行的是否正確。等全部調(diào)試結(jié)束后,可以把他們都刪掉。'讓子窗體應(yīng)用窗體查詢Me. 存書查詢子窗體.Form.Filter = strWhereMe. 存書查詢子窗體.Form.FilterOn = True主窗體或單一窗體設(shè)置篩選字符串時(shí)用:Me.Filter= " " 或是 Forms!XX 窗體 .Filter=" '在子窗體篩選后要運(yùn)行一下自編子程序CheckSubformCount()Call CheckSubformCountCheckSubformCount 是一個(gè)自編的子程序,CALL 是調(diào)用子程序的語句,也可以不

31、寫CALL 直接用 CheckSubformCount 調(diào)用子程序。1.2 清除按鈕代碼里都有說明,只講以下的一段代碼:For Each ctl In Me.Controls'根據(jù)ctl 的控件類型來選擇Select Case ctl.ControlTypeCase acTextBox ' 是文本框,要清空(注意,子窗體下面還有兩個(gè)鎖定的文本框不能賦值)If ctl.Locked = False Then ctl.Value = NullCase acComboBox ' 是組合框,也要清空ctl.Value = Null'其它類型的控件不處理End Selec

32、tNextFOR EACH CTL IN ME.CONTROLS: 意思是把當(dāng)前窗體內(nèi)所有的控件都逐個(gè)引用一次 (子窗體控件內(nèi)的控件不算在內(nèi))。 這種用 “ For Each 對(duì)象或?qū)傩?In 對(duì)象集合或?qū)傩约?” 的遍歷方法在ACCESS 編程中屬于比較常見的用法,用處也很多。比如最常見的檢查窗體是否打開的代碼中也有:Function IsLoaded(strFrmName As String) As Boolean ' 確定一個(gè)窗體是否已被裝載。Const conFormDesign = 0Dim objForm As FormIsLoaded = FalseFor Each o

33、bjForm In FormsIf objForm.FormName = strFrmName ThenIf objForm.CurrentView <> conFormDesign Then'窗體不是設(shè)計(jì)模式時(shí)IsLoaded = TrueExit Function ' 一旦找到了此窗體,就退出本函數(shù)。End IfEnd IfNextEnd Function1.3 預(yù)覽報(bào)表按鈕預(yù)覽報(bào)表按鈕中關(guān)鍵是如下語句:strWhere = Me. 存書查詢子窗體.Form.Filter'在打開報(bào)表的同時(shí)把子窗體的篩選條件字符串也傳遞給報(bào)表,'這樣地話報(bào)表也會(huì)顯

34、示和子窗體相同的記錄。DoCmd.OpenReport stDocName, acPreview, , strWhere在我曾經(jīng)制作的另一個(gè)例子: “打印當(dāng)前記錄的例子”里也使用過類似的方法。這個(gè)例子可以在下載。關(guān)于 DoCmd.OpenReport 的詳細(xì)幫助,可以在VBA 幫助里找到。1.4 導(dǎo)出按鈕導(dǎo)出方法只能把表或者查詢的內(nèi)容導(dǎo)出到EXCEL,但是不能把窗體上的記錄集( RECORDSET)導(dǎo)出。所以我們要把子窗體的內(nèi)容轉(zhuǎn)變?yōu)橐粋€(gè)查詢。我在查詢中增加了一個(gè)“查詢結(jié)果”,其中的設(shè)計(jì)隨便就行,因?yàn)槊看卧谑褂眠@個(gè)查詢之前,我們都會(huì)用DAO 修改查詢的SQL 語句。思路很簡(jiǎn)單,如果子窗體的篩選

35、條件字符串是:(類別 Like ' 書籍 ') AND ( 單價(jià) >=20)那么,我們把“查詢結(jié)果”的 SQL 語句改為:SELECT * FROM 存書查詢WHERE (類別 Like ' 書籍 ') AND ( 單價(jià) >=20)這樣的話, “查詢結(jié)果”的記錄與子窗體里的記錄就是相同的。對(duì)應(yīng)的代碼如下:strWhere = Me. 存書查詢子窗體.Form.FilterIf strWhere = "" Then'沒有條件strSQL = "SELECT * FROM 存書查詢"Else'有條件

36、strSQL = "SELECT * FROM 存書查詢 WHERE " & strWhereEnd If這一部分用來準(zhǔn)備查詢的SQL 語句。Set qdf = CurrentDb.QueryDefs(" 查詢結(jié)果")qdf.SQL = strSQLqdf.CloseSet qdf = Nothing這一部分用來把做好的SQL 語句放在查詢中。DoCmd.OutputTo acOutputQuery, " 查詢結(jié)果", acFormatXLS, , True這一部分的作用,和查詢方法1 中的“導(dǎo)出查詢數(shù)據(jù)宏”的作用相同。運(yùn)行時(shí)

37、會(huì)自動(dòng)跳出對(duì)話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫所在目錄下的“查詢結(jié)果.xls”里,可以把這一句改為:查詢結(jié)果.xls"DoCmd.OutputTo acOutputQuery, " 查詢結(jié)果", acFormatXLS, strOutputFileName , True如果你想在文件名上保留時(shí)間,以便知道是什么時(shí)候做的查詢,可以改為:查詢結(jié)果-" & _Format(Date(),"yyyymmdd") & ".xls"DoCmd.OutputTo acOutputQuery, &q

38、uot; 查詢結(jié)果", acFormatXLS, strOutputFileName , True: 英文下劃線表明下一行和本行是同一條語句,在語句比較長(zhǎng)時(shí),為了便于閱讀,可以用這種方法把每行變短一些。下劃線之前要有一個(gè)空格作分隔,不然可能會(huì)被當(dāng)作字段名的一部分。1.5 CheckSubformCount 子程序這段子程序的目的在代碼中已經(jīng)解釋了。目前實(shí)例數(shù)據(jù)庫中的代碼中是用代碼設(shè)置文本框的“控件來源”。也可以直接用代碼設(shè)置控件的值(前提條件是在窗體的設(shè)計(jì)視圖中,把兩個(gè)文本框的控件來源都刪掉,使控件變成未綁定)。 此外,我再加幾句代碼,當(dāng)子窗體無記錄時(shí),下面的導(dǎo)出和預(yù)覽按鈕都變成灰色

39、。這樣的軟件顯得更專業(yè)一些。代碼如下:If Me. 存書查詢子窗體.Form.Recordset.RecordCount > 0 Then'子窗體的記錄數(shù)>0Me. 計(jì)數(shù) = Me. 存書查詢子窗體.Form.txt 計(jì)數(shù) Me. 合計(jì) = Me. 存書查詢子窗體.Form.txt 單價(jià)合計(jì)Me.cmd 導(dǎo)出 .Enabled = TrueMe.cmd 預(yù)覽報(bào)表.Enabled = TrueElse'子窗體的記錄數(shù)=0Me. 計(jì)數(shù)= 0Me. 合計(jì)= 0Me.cmd 導(dǎo)出 .Enabled = FalseMe.cmd 預(yù)覽報(bào)表.Enabled = FalseEnd

40、If2. 方法總結(jié)使用 VBA 來設(shè)置子窗體篩選條件的方法解決了方法1 中的幾個(gè)缺點(diǎn),大家可以逐一測(cè)試。但是編寫這樣的VBA 代碼需要對(duì)VBA 比較熟悉,而且要求對(duì)邏輯運(yùn)算有一定基礎(chǔ),不然在使用邏輯運(yùn)算符AND/OR/NOT 和括號(hào)組合時(shí)會(huì)出錯(cuò)。不太適合初學(xué)者使用。五 . 主子窗體交叉表查詢實(shí)例這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫是: “常用窗體查詢 3.MDB交叉表查詢通常作為統(tǒng)計(jì)之用,所以查詢條件少了一些。一般學(xué)習(xí)ACCESS 的人, 都有可能會(huì)被ACCESS 的向?qū)д`導(dǎo),以為子窗體控件里面一定要放一個(gè)子窗體。其實(shí)不是,在我的這個(gè)例子里,子窗體的對(duì)象其實(shí)就是交叉查詢,如下圖。一直有人問,對(duì)于交叉表這樣

41、字段數(shù)量不固定的,怎樣在子窗體中顯示。其實(shí),直接在子窗體里顯示交叉表本身是最簡(jiǎn)單的辦法。另一種方法是事先設(shè)計(jì)一個(gè)包含很多未綁定字段文本框的數(shù)據(jù)表窗體,在顯示之前,先用VBA 設(shè)置窗體的“記錄源”和各文本框的“控件來源”,同時(shí)還要控制沒有字段可以顯示的那些列要隱藏,然后再顯示出來。但這樣設(shè)計(jì)要求編寫比較多的代碼,只適合比較熟悉VBA 的人使用。(我在這個(gè)例子的報(bào)表中設(shè)計(jì)了類似的代碼,可以參考。)1. 按鈕設(shè)計(jì)1.1 查詢按鈕先看一下沒有條件的交叉表查詢的SQL 語句:TRANSFORM Sum( 存書查詢.單價(jià)) AS 單價(jià)之 SumSELECT 存書查詢.類別FROM 存書查詢GROUP BY 存書查詢.類別PIVOT Format( 進(jìn)書日期,"yyyy/mm");再看一下設(shè)置了條件的交叉表查詢的SQL 語句:TRANSFORM Sum( 存書查詢.單價(jià)) AS 單價(jià)之 SumSELECT 存書查詢.類別FROM 存書查詢WHERE ( 存書查詢.單價(jià) )=5)GROUP BY 存書查詢.類別PIVO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論