ACCESS窗體查詢實(shí)例_第1頁(yè)
ACCESS窗體查詢實(shí)例_第2頁(yè)
ACCESS窗體查詢實(shí)例_第3頁(yè)
ACCESS窗體查詢實(shí)例_第4頁(yè)
ACCESS窗體查詢實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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)介

./概述作為數(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í)的容作練習(xí)用的。我們先看查詢中的數(shù)據(jù):書(shū)籍編號(hào)書(shū)名類別作者單價(jià)進(jìn)書(shū)日期22CHIP-01-08報(bào)刊電子計(jì)算機(jī)與外部設(shè)備期刊社電子計(jì)算機(jī)與外部設(shè)備¥16.802001-9-2825電腦新時(shí)代-6光盤(pán)光盤(pán)UNKNOWN電腦新時(shí)代¥5.002002-7-827學(xué)電腦-7光盤(pán)光盤(pán)UNKNOWN人民郵電¥5.002002-7-1328CHIP-02-07光盤(pán)光盤(pán)電子計(jì)算機(jī)與外部設(shè)備雜志社電子計(jì)算機(jī)與外部設(shè)備¥5.002002-7-1316MCSE學(xué)習(xí)指南書(shū)籍SyngressMedia公司人民郵電¥62.002001-9-2817局域網(wǎng)原理與架設(shè)技術(shù)幕大公開(kāi)書(shū)籍蔡昌均中國(guó)青年¥69.002001-9-2819AccessVBA基礎(chǔ)書(shū)籍EvanCallahan人民郵電¥39.002001-9-2820中文版Access2001一冊(cè)通書(shū)籍琳等人民郵電¥42.002001-9-2821VISUALBASIC5.0教程書(shū)籍SteveBrown電子工業(yè)¥28.002001-9-2823中文版VisualBasic5.0程序員指南書(shū)籍microsoft中國(guó)青年¥70.002001-9-2824Access中文版開(kāi)發(fā)指南書(shū)籍AlisonBalter人民郵電¥128.002002-2-1629Access2002數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)實(shí)例導(dǎo)航書(shū)籍桂思強(qiáng)中國(guó)鐵道¥25.002003-3-1030中國(guó)名陵——集中華古代名陵之大成書(shū)籍羅哲文等百花文藝¥14.002003-5-2031邊緣部落——福音谷書(shū)籍林茨〔撰文攝影教育¥27.002003-5-20為了比較有代表性,這個(gè)查詢中包含多種字段類型:數(shù)字類型:[書(shū)籍編號(hào)]、[單價(jià)]字符類型:[書(shū)名]、[類別]、[作者]、[]日期類型:[進(jìn)書(shū)日期]在多條件查詢中,我們會(huì)使用除了[書(shū)籍編號(hào)]之外的其他字段作為查詢條件。其實(shí),在下面介紹的窗體查詢方法中,有些代碼或思路也可以應(yīng)用在其它窗體查詢方法中,你對(duì)各種代碼、方法和思路越熟練,就越能充分發(fā)揮它們的作用。這篇文章我是從4月初開(kāi)始構(gòu)思,到5月中旬開(kāi)始動(dòng)筆,花費(fèi)兩周時(shí)間寫(xiě)成,里面包含了我對(duì)ACCESS窗體查詢所積累的經(jīng)驗(yàn),對(duì)初學(xué)者和有一定VBA基礎(chǔ)的人都有針對(duì)性的方法。另外,希望其他精通ACCESS的高手提出意見(jiàn)。制作主/子窗體的步驟利用向?qū)е谱髦鞔绑w現(xiàn)在的主窗體還太小,要已經(jīng)以下步驟才能變成我們需要的主窗體〔如下圖:①把窗體面積放大到足以容納條件輸入字段和子窗體,并調(diào)整所有控件的字體;②把窗體的"記錄源"和各控件的"數(shù)據(jù)來(lái)源"都刪除〔很多初學(xué)者很容易犯的錯(cuò)誤就是這里,把類別和改為組合框〔因?yàn)檫@些字段的可能值比較少,直接選擇就好,不必讓用戶輸入;③重新調(diào)整各字段的位置,并增加了兩個(gè)空文本框和標(biāo)簽放在單價(jià)和進(jìn)書(shū)日期后面〔因?yàn)槲掖蛩闶褂靡粋€(gè)圍來(lái)作查詢條件,而不是一個(gè)固定的值,這樣比較符合實(shí)際;④單價(jià)后面的兩個(gè)文本框改名為"單價(jià)開(kāi)始"和"單價(jià)截止",進(jìn)書(shū)日期后面的兩個(gè)文本框改名為"進(jìn)書(shū)日期開(kāi)始"和"進(jìn)書(shū)日期截止";⑤畫(huà)一個(gè)矩形框包住所有查詢條件,把矩形框背景設(shè)置為常規(guī),背景色為深灰色,特殊樣式為凹陷,此時(shí)矩形框覆蓋了其它控件,要用菜單中"格式"→"置于底層"才能讓它們顯示出來(lái);⑥在窗體上用向?qū)Ы⒁粋€(gè)按鈕,按鈕標(biāo)題是"查詢",名稱是"cmd查詢"先不管里面的代碼,后面再修改;⑦窗體屬性中"記錄選定器"=否,"瀏覽按鈕"=否。利用向?qū)гO(shè)計(jì)子窗體①在主窗體中用工具箱中的"子窗體/子報(bào)表"對(duì)象建立一個(gè)子窗體;②以存書(shū)查詢?yōu)橛涗浽?選擇所有字段;③把子窗體命名為"存書(shū)查詢子窗體";④在主窗體上刪除子窗體的標(biāo)簽,并重新調(diào)整子窗體的大小;⑤關(guān)閉主窗體的設(shè)計(jì)視圖,單獨(dú)打開(kāi)子窗體數(shù)據(jù)表視圖,調(diào)整字體和行的大小。現(xiàn)在,我們得到了如下的窗體:現(xiàn)在還沒(méi)有實(shí)際的查詢功能,我們?cè)诤竺嬉鶕?jù)所使用的方法,修改窗體并增加一些其他的功能。還有一些小的細(xì)節(jié)要注意,比如:按TAB鍵后的獲得光標(biāo)的控件的順序要在設(shè)計(jì)視圖下,視圖菜單的"TAB鍵次序"來(lái)修改;有些文本框獲得焦點(diǎn)后是否要打開(kāi)輸入法,比如輸入單價(jià)和日期的地方要關(guān)閉,輸入書(shū)名和作者的地方要打開(kāi),這些要在控件屬性中設(shè)置。查詢方法1:在查詢中加入條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫(kù)是:"常用窗體查詢1.MDB"。設(shè)計(jì)查詢我們打開(kāi)"存書(shū)查詢"設(shè)計(jì)視圖如下:在字段[書(shū)名]的準(zhǔn)則格寫(xiě)入:LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![書(shū)名]>,'*','*'&[Forms]![存書(shū)查詢窗體]![書(shū)名]&'*'>加入后的設(shè)計(jì)視圖如下:把這個(gè)式子解釋一下:LIKE:是專門(mén)用于查詢字符型字段的運(yùn)算符,一般介紹ACCESS的書(shū)中都有它的用法。ISNULL<[Forms]![存書(shū)查詢窗體]![書(shū)名]>:是用來(lái)判斷窗體"存書(shū)查詢窗體"上面的"書(shū)名"這個(gè)文本框是否是空的。如果文本框是空的,則:ISNULL<[Forms]![存書(shū)查詢窗體]![書(shū)名]>=TRUE〔真如果文本框不是空的,則:ISNULL<[Forms]![存書(shū)查詢窗體]![書(shū)名]>=FALSE〔假IIF<expr,truepart,falsepart>函數(shù):expr必要參數(shù)。用來(lái)判斷真?zhèn)蔚谋磉_(dá)式。truepart必要參數(shù)。如果expr為T(mén)rue,則返回這部分的值或表達(dá)式。falsepart必要參數(shù)。如果expr為False,則返回這部分的值或表達(dá)式。所以當(dāng)我們?cè)诖绑w"存書(shū)查詢窗體"上面的"書(shū)名"里寫(xiě)上"ACCESS",整個(gè)式子的結(jié)果是:LIKE*ACCESS*相當(dāng)于查詢所有書(shū)名中包含"ACCESS"的書(shū)籍,這樣可以實(shí)現(xiàn)模糊查詢。LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![書(shū)名]>,'*',[Forms]![存書(shū)查詢窗體]![書(shū)名]&'*'>LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![書(shū)名]>,'*',[Forms]![存書(shū)查詢窗體]![書(shū)名]>如果把準(zhǔn)則改為上面兩句中的一句,同樣情況下當(dāng)我們?cè)诖绑w"存書(shū)查詢窗體"上面的"書(shū)名"里寫(xiě)上"ACCESS",整個(gè)式子的結(jié)果是:LIKEACCESS*LIKEACCESS相當(dāng)于查詢以"ACCESS"開(kāi)頭的書(shū)籍〔半模糊查詢,或者書(shū)名就叫"ACCESS"的書(shū)〔精確查詢。具體使用那一種形式的查詢要根據(jù)你的實(shí)際情況來(lái)修改。當(dāng)我們?cè)诖绑w"存書(shū)查詢窗體"上面的"書(shū)名"里什么也沒(méi)有寫(xiě),整個(gè)式子的結(jié)果是:LIKE*相當(dāng)于查詢所有的有書(shū)名的書(shū)。在書(shū)寫(xiě)查詢準(zhǔn)則時(shí),[Forms]![存書(shū)查詢窗體]![書(shū)名]這樣的窗體控件名很難寫(xiě),這時(shí)你可以在準(zhǔn)則格點(diǎn)鼠標(biāo)右鍵,選擇生成器,出現(xiàn)如下圖的窗口:在左邊的樹(shù)型列表框里找到控件所在的窗體,在中間列表框出現(xiàn)這個(gè)窗體包含的所有控件,雙擊控件名,就會(huì)出現(xiàn)"[Forms]![存書(shū)查詢窗體]![書(shū)名]"。我們?cè)侔哑渌麕讉€(gè)字段的查詢準(zhǔn)則寫(xiě)出:[類別]:在窗體上是組合框,所以它肯定是個(gè)精確查詢,跟[書(shū)名]一樣,它是文本字段。查詢準(zhǔn)則如下:LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![類別]>,'*',[Forms]![存書(shū)查詢窗體]![類別]>[作者]:跟[書(shū)名]一樣,它是文本字段。我也打算用模糊查詢。查詢準(zhǔn)則如下:LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![作者]>,'*','*'&[Forms]![存書(shū)查詢窗體]![作者]&'*'>[]:跟[類別]的情況完全一樣。查詢準(zhǔn)則如下:LikeIIf<IsNull<[Forms]![存書(shū)查詢窗體]![]>,'*',[Forms]![存書(shū)查詢窗體]![]>[單價(jià)]:是一個(gè)數(shù)字字段,我在這里準(zhǔn)備讓用戶可以查詢"1.5元~6.5元"這樣的圍。查詢準(zhǔn)則如下:BetweenIIf<IsNull<[Forms]![存書(shū)查詢窗體]![單價(jià)開(kāi)始]>,0,[Forms]![存書(shū)查詢窗體]![單價(jià)開(kāi)始]>AndIIf<IsNull<[Forms]![存書(shū)查詢窗體]![單價(jià)截止]>,5000,[Forms]![存書(shū)查詢窗體]![單價(jià)截止]>BETWEENAND:是查詢符合某個(gè)圍之的值所需的條件格式。"BETWEEN1AND5"相當(dāng)于"[字段]≥1AND[字段]≤5"。根據(jù)前面講解的IIF的容,我用一個(gè)表格來(lái)解釋一下各種情況下這個(gè)式子的實(shí)際結(jié)果,便于大家理解:〔0和5000是我事先在條件中設(shè)定的最小值和最大值[單價(jià)開(kāi)始]的值[單價(jià)截止]的值整個(gè)式子的實(shí)際結(jié)果空空BETWEEN0AND50001.5空BETWEEN1.5AND5000空20BETWEEN0AND201.56.5BETWEEN1.5AND6.5[進(jìn)書(shū)日期]:是一個(gè)日期型字段,我在這里準(zhǔn)備讓用戶可以查詢"#2001-5-1#~#2002-5-1#"這樣的圍。查詢準(zhǔn)則如下:Between<IIf<IsNull<[Forms]![存書(shū)查詢窗體]![進(jìn)書(shū)日期開(kāi)始]>,#2000-1-1#,[Forms]![存書(shū)查詢窗體]![進(jìn)書(shū)日期開(kāi)始]>>And<IIf<IsNull<[Forms]![存書(shū)查詢窗體]![進(jìn)書(shū)日期截止]>,#2099-12-31#,[Forms]![存書(shū)查詢窗體]![進(jìn)書(shū)日期截止]>>在這個(gè)式子中,#2000-1-1#和#2099-12-31#是我設(shè)定的兩個(gè)默認(rèn)的開(kāi)始和截止日期。如果用戶不輸入,就使用默認(rèn)值了。這和前面[單價(jià)]的情況是一樣的。設(shè)計(jì)按鈕及代碼查詢按鈕查詢按鈕的代碼非常簡(jiǎn)單,關(guān)鍵部分只有一句:PrivateSubcmd查詢_Click<>Me.存書(shū)查詢子窗體.Requery'這句是關(guān)鍵EndSubRequery:是用來(lái)重新查詢控件的數(shù)據(jù)源,這樣可以刷新子窗體顯示的記錄。對(duì)于記錄源是表或查詢的控件如窗體、列表框、組合框等經(jīng)常用Requery方法來(lái)刷新顯示容。清除按鈕有了查詢按鈕的代碼之后,大家就可以自己測(cè)試查詢的效果了。不過(guò),每次想換一個(gè)查詢的條件時(shí)要清除上一個(gè)條件輸入的東西,有時(shí)候比較麻煩。我們?cè)賮?lái)設(shè)計(jì)一個(gè)清除條件的按鈕,控件名稱是"cmd清除",放在查詢按鈕的下面。按鈕的代碼如下:PrivateSubcmd清除_Click<>'下面這些控件的值要清空Me.書(shū)名=NullMe.類別=NullMe.作者=NullMe.=NullMe.單價(jià)開(kāi)始=NullMe.單價(jià)截止=NullMe.進(jìn)書(shū)日期開(kāi)始=NullMe.進(jìn)書(shū)日期截止=NullMe.存書(shū)查詢子窗體.Requery'清空之后一樣要重新查詢EndSub打印按鈕有了查詢結(jié)果,想打印出來(lái),很簡(jiǎn)單。由于報(bào)表的記錄源就是"存書(shū)查詢",所以在查詢里設(shè)計(jì)的條件會(huì)直接在報(bào)表里體現(xiàn)出來(lái)。我們只要用按鈕向?qū)е谱饕粋€(gè)預(yù)覽報(bào)表的按鈕就可以了。我們把這個(gè)按鈕放在子窗體下面的右邊。控件名稱是"cmd預(yù)覽報(bào)表"。由于完全是采用向?qū)е谱鞯?不需修改代碼,所以我就不在這里列出代碼了。導(dǎo)出EXCEL按鈕如果你覺(jué)得ACCESS的報(bào)表邊框太難看,或者你想在報(bào)表上加上一些說(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ù)宏",如下圖。這樣就不必編寫(xiě)代碼了。增加統(tǒng)計(jì)功能經(jīng)常有人需要在主窗體上顯示符合查詢條件的記錄總數(shù),以及子窗體中某一字段的合計(jì)。所以,我們也準(zhǔn)備在主窗體上增加記錄總數(shù)和單價(jià)的合計(jì)。子窗體上的設(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)行速度快,占用存少,但不能編輯更新,正適合我們的需要;主窗體上的設(shè)計(jì)①在子窗體下面的地方設(shè)計(jì)兩個(gè)文本框"計(jì)數(shù)"和"合計(jì)",把它們的標(biāo)簽改為"符合條件記錄數(shù):"和"單價(jià)合計(jì):";②"計(jì)數(shù)"文本框的控件來(lái)源=[存書(shū)查詢子窗體].[Form].[txt計(jì)數(shù)],"合計(jì)"文本框的控件來(lái)源=[存書(shū)查詢子窗體].[Form].[txt單價(jià)合計(jì)];③由于主窗體上的這兩個(gè)文本框是自動(dòng)計(jì)算的,為了區(qū)別,設(shè)置它們的是否有效=否,是否鎖定=是,背景顏色=深灰色。方法總結(jié)現(xiàn)在,整個(gè)窗體就已經(jīng)完成了。大家可以使用各種條件組合來(lái)測(cè)試一下窗體的效果。本方法優(yōu)點(diǎn)在查詢中加入條件這種方法比較簡(jiǎn)單,只要在查詢中設(shè)計(jì)好各字段的條件,那么窗體中的代碼就非常少,而且在打印報(bào)表和導(dǎo)出數(shù)據(jù)方面也很容易設(shè)計(jì),比較適合初學(xué)ACCESS的人使用。本方法缺點(diǎn)①對(duì)查詢中的數(shù)據(jù)有限制,所有設(shè)計(jì)了條件的字段中必須是每條記錄都有數(shù)據(jù)。即使你在窗體中并沒(méi)有在這個(gè)字段對(duì)應(yīng)的文本框中輸入條件。舉例來(lái)說(shuō),假設(shè)你在表"tb藏書(shū)情況"中,把[書(shū)籍編號(hào)]=16對(duì)應(yīng)的這本書(shū)的作者或單價(jià)刪掉,在"存書(shū)查詢窗體"中,即使你不輸入任何條件,[書(shū)籍編號(hào)]=16對(duì)應(yīng)的這本書(shū)你也看不見(jiàn)。②如果在某個(gè)查詢組合下,子窗體上根本沒(méi)有符合條件的記錄,則主窗體上的"記錄數(shù)"和"合計(jì)"會(huì)顯示"#錯(cuò)誤"。如果把主窗體上的"記錄數(shù)"和"合計(jì)"的控件來(lái)源改為:=IIf<IsError<[存書(shū)查詢子窗體].[Form].[txt計(jì)數(shù)]>,0,[存書(shū)查詢子窗體].[Form].[txt計(jì)數(shù)]>=IIf<IsError<[存書(shū)查詢子窗體].[Form].[txt單價(jià)合計(jì)]>,0,[存書(shū)查詢子窗體].[Form].[txt單價(jià)合計(jì)]>則不會(huì)出現(xiàn)"#錯(cuò)誤",這是我在下面地址學(xué)到的:./access/topic.asp?topic_id=8183&forum_id=44③報(bào)表不能直接打開(kāi),每次打開(kāi)報(bào)表就會(huì)跳出提示框要求輸入條件。查詢方法2:用VBA生成窗體篩選條件這種方法對(duì)應(yīng)的實(shí)例數(shù)據(jù)庫(kù)是:"常用窗體查詢2.MDB"。主窗體的控件與"常用窗體查詢1.MDB"相同,只是按鈕中的代碼都改了。子窗體則完全相同。"存書(shū)查詢"中不需要輸入任何條件。按鈕代碼設(shè)計(jì)查詢按鈕本按鈕代碼的設(shè)計(jì)思想是根據(jù)主窗體上各個(gè)條件輸入控件的值,用VBA代碼生成一個(gè)條件組合的字符串作為子窗體的窗體篩選的條件。'判斷[書(shū)名]條件是否有輸入的值IfNotIsNull<Me.書(shū)名>Then'有輸入strWhere=strWhere&"<[書(shū)名]like'*"&Me.書(shū)名&"*'>AND"EndIf&:是字符串運(yùn)算符,它和"+"不同之處在于"&"兩邊如果不是字符串表達(dá)式,它會(huì)自動(dòng)把表達(dá)式的值變成字符串,省了你轉(zhuǎn)換格式了。"<[書(shū)名]like'*":英文雙引號(hào)是VBA用來(lái)表示字符串的符號(hào),兩個(gè)雙引號(hào)中間是一個(gè)字符串。""兩個(gè)雙引號(hào)中間什么也沒(méi)有,表示一個(gè)空字符串。注意:空字符串≠NULL〔空值。所以IsNull<"">=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ǔ)句的字符串[書(shū)名]:用[]表明書(shū)名是一個(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)致出錯(cuò)。Me.書(shū)名:是"存書(shū)查詢窗體"上文本框"書(shū)名"的值。Me.書(shū)名=Me.書(shū)名.Value。Me是對(duì)代碼所在窗體的引用。如果此時(shí)"存書(shū)查詢窗體"上文本框"書(shū)名"的值是"ACCESS",那么此時(shí)strWhere的結(jié)果就是:"<[書(shū)名]like'*ACCESS*'>AND"跟查詢方法1中一樣,我們也可以改為半模糊查詢和精確查詢,代碼如下:strWhere=strWhere&"<[書(shū)名]like'"&Me.書(shū)名&"*'>AND"strWhere=strWhere&"<[書(shū)名]like'"&Me.書(shū)名&"'>AND"接著看關(guān)于[單價(jià)]的代碼:'判斷[單價(jià)]條件是否有輸入的值,由于有[單價(jià)開(kāi)始][單價(jià)截止]兩個(gè)文本框'所以要分開(kāi)來(lái)考慮IfNotIsNull<Me.單價(jià)開(kāi)始>Then'[單價(jià)開(kāi)始]有輸入strWhere=strWhere&"<[單價(jià)]>="&Me.單價(jià)開(kāi)始&">AND"EndIfIfNotIsNull<Me.單價(jià)截止>Then'[單價(jià)截止]有輸入strWhere=strWhere&"<[單價(jià)]<="&Me.單價(jià)截止&">AND"EndIf這里用">=""<="來(lái)代替"BETWEENAND",效果是一樣的,只是不需要像查詢方法1中那樣如果不填數(shù)字,會(huì)分別寫(xiě)入0和5000。再來(lái)看看關(guān)于[進(jìn)書(shū)日期]的代碼:'判斷[進(jìn)書(shū)日期]條件是否有輸入的值,由于有[進(jìn)書(shū)日期開(kāi)始][進(jìn)書(shū)日期截止]兩個(gè)文本框'所以要分開(kāi)來(lái)考慮IfNotIsNull<Me.進(jìn)書(shū)日期開(kāi)始>Then'[進(jìn)書(shū)日期開(kāi)始]有輸入strWhere=strWhere&"<[進(jìn)書(shū)日期]>=#"&Format<Me.進(jìn)書(shū)日期開(kāi)始,"yyyy-mm-dd">&"#>AND"EndIfIfNotIsNull<Me.進(jìn)書(shū)日期截止>Then'[進(jìn)書(shū)日期截止]有輸入strWhere=strWhere&"<[進(jìn)書(shū)日期]<=#"&Format<Me.進(jìn)書(shū)日期截止,"yyyy-mm-dd">&"#>AND"EndIf使用Format<Me.進(jìn)書(shū)日期開(kāi)始,"yyyy-mm-dd">,而不是直接用Me.進(jìn)書(shū)日期開(kāi)始,是因?yàn)橛袝r(shí)候直接用Me.進(jìn)書(shū)日期開(kāi)始的話,會(huì)因?yàn)橛?jì)算機(jī)日期格式設(shè)置的不同而出現(xiàn)一些奇怪的問(wèn)題。ACCESS中的日期條件一直都是比較麻煩的,不管是選擇查詢、追加查詢還是交叉表查詢,設(shè)置日期字段的條件都是要特別注意的。〔像查詢方法1中直接在查詢準(zhǔn)則中引用控件值雖然不會(huì)出現(xiàn)類似問(wèn)題,但交叉表查詢中不能使用控件作為日期字段的條件。'先在立即窗口顯示一下strWhere的值,代碼調(diào)試完成后可以取消下一句Debug.PrintstrWhereDebug.Print:是專門(mén)用于調(diào)試的語(yǔ)句,它會(huì)把后面表達(dá)式的值顯示在VB編輯器的立即窗口里。在適當(dāng)?shù)氐胤讲迦隓ebug.Print可以檢查程序運(yùn)行的是否正確。等全部調(diào)試結(jié)束后,可以把他們都刪掉。'讓子窗體應(yīng)用窗體查詢Me.存書(shū)查詢子窗體.Form.Filter=strWhereMe.存書(shū)查詢子窗體.Form.FilterOn=True主窗體或單一窗體設(shè)置篩選字符串時(shí)用:Me.Filter="…"或是Forms![XX窗體].Filter="…"。'在子窗體篩選后要運(yùn)行一下自編子程序CheckSubformCount<>CallCheckSubformCountCheckSubformCount是一個(gè)自編的子程序,CALL是調(diào)用子程序的語(yǔ)句,也可以不寫(xiě)CALL直接用CheckSubformCount調(diào)用子程序。清除按鈕代碼里都有說(shuō)明,只講以下的一段代碼:ForEachctlInMe.Controls'根據(jù)ctl的控件類型來(lái)選擇SelectCasectl.ControlTypeCaseacTextBox'是文本框,要清空<注意,子窗體下面還有兩個(gè)鎖定的文本框不能賦值>Ifctl.Locked=FalseThenctl.Value=NullCaseacComboBox'是組合框,也要清空ctl.Value=Null'其它類型的控件不處理EndSelectNextForEachctlInMe.Controls:意思是把當(dāng)前窗體所有的控件都逐個(gè)引用一次〔子窗體控件的控件不算在。這種用"ForEach[對(duì)象或?qū)傩註In[對(duì)象集合或?qū)傩约蟏"的遍歷方法在ACCESS編程中屬于比較常見(jiàn)的用法,用處也很多。比如最常見(jiàn)的檢查窗體是否打開(kāi)的代碼中也有:FunctionIsLoaded<strFrmNameAsString>AsBoolean'確定一個(gè)窗體是否已被裝載。ConstconFormDesign=0DimobjFormAsFormIsLoaded=FalseForEachobjFormInFormsIfobjForm.FormName=strFrmNameThenIfobjForm.CurrentView<>conFormDesignThen'窗體不是設(shè)計(jì)模式時(shí)IsLoaded=TrueExitFunction'一旦找到了此窗體,就退出本函數(shù)。EndIfEndIfNextEndFunction預(yù)覽報(bào)表按鈕預(yù)覽報(bào)表按鈕中關(guān)鍵是如下語(yǔ)句:strWhere=Me.存書(shū)查詢子窗體.Form.Filter'在打開(kāi)報(bào)表的同時(shí)把子窗體的篩選條件字符串也傳遞給報(bào)表,'這樣地話報(bào)表也會(huì)顯示和子窗體相同的記錄。DoCmd.OpenReportstDocName,acPreview,,strWhere在我曾經(jīng)制作的另一個(gè)例子:"打印當(dāng)前記錄的例子"里也使用過(guò)類似的方法。這個(gè)例子可以在.accxp./club/topic.cgi?forum=2&topic=6281下載。關(guān)于DoCmd.OpenReport的詳細(xì)幫助,可以在VBA幫助里找到。導(dǎo)出按鈕導(dǎo)出方法只能把表或者查詢的容導(dǎo)出到EXCEL,但是不能把窗體上的記錄集〔RECORDSET導(dǎo)出。所以我們要把子窗體的容轉(zhuǎn)變?yōu)橐粋€(gè)查詢。我在查詢中增加了一個(gè)"查詢結(jié)果",其中的設(shè)計(jì)隨便就行,因?yàn)槊看卧谑褂眠@個(gè)查詢之前,我們都會(huì)用DAO修改查詢的SQL語(yǔ)句。思路很簡(jiǎn)單,如果子窗體的篩選條件字符串是:<[類別]Like'書(shū)籍'>AND<[單價(jià)]>=20>那么,我們把"查詢結(jié)果"的SQL語(yǔ)句改為:SELECT*FROM存書(shū)查詢WHERE<[類別]Like'書(shū)籍'>AND<[單價(jià)]>=20>這樣的話,"查詢結(jié)果"的記錄與子窗體里的記錄就是相同的。對(duì)應(yīng)的代碼如下:strWhere=Me.存書(shū)查詢子窗體.Form.FilterIfstrWhere=""Then'沒(méi)有條件strSQL="SELECT*FROM[存書(shū)查詢]"Else'有條件strSQL="SELECT*FROM[存書(shū)查詢]WHERE"&strWhereEndIf這一部分用來(lái)準(zhǔn)備查詢的SQL語(yǔ)句。Setqdf=CurrentDb.QueryDefs<"查詢結(jié)果">qdf.SQL=strSQLqdf.CloseSetqdf=Nothing這一部分用來(lái)把做好的SQL語(yǔ)句放在查詢中。DoCmd.OutputToacOutputQuery,"查詢結(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.OutputToacOutputQuery,"查詢結(jié)果",acFormatXLS,strOutputFileName,True如果你想在文件名上保留時(shí)間,以便知道是什么時(shí)候做的查詢,可以改為:strOutputFileName=CurrentProject.Path&"\查詢結(jié)果-"&_Format<Date<>,"yyyymmdd">&".xls"DoCmd.OutputToacOutputQuery,"查詢結(jié)果",acFormatXLS,strOutputFileName,True_:英文下劃線表明下一行和本行是同一條語(yǔ)句,在語(yǔ)句比較長(zhǎng)時(shí),為了便于閱讀,可以用這種方法把每行變短一些。下劃線之前要有一個(gè)空格作分隔,不然可能會(huì)被當(dāng)作字段名的一部分。CheckSubformCount子程序這段子程序的目的在代碼中已經(jīng)解釋了。目前實(shí)例數(shù)據(jù)庫(kù)中的代碼中是用代碼設(shè)置文本框的"控件來(lái)源"。也可以直接用代碼設(shè)置控件的值〔前提條件是在窗體的設(shè)計(jì)視圖中,把兩個(gè)文本框的控件來(lái)源都刪掉,使控件變成未綁定。此外,我再加幾句代碼,當(dāng)子窗體無(wú)記錄時(shí),下面的導(dǎo)出和預(yù)覽按鈕都變成灰色。這樣的軟件顯得更專業(yè)一些。代碼如下:IfMe.存書(shū)查詢子窗體.Form.Recordset.RecordCount>0Then'子窗體的記錄數(shù)>0Me.計(jì)數(shù)=Me.[存書(shū)查詢子窗體].[Form].[txt計(jì)數(shù)]Me.合計(jì)=Me.[存書(shū)查詢子窗體].[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=FalseEndIf方法總結(jié)使用VBA來(lái)設(shè)置子窗體篩選條件的方法解決了方法1中的幾個(gè)缺點(diǎn),大家可以逐一測(cè)試。但是編寫(xiě)這樣的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ù)庫(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)源",同時(shí)還要控制沒(méi)有字段可以顯示的那些列要隱藏,然后再顯示出來(lái)。但這樣設(shè)計(jì)要求編寫(xiě)比較多的代碼,只適合比較熟悉VBA的人使用。〔我在這個(gè)例子的報(bào)表中設(shè)計(jì)了類似的代碼,可以參考。按鈕設(shè)計(jì)查詢按鈕先看一下沒(méi)有條件的交叉表查詢的SQL語(yǔ)句:TRANSFORMSum<存書(shū)查詢.單價(jià)>AS單價(jià)之SumSELECT存書(shū)查詢.類別FROM存書(shū)查詢GROUPBY存書(shū)查詢.類別PIVOTFormat<[進(jìn)書(shū)日期],"yyyy/mm">;

溫馨提示

  • 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)論