


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一.概述作為數(shù)據(jù)管理程序,統(tǒng)計(jì)和查詢功能是非常重要的。否則,就和電子表格沒有 區(qū)別了。所以,在每個(gè) ACCESS程序中都不可能缺少查詢的功能。本文的目的是由淺入深的介紹幾種最常用的利用主 /子窗體來實(shí)現(xiàn)查詢的方法, 使初學(xué)者和有一定VBA基礎(chǔ)的人可以更好的使用窗體查詢這種手段。附件中的窗體“常用窗體查詢 O.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-28
2、25電腦新時(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-1316MCS醉習(xí)指南書籍Syngress Media 公司人民郵電¥ 62.002001-9-2817局域網(wǎng)原理與架設(shè)技 術(shù)內(nèi)幕大公開書籍蔡昌均中國青年¥ 69.002001-9-2819AccessVBA 基礎(chǔ)書籍Eva nCallaha n人民郵電¥ 39.002001-
3、9-2820中文版 Access2001 冊通書籍趙琳等人民郵電¥ 42.002001-9-2821VISUALBASIC5.0 教程書籍SteveBrow n電子工業(yè)¥ 28.002001-9-2823中文版VisualBasic5.0 程序員指南書籍microsoft中國青年¥ 70.002001-9-2824Access中文版開發(fā)指 南書籍Alison Balter人民郵電¥ 128.002002-2-1629Access 2002數(shù)據(jù)庫系統(tǒng)開發(fā)實(shí)例導(dǎo)航書籍桂思強(qiáng)中國鐵道¥ 25.002003-3-1030中國名陵集中華古代名陵之大成書籍
4、羅哲文等百花文藝¥ 14.002003-5-2031邊緣部落一一福音谷書籍林茨(撰文攝影)河北教育¥ 27.002003-5-20為了比較有代表性,這個(gè)查詢中包含多種字段類型:數(shù)字類型:【書籍編號(hào)】、【單價(jià)】字符類型:【書名】、【類別】、【作者】、【出版社】 日期類型:【進(jìn)書日期】在多條件查詢中,我們會(huì)使用除了【書籍編號(hào)】之外的其他字段作為查詢條件。其實(shí),在下面介紹的窗體查詢方法中,有些代碼或思路也可以應(yīng)用在其它窗體 查詢方法中,你對各種代碼、方法和思路越熟練,就越能充分發(fā)揮它們的作用。這篇文章我是從4月初開始構(gòu)思,到5月中旬開始動(dòng)筆,花費(fèi)兩周時(shí)間寫成, 里面包含了我對AC
5、CESS窗體查詢所積累的經(jīng)驗(yàn),對初學(xué)者和有一定VBA基礎(chǔ) 的人都有針對性的方法。另外,希望其他精通 ACCESS的高手提出意見。二.制作主/子窗體的步驟1. 利用向?qū)е谱髦鞔绑w話確予舊萍衣審的布局:期 剋 B 別舌股價(jià)書 擱怕出里詵丄2>|<|“詒聯(lián)走囪住上股用疇些孑段:可從實(shí)千表或査訶中堆皿.I程詢:再書蚤詢P可用宇毆:私査詢?nèi)≈x | 卜 r |下芫成®取消 | 上一步(B】|下TOP芫成©諾為宙借措定你題:収上是片號(hào)創(chuàng)逢畝住所需的全部詰啟.誦確至黑委打開竊讀還是要俵改宙怖設(shè)計(jì)廠打開裔體查看或輔入信.息 柑務(wù)垠曾體設(shè)計(jì)M)廠顯看有關(guān)硬用菊悻的粘BhdD活請至斯
6、再稈式|存書査匚殖煒l£J 叭5蜒鷲111g匚11融si-F取謝 上一步(B) |下一歩0!)芫威®取洎 上一齒耐"|芫威(fF|現(xiàn)在的主窗體還太小,要已經(jīng)以下步驟才能變成我們需要的主窗體(如下圖): 把窗體面積放大到足以容納條件輸入字段和子窗體,并調(diào)整所有控件的字體; 把窗體的“記錄源”和各控件的“數(shù)據(jù)來源”都刪除(很多初學(xué)者很容易犯 的錯(cuò)誤就是這里),把類別和出版社改為組合框(因?yàn)檫@些字段的可能值比較少, 直接選擇就好,不必讓用戶輸入); 重新調(diào)整各字段的位置,并增加了兩個(gè)空文本框和標(biāo)簽放在單價(jià)和進(jìn)書日期 后面(因?yàn)槲掖蛩闶褂靡粋€(gè)范圍來作查詢條件,而不是一個(gè)固
7、定的值,這樣比 較符合實(shí)際); 單價(jià)后面的兩個(gè)文本框改名為“單價(jià)開始”和“單價(jià)截止”,進(jìn)書日期后面的 兩個(gè)文本框改名為“進(jìn)書日期開始”和“進(jìn)書日期截止”; 畫一個(gè)矩形框包住所有查詢條件,把矩形框背景設(shè)置為常規(guī),背景色為深灰 色,特殊樣式為凹陷,此時(shí)矩形框覆蓋了其它控件,要用菜單中“格式"Ta置 于底層”才能讓它們顯示出來; 在窗體上用向?qū)Ы⒁粋€(gè)按鈕,按鈕標(biāo)題是“查詢”,名稱是“ cmd查詢”先 不管里面的代碼,后面再修改; 窗體屬性中“記錄選定器”=否,“瀏覽按鈕”=否。2. 利用向?qū)гO(shè)計(jì)子窗體可炭用現(xiàn)有畝住創(chuàng)建子畝徉惑子報(bào)養(yǎng)"也可以幣表和/卓查詢目 訂創(chuàng)屯誦確足在子筍1
8、$豐子報(bào)衷中色色哪些乎図誦湧將陽于子旨住或子報(bào)表的數(shù)據(jù)來詛.p阻弔現(xiàn)帕漲槿詢臣用現(xiàn)石的世訐Z1查詢:存書至詞可用字段:可口叢E盍茅亍歪利i£査詢中堆搖乎段.5稔 牡18名SJ者版階 書書笑隹$*%書日期取甜I|下一歩昭)|取詢11上一歩叩|下一步|完成叩 在主窗體中用工具箱中的“子窗體/子報(bào)表”對象建立一個(gè)子窗體; 以存書查詢?yōu)橛涗浽?,選擇所有字段; 把子窗體命名為“存書查詢子窗體”; 在主窗體上刪除子窗體的標(biāo)簽,并重新調(diào)整子窗體的大??; 關(guān)閉主窗體的設(shè)計(jì)視圖,單獨(dú)打開子窗體數(shù)據(jù)表視圖,調(diào)整字體和行的大小現(xiàn)在,我們得到了如下的窗體:現(xiàn)在還沒有實(shí)際的查詢功能,我們在后面要根據(jù)所使用的方
9、法,修改窗體并增 加一些其他的功能。還有一些小的細(xì)節(jié)要注意,比如:按 TAB鍵后的獲得光標(biāo)的控件的順序要在設(shè) 計(jì)視圖下,視圖菜單的“ TAB鍵次序”來修改;有些文本框獲得焦點(diǎn)后是否要 打開輸入法,比如輸入單價(jià)和日期的地方要關(guān)閉,輸入書名和作者的地方要打 開,這些要在控件屬性中設(shè)置。.查詢方法1:在查詢中加入條件這種方法對應(yīng)的實(shí)例數(shù)據(jù)庫是:“常用窗體查詢1.MDB1. 設(shè)計(jì)查詢我們打開“存書查詢”設(shè)計(jì)視圖如下:在字段【書名】的準(zhǔn)則格內(nèi)寫入:Like llf(lsNull(Forms!存書查詢窗體!書名),'*','*'& Forms!存書查詢窗體!書名&a
10、mp; '*')加入后的設(shè)計(jì)視圖如下:把這個(gè)式子解釋一下:LIKE :是專門用于查詢字符型字段的運(yùn)算符,一般介紹 ACCESS的書中都有它 的用法。ISNULL(Forms!存書查詢窗體!書名):是用來判斷窗體“存書查詢窗體”上 面的“書名”這個(gè)文本框是否是空的。如果文本框是空的,貝心ISNULL(Forms!存書查詢窗體!書名)=TRUE (真)如果文本框不是空的,貝心ISNULL(Forms!存書查詢窗體!書名)=FALSE (假)IIF(EXPR, TRUEPART, FALSEPART)函數(shù):EXPR必要參數(shù)。用來判斷真?zhèn)蔚谋磉_(dá)式TRUEPART必要參數(shù)。如果 EXPR
11、為TRUE,則返回這部分的值或表達(dá)式。FALSEPART必要參數(shù)。如果 EXPR為FALSE,則返回這部分的值或表達(dá)式所以當(dāng)我們在窗體“存書查詢窗體”上面的“書名”里寫上“ACCESS”,整個(gè)式子的結(jié)果是:LIKE *ACCESS*相當(dāng)于查詢所有書名中包含“ ACCESS”的書籍,這樣可以實(shí)現(xiàn)模糊查詢Like llf(lsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名& '*')Like llf(lsNull(Forms!存書查詢窗體!書名),'*', Forms!存書查詢窗體!書名)如果把準(zhǔn)則改為上
12、面兩句中的一句,同樣情況下當(dāng)我們在窗體“存書查詢窗體” 上面的“書名”里寫上“ ACCESS”,整個(gè)式子的結(jié)果是:LIKE ACCESS*LIKE ACCESS相當(dāng)于查詢以“ACCESS”開頭的書籍(半模糊查詢),或者書名就叫“ACCESS” 的書(精確查詢)。具體使用那一種形式的查詢要根據(jù)你的實(shí)際情況來修改。當(dāng)我們在窗體“存書查詢窗體”上面的“書名”里什么也沒有寫,整個(gè)式子的 結(jié)果是:LIKE *相當(dāng)于查詢所有的有書名的書 在書寫查詢準(zhǔn)則時(shí),F(xiàn)orms!存書查詢窗體!書名這樣的窗體控件名很難寫, 這時(shí)你可以在準(zhǔn)則格內(nèi)點(diǎn)鼠標(biāo)右鍵,選擇生成器,出現(xiàn)如下圖的窗口:在左邊的樹型列表框里找到控件所在的
13、窗體,在中間列表框出現(xiàn)這個(gè)窗體包含 的所有控件,雙擊控件名,就會(huì)出現(xiàn)“ Forms!存書查詢窗體!書名”。我們再把其他幾個(gè)字段的查詢準(zhǔn)則寫出:【類別】:在窗體上是組合框,所以它肯定是個(gè)精確查詢,跟【書名】一樣,它 是文本字段。查詢準(zhǔn)則如下:Like llf(lsNull(Forms!存書查詢窗體!類別),'*',Forms!存書查詢窗體!類別)【作者】:跟【書名】一樣,它是文本字段。我也打算用模糊查詢。查詢準(zhǔn)則如下:Like llf(lsNull(Forms!存書查詢窗體!作者),'*','*'& Forms!存書查詢窗體!作者&
14、 '*')【出版社】:跟【類別】的情況完全一樣。查詢準(zhǔn)則如下:Like IIf(IsNull(Forms!存書查詢窗體!出版社),'*',Forms! 存書查詢窗體!出版社)【單價(jià)】:是一個(gè)數(shù)字字段,我在這里準(zhǔn)備讓用戶可以查詢“1.5元6.5元”這樣的范圍。查詢準(zhǔn)則如下:Between IIf(IsNull(Forms!存書查詢窗體!單價(jià)開始),0,Forms!存書查詢窗體!單價(jià)開始)And IIf(IsNull(Forms!存書查詢窗體!單價(jià)截止),5000,Forms!存書查詢窗體!單價(jià)截止)BETWEEN AND :是查詢符合某個(gè)范圍之內(nèi)的值所需的條件格式
15、?!?BETWEEN 1 AND 5 ”相當(dāng)于“【字段】1 AND【字段】W 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 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 (l
16、lf(lsNull(Forms!存書查詢窗體!進(jìn)書日期開始),#2000-1-1#,Forms! 存書查詢窗體! 進(jìn)書日期開始) And (llf(lsNull(Forms!存書查詢窗體! 進(jìn)書日期截止),#2099-12-31#,Forms!存書查詢窗體!進(jìn)書日期截止)在這個(gè)式子中,#2000-1-1#和#2099-12-31#是我設(shè)定的兩個(gè)默認(rèn)的開始和截止日 期。如果用戶不輸入,就使用默認(rèn)值了。這和前面【單價(jià)】的情況是一樣的。2. 設(shè)計(jì)按鈕及代碼2.1查詢按鈕查詢按鈕的代碼非常簡單,關(guān)鍵部分只有一句:Private Sub cmd 查詢 _Click()Me.存書查詢子窗體.Requery
17、 ' 這句是關(guān)鍵End SubREQUERY :是用來重新查詢控件的數(shù)據(jù)源,這樣可以刷新子窗體顯示的記錄。 對于記錄源是表或查詢的控件如窗體、列表框、組合框等經(jīng)常用Requery方法來 刷新顯示內(nèi)容。2.2清除按鈕有了查詢按鈕的代碼之后,大家就可以自己測試查詢的效果了。不過,每次想 換一個(gè)查詢的條件時(shí)要清除上一個(gè)條件輸入的東西,有時(shí)候比較麻煩。我們再 來設(shè)計(jì)一個(gè)清除條件的按鈕,控件名稱是“cmd清除”,放在查詢按鈕的下面按鈕的代碼如下:Private Sub cmd 清除 _Click()' 下面這些控件的值要清空Me.書名=NullMe.類別=NullMe.作者=NullMe
18、. 出版社=NullMe. 單價(jià)開始=NullMe. 單價(jià)截止=NullMe.進(jìn)書日期開始=NullMe.進(jìn)書日期截止=NullMe.存書查詢子窗體.Requery '清空之后一樣要重新查詢End Sub2.3打印按鈕有了查詢結(jié)果,想打印出來,很簡單。由于報(bào)表的記錄源就是“存書查詢”,所以在查詢里設(shè)計(jì)的條件會(huì)直接在報(bào)表里體現(xiàn)出來。我們只要用按鈕向?qū)е谱饕粋€(gè)預(yù)覽報(bào)表的按鈕就可以了。我們把這個(gè)按鈕放在 子窗體下面的右邊。控件名稱是“ cmd預(yù)覽報(bào)表”。由于完全是采用向?qū)е谱鞯?,不需修改代碼,所以我就不在這里列出代碼了。2.4導(dǎo)出EXCEL按鈕如果你覺得ACCESS的報(bào)表邊框太難看,或者你想
19、在報(bào)表上加上一些說明什么 的。你可能更愿意把數(shù)據(jù)導(dǎo)出到 EXCEL里進(jìn)行再加工。為了初學(xué)者容易理解,我打算用一個(gè)宏來解決這個(gè)問題。宏的設(shè)計(jì)如下圖:現(xiàn)在,宏里“輸出文件”為空,運(yùn)行時(shí)會(huì)自動(dòng)跳出對話框讓你選擇保存目錄和 文件名。如果你想保存在數(shù)據(jù)庫所在目錄下的“查詢結(jié)果.xls ”里,可以在“輸出文件” 一欄里填入:查詢結(jié)果.xls"把這個(gè)宏存為“導(dǎo)出查詢數(shù)據(jù)宏” 然后再在窗體里加入按鈕。當(dāng)按鈕向?qū)С霈F(xiàn)后,直接取消。在按鈕的屬性頁里, 先把按鈕名稱改為“cmd導(dǎo)出”,在按鈕的“單擊事件”里直接用下拉框選擇“導(dǎo) 出查詢數(shù)據(jù)宏”,如下圖。這樣就不必編寫代碼了。百命令按鈕;Ed導(dǎo)出爭件|其他|
20、全部|I卜” I導(dǎo)出查詢數(shù)據(jù)宏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ù)”,控件來源二Count(*),另一個(gè)是txt單價(jià)合計(jì)”,控件來源二Sum(單價(jià)); 在子窗體的窗體屬性中設(shè)置:瀏覽按鈕=否,記錄集類型=快照(快照的運(yùn) 行速度快,占用內(nèi)存少,但不能編輯更新,正適合我們的需要) ;3.2主窗體上的設(shè)計(jì)持合條件記錄載:卜存書查詢二單價(jià)合計(jì):卜存書査詢冇預(yù)覽報(bào)表潔玲入奢
21、詢條件導(dǎo)出EXCEL 在子窗體下面的地方設(shè)計(jì)兩個(gè)文本框“計(jì)數(shù)”和“合計(jì)”,把它們的標(biāo)簽改為 “符合條件記錄數(shù):”和“單價(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)完成了。大家可以使用各種條件組合來測試一下窗體的 效果。匕戰(zhàn)社"3書縉H號(hào)菟JWftft*21>ISUALEi.SIC5,。執(zhí)甩電干二毀A c ._eu s 2加2取師廉航幵
22、笈窩曲號(hào)骯書籍中國*30B國居陛一賓t華吉tts陛才乂應(yīng)31莎苗茗一晉各林叢河北彳單忻賞計(jì);|號(hào)出噫花匚羊(530邊書 mn Izooo-i-i至3099-32-3:!4.1本方法優(yōu)點(diǎn)在查詢中加入條件這種方法比較簡單,只要在查詢中設(shè)計(jì)好各字段的條件,那 么窗體中的代碼就非常少,而且在打印報(bào)表和導(dǎo)出數(shù)據(jù)方面也很容易設(shè)計(jì),比 較適合初學(xué)ACCESS的人使用。4.2本方法缺點(diǎn) 對查詢中的數(shù)據(jù)有限制,所有設(shè)計(jì)了條件的字段中必須是每條記錄都有數(shù)據(jù)。 即使你在窗體中并沒有在這個(gè)字段對應(yīng)的文本框中輸入條件。舉例來說,假設(shè)你在表“ tb藏書情況”中,把【書籍編號(hào)】=16對應(yīng)的這本書的 作者或單價(jià)刪掉,在“存書
23、查詢窗體”中,即使你不輸入任何條件,【書籍編號(hào)】 =16對應(yīng)的這本書你也看不見。 如果在某個(gè)查詢組合下,子窗體上根本沒有符合條件的記錄,則主窗體上的 “記錄數(shù)”和“合計(jì)”會(huì)顯示“#錯(cuò)誤”。如果把主窗體上的“記錄數(shù)”和“合計(jì)”的控件來源改為:=llf(lsError(存書查詢子窗體.Form.txt 計(jì)數(shù)),0, 存書查詢子窗體.Form.txt 計(jì)數(shù))=llf(lsError(存書查詢子窗體.Form.txt 單價(jià)合計(jì)),0, 存書查詢子窗體.Form.txt 單價(jià)合計(jì))則不會(huì)出現(xiàn)“#錯(cuò)誤”,這是我在下面地址學(xué)到的:http:/www.erpbus. net/access/topic.asp?
24、topic_id=8183&forumd=44 報(bào)表不能直接打開,每次打開報(bào)表就會(huì)跳出提示框要求輸入條件。四.查詢方法2 :用VBA生成窗體篩選條件這種方法對應(yīng)的實(shí)例數(shù)據(jù)庫是:“常用窗體查詢2.MDB ”。主窗體的控件與“常用窗體查詢 1.MDB ”相同,只是按鈕中的代碼都改了。子 窗體則完全相同?!按鏁樵儭敝胁恍枰斎肴魏螚l件。1.按鈕代碼設(shè)計(jì)1.1查詢按鈕本按鈕代碼的設(shè)計(jì)思想是根據(jù)主窗體上各個(gè)條件輸入控件的值,用VBA代碼生成一個(gè)條件組合的字符串作為子窗體的窗體篩選的條件。'判斷【書名】條件是否有輸入的值If Not lsNull(Me.書名)Then' 有輸入s
25、trWhere = strWhere & "(書名like '*" & Me.書名 & "*') AND "End If& :是字符串鏈接運(yùn)算符,它和“ + ”不同之處在于“ &”兩邊如果不是字符串 表達(dá)式,它會(huì)自動(dòng)把表達(dá)式的值變成字符串,省了你轉(zhuǎn)換格式了。"(書名LIKE '*":英文雙引號(hào)是VBA用來表示字符串的符號(hào),兩個(gè)雙引號(hào)中 間是一個(gè)字符串。""兩個(gè)雙引號(hào)中間什么也沒有,表示一個(gè)空字符串。注意:空字符串工NULL (空值)。所以IsNull(
26、"")=False。'*ACCESS*':英文單引號(hào)是SQL語句中用來表示字符串的符號(hào),兩個(gè)單引號(hào)中 間是一個(gè)字符串。(SQL語句中也可以使用雙引號(hào)來表示字符串,但在VBA代碼生成SQL語句時(shí),為了簡化格式,一律用單引號(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)作算
27、術(shù)運(yùn)算符而導(dǎo)致出錯(cuò)。ME.書名:是“存書查詢窗體”上文本框“書名”的值。Me.書名二Me.書名.Value。 Me是對代碼所在窗體的引用。劉小軍(Alex ) 2003-515如果此時(shí)“存書查詢窗體”上文本框“書名”的值是"ACCESS",那么此時(shí)strWhere 的結(jié)果就是:"(書名like '*ACCESS*') AND "跟查詢方法1中一樣,我們也可以改為半模糊查詢和精確查詢,代碼如下:strWhere = strWhere & "(書名like '" & Me.書名 & &quo
28、t;*') AND "strWhere = strWhere & "(書名like '" & Me.書名 & "') AND "接著看關(guān)于【單價(jià)】的代碼:'判斷【單價(jià)】條件是否有輸入的值,由于有【單價(jià)開始】【單價(jià)截止】兩個(gè)文本框' 所以要分開來考慮If Not lsNull(Me.單價(jià)開始)Then'【單價(jià)開始】有輸入strWhere = strWhere & "(單價(jià)="& Me. 單價(jià)開始 & ") AND &quo
29、t;End IfIf Not lsNull(Me.單價(jià)截止)Then'【單價(jià)截止】有輸入strWhere = strWhere & "(單價(jià)="& Me. 單價(jià)截止 & ") AND "End If這里用“ =”“ =”來代替“ BETWEEN AND ”,效果是一樣的,只是不需要 像查詢方法1中那樣如果不填數(shù)字,會(huì)分別寫入0和5000。再來看看關(guān)于【進(jìn)書日期】的代碼:'判斷【進(jìn)書日期】條件是否有輸入的值,由于有【進(jìn)書日期開始】【進(jìn)書日期截止】兩個(gè)文本框' 所以要分開來考慮If Not IsNull(Me.
30、進(jìn)書日期開始)Then'【進(jìn)書日期開始】有輸入strWhere = strWhere & "(進(jìn)書日期=#" & Format(Me.進(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") & "#
31、)AND "End If使用Format(Me.進(jìn)書日期開始,"yyyy-mm-dd"),而不是直接用 Me.進(jìn)書日期開始,是因?yàn)橛?時(shí)候直接用Me進(jìn)書日期開始的話,會(huì)因?yàn)橛?jì)算機(jī)日期格式設(shè)置的不同而出現(xiàn)一些奇 怪的問題。ACCESS中的日期條件一直都是比較麻煩的,不管是選擇查詢、追 加查詢還是交叉表查詢,設(shè)置日期字段的條件都是要特別注意的。(像查詢方法1中直接在查詢準(zhǔn)則中引用控件值雖然不會(huì)出現(xiàn)類似問題,但交叉表查詢中不能使用控件作為日期字段的條件。)' 先在立即窗口顯示一下 strWhere的值,代碼調(diào)試完成后可以取消下一句Debug.Pri nt str
32、WhereDEBUG.PRINT:是專門用于調(diào)試的語句,它會(huì)把后面表達(dá)式的值顯示在VB編輯器的立即窗口里。在適當(dāng)?shù)氐胤讲迦隓ebug.Pri nt可以檢查程序運(yùn)行的是否正確。等全部調(diào)試結(jié)束后,可以把他們都刪掉。' 讓子窗體應(yīng)用窗體查詢Me. 存書查詢子窗體.Form.Filter = strWhereMe. 存書查詢子窗體.Form.FilterOn = True主窗體或單一窗體設(shè)置篩選字符串時(shí)用:Me.Filter=""或是 Forms!XX 窗體.Filter二""。' 在子窗體篩選后要運(yùn)行一下自編子程序CheckSubformCou
33、 nt()Call CheckSubformCou ntCheckSubformCount是一個(gè)自編的子程序,CALL是調(diào)用子程序的語句,也可以 不寫CALL直接用CheckSubformCount調(diào)用子程序。1.2清除按鈕代碼里都有說明,只講以下的一段代碼:For Each ctl In Me.C on trols' 根據(jù)ctl的控件類型來選擇Select Case ctl.C on trolTypeCase acTextBox '是文本框,要清空(注意,子窗體下面還有兩個(gè)鎖定的文本框不能賦值)If ctl.Locked = False Then ctl.Value = Nu
34、llCase acComboBox '是組合框,也要清空ctl.Value = Null'其它類型的控件不處理End SelectNextFOR EACH CTL IN ME.CONTROLS :意思是把當(dāng)前窗體內(nèi)所有的控件都逐個(gè)引 用一次(子窗體控件內(nèi)的控件不算在內(nèi))。這種用“ For Each對象或?qū)傩訧n 對 象集合或?qū)傩约稀钡谋闅v方法在ACCESS編程中屬于比較常見的用法,用處 也很多。比如最常見的檢查窗體是否打開的代碼中也有:Function lsLoaded(strFrmName As String) As Boolea n'確定一個(gè)窗體是否已被裝載。Co
35、nst conFo rmDesig n = 0Dim objForm As FormIsLoaded = FalseFor Each objForm In FormsIf objForm.FormName = strFrmName The nIf objForm.Curre ntView <> con FormDesig n The n '窗體不是設(shè)計(jì)模式時(shí)IsLoaded = TrueExit Fun ction '一旦找到了此窗體,就退出本函數(shù)。End IfEnd IfNextEnd Function1.3預(yù)覽報(bào)表按鈕預(yù)覽報(bào)表按鈕中關(guān)鍵是如下語句:strWher
36、e = Me. 存書查詢子窗體.Form.Filter'在打開報(bào)表的同時(shí)把子窗體的篩選條件字符串也傳遞給報(bào)表,' 這樣地話報(bào)表也會(huì)顯示和子窗體相同的記錄。DoCmd.Ope nReport 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è)查詢。我在查詢中
37、增加了一個(gè)“查詢結(jié)果”,其中的設(shè)計(jì)隨便就行,因?yàn)槊看卧谑褂眠@ 個(gè)查詢之前,我們都會(huì)用 DAO修改查詢的SQL語句。思路很簡單,如果子窗體的篩選條件字符串是:(類別Like ' 書籍')AND ( 單價(jià)>=20)那么,我們把“查詢結(jié)果”的SQL語句改為:SELECT * FROM 存書查詢 WHERE (類別Like ' 書籍')AND ( 單價(jià)>=20)這樣的話,“查詢結(jié)果”的記錄與子窗體里的記錄就是相同的劉小軍(Alex)2003-5對應(yīng)的代碼如下:strWhere = Me.存書查詢子窗體.Form.FilterIf strWhere = &qu
38、ot;" Then'沒有條件strSQL = "SELECT * FROM 存書查詢"Else有條件strSQL = "SELECT * FROM End If存書查詢WHERE " & strWhere這部分用來準(zhǔn)備查詢的SQL語句。Set qdf = Curre ntDb.QueryDefs(” qdf.SQL = strSQL qdf.Close查詢結(jié)果")Set qdf = Noth ing這一部分用來把做好的SQL語句放在查詢中DoCmd.OutputTo acOutputQuery,"查詢結(jié)果&q
39、uot;, acFormatXLS, , True這一部分的作用,和查詢方法1中的“導(dǎo)出查詢數(shù)據(jù)宏”的作用相同。運(yùn)行時(shí) 會(huì)自動(dòng)跳出對話框讓你選擇保存目錄和文件名。如果你想保存在數(shù)據(jù)庫所在目 錄下的“查詢結(jié)果.xls”里,可以把這一句改為:查詢結(jié)果.xls"DoCmd.OutputTo acOutputQuery,"查詢結(jié)果", acFormatXLS, strOutputFileName , True如果你想在文件名上保留時(shí)間,以便知道是什么時(shí)候做的查詢,可以改為:查詢結(jié)果-"& _Format(Date(),"yyyymmdd&quo
40、t;) & ".xls"DoCmd.OutputTo acOutputQuery,"查詢結(jié)果", acFormatXLS, strOutputFileName , True_:英文下劃線表明下一行和本行是同一條語句,在語句比較長時(shí),為了便于閱 讀,可以用這種方法把每行變短一些。下劃線之前要有一個(gè)空格作分隔,不然 可能會(huì)被當(dāng)作字段名的一部分。1.5 CheckSubformCount 子程序這段子程序的目的在代碼中已經(jīng)解釋了。目前實(shí)例數(shù)據(jù)庫中的代碼中是用代碼 設(shè)置文本框的“控件來源”。也可以直接用代碼設(shè)置控件的值(前提條件是在窗 體的設(shè)計(jì)視圖中,把
41、兩個(gè)文本框的控件來源都刪掉,使控件變成未綁定)。此外, 我再加幾句代碼,當(dāng)子窗體無記錄時(shí),下面的導(dǎo)出和預(yù)覽按鈕都變成灰色。這 樣的軟件顯得更專業(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 =
42、FalseMe.cmd預(yù)覽報(bào)表.Enabled = FalseEnd If2.方法總結(jié)使用VBA來設(shè)置子窗體篩選條件的方法解決了方法 1中的幾個(gè)缺點(diǎn),大家可以 逐一測試。但是編寫這樣的VBA代碼需要對VBA比較熟悉,而且要求對邏輯運(yùn)算有一定 基礎(chǔ),不然在使用邏輯運(yùn)算符 AND/OR/NOT和括號(hào)組合時(shí)會(huì)出錯(cuò)。不太適合初 學(xué)者使用。五.主子窗體交叉表查詢實(shí)例這種方法對應(yīng)的實(shí)例數(shù)據(jù)庫是:“常用窗體查詢3.MDB交叉表查詢通常作為統(tǒng)計(jì)之用,所以查詢條件少了一些。一般學(xué)習(xí)ACCESS的人,都有可能會(huì)被ACCESS的向?qū)д`導(dǎo),以為子窗體控件 里面一定要放一個(gè)子窗體。其實(shí)不是,在我的這個(gè)例子里,子窗體的對
43、象其實(shí) 就是交叉查詢,如下圖。子窗休/于報(bào)盍:存書杳詢子窗休源對象 鏈接子孚段 灘接主字盤是否有婁t . , , - r , 是舌速走,金刖匕旬.存書查詢芟更表表.tb就書'昏呪 表.t砒版壯名單 表lb規(guī)團(tuán)查詢存書查誨直詢.存書宜I址交冥表一直有人問,對于交叉表這樣字段數(shù)量不固定的,怎樣在子窗體中顯示。其實(shí), 直接在子窗體里顯示交叉表本身是最簡單的辦法。另一種方法是事先設(shè)計(jì)一個(gè)包含很多未綁定字段文本框的數(shù)據(jù)表窗體,在顯示 之前,先用VBA設(shè)置窗體的“記錄源”和各文本框的“控件來源”,同時(shí)還要 控制沒有字段可以顯示的那些列要隱藏,然后再顯示出來。但這樣設(shè)計(jì)要求編 寫比較多的代碼,只適合比較熟悉 VBA的人使用。(我在這個(gè)例子的報(bào)表中設(shè) 計(jì)了類似的代碼,可以參考。)1. 按鈕設(shè)計(jì)1.1查詢按鈕先看一下沒有條件的交叉表查詢的 SQL語句:TRANSFORM SumK書查詢單價(jià))AS 單價(jià)之SumSELECT存書查詢類別FROM存書查詢GROUP BY存書查詢類別PIVOT Format(進(jìn)書日期,"yyyy/mm");再看一下設(shè)置了條件的交叉
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國云安全行業(yè)市場發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 2025年度停薪留職員工職業(yè)規(guī)劃與發(fā)展協(xié)議范本
- 2025年中國桂圓干行業(yè)競爭格局分析及投資戰(zhàn)略咨詢報(bào)告
- 2025年度車隊(duì)運(yùn)輸節(jié)能減排服務(wù)協(xié)議
- 種樹合作合同范本
- 2025分公司承包旅游服務(wù)經(jīng)營合同范本
- 2025年度行政合同績效考核與激勵(lì)措施(第十二講)
- 《感受生活中的法律》(第一課時(shí)) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治六年級(jí)上冊統(tǒng)編版
- 中國裝修電商行業(yè)市場調(diào)查研究及投資前景預(yù)測報(bào)告
- 中國白藥行業(yè)市場深度評估及投資戰(zhàn)略規(guī)劃報(bào)告
- 網(wǎng)絡(luò)營銷講義網(wǎng)絡(luò)營銷產(chǎn)品策略課件
- 《小型混凝土預(yù)制件標(biāo)準(zhǔn)化生產(chǎn)管理辦法》
- 六年級(jí)上冊英語教案-Culture 2 Going Green 第二課時(shí) 廣東開心英語
- 警察叔叔是怎樣破案的演示文稿課件
- 青年教師個(gè)人成長檔案
- 2021譯林版高中英語選擇性必修三課文翻譯
- 2022年華中科技大學(xué)博士研究生英語入學(xué)考試真題
- 《網(wǎng)店運(yùn)營與管理》整本書電子教案全套教學(xué)教案
- 打印版 《固體物理教程》課后答案王矜奉
- 中考《紅星照耀中國》各篇章練習(xí)題及答案(1-12)
- Q∕GDW 11612.43-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第4-3部分:應(yīng)用層通信協(xié)議
評論
0/150
提交評論