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

下載本文檔

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

文檔簡介

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

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

3、C5.0教程書籍SteveBrown電子工業(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ā)實例導(dǎo)航書籍桂思強中國鐵道¥25.002003-3-1030中國名陵集中華古代名陵之大成書籍羅哲文等百花文藝¥14.002003-5-2031邊緣部落福音谷書籍林茨(撰文攝影)河北教育¥27.002003-5-20為了比較有代表性,這個查詢中包含多種字段類型:數(shù)字類型:【書籍編

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

32、Boolean ' 確定一個窗體是否已被裝載。 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è)計模式時 IsLoaded = True Exit Function ' 一旦找到了此窗體,就退出本函數(shù)。 End If End If NextEnd Functi

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論