ACCESS窗体查询实例.docx

上传人:李司机 文档编号:7209876 上传时间:2024-06-29 格式:DOCX 页数:20 大小:83.68KB
返回 下载 相关 举报
ACCESS窗体查询实例.docx_第1页
第1页 / 共20页
ACCESS窗体查询实例.docx_第2页
第2页 / 共20页
ACCESS窗体查询实例.docx_第3页
第3页 / 共20页
ACCESS窗体查询实例.docx_第4页
第4页 / 共20页
ACCESS窗体查询实例.docx_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《ACCESS窗体查询实例.docx》由会员分享,可在线阅读,更多相关《ACCESS窗体查询实例.docx(20页珍藏版)》请在三一办公上搜索。

1、书目一 .概述2二 .制作主/子窗体的步骤41 .利用向导制作主窗体42 .利用向导设计子窗体5三 .查询方法1:在查询中加入条件61 .设计查询62 .设计按钮及代码82.1查询按钮82.2清除按钮92.3打印按钮92.4导出EXCE1.按钮93 .增加统计功能101 .1子窗体上的设计103 .2主窗体上的设计104 .方法总结104. 1本方法优点105. 2本方法缺点10四 .查询方法2:用VBA生成窗体筛选条件121 .按钮代码设计121. 1查询按钮122. 2清除按钮143. 3预览报表按钮154. 4导出按钮165. 5CheckSubformCount子程序172 .方法总结

2、17五 .主子窗体交叉表查询实例181 .按钮设计181. 1查询按钮182 .报表设计193 .方法总结20.概述作为数据管理程序,统计和查询功能是特别重要的。否则,就和电子表格没有区分了。所以,在每个ACCESS程序中都不行能缺少查询的功能。本文的目的是由浅入深的介绍几种最常用的利用主/子窗体来实现查询的方法,使初学者和有确定VBA基础的人可以更好的运用窗体查询这种手段。附件中的窗体“常用窗体查询O.MDB”,仅包含3个数据表、1个查询和以这个查询为数据源的报表。是为了大家依据后面学习的内容作练习用的。我们先看查询中的数据:书籍编号书名类别作者出版社单价进书日期22CHIP-O1-08报刊

3、电子计算机及外部设备期刊社电子计算机及外部设备16.802019-9-2825电脑新时代-6光盘光盘UNKNOWN电脑新时代5.002019-7-827学电脑-7光盘光盘UNKNOWN人民邮电5.002019-7-1328CHIP-02-07盘光盘电子计算机及外部设备杂志社电子计算机及外部设备5.002019-7-1316MCSE学习指南书籍SyngressMedia公司人民邮电62.002019-9-2817局域网原理及架设技术内幕大公开书籍蔡昌均中国青年69.002019-9-2819AccessVBA基础籍EvanCallahan人民邮电39.002019-9-2820中文版Access

4、2019一册通书籍赵琳等人民邮电42.002019-9-2821VISUA1.BASIC5.O教程书籍SteveBrown电子工业28.002019-9-2823中文版VisualBasicS.0程序员指南书籍Iiiicrosoft中国青年70.002019-9-2824Access中文版开发指南书籍AIisonBalter人民邮电128.002019-2-1629Access2019数据库系统开发实例导航书籍桂思强中国铁道25.002019-3-1030中国名陵一一集中华古代名陵之大成书籍罗哲文等百花文艺14.002019-5-2031边缘部落一一福音谷书籍林茨(撰文摄影)河北教化27.00

5、2019-5-20为了比较有代表性,这个查询中包含多种字段类型:数字类型:【书籍编号】、【单价】字符类型:【书名】、【类别】、【作者】、【出版社】日期类型:【进书日期】在多条件查询中,我们会运用除了【书籍编号】之外的其他字段作为查询条件。其实,在下面介绍的窗体查询方法中,有些代码或思路也可以应用在其它窗体查询方法中,你对各种代码、方法和思路越娴熟,就越能充分发挥它们的作用。这篇文章我是从4月初起先构思,到5月中旬起先动笔,花费两周时间写成,里面包含了我对ACCESS窗体查询所积累的阅历,对初学者和有确定VBA基础的人都有针对性的方法。另外,希望其他精通ACCESS的高手提出看法。一制作主/子窗

6、体的步骤1 .利用向导制作主窗体现在的主窗体还太小,要已经以下步骤才能变成我们须要的主窗体(如下图):把窗风光积放大到足以容纳条件输入字段和子窗体,并调整全部控件的字体;把窗体的“记录源”和各控件的“数据来源”都删除(许多初学者很简洁犯的错误就是这里),把类别和出版社改为组合框(因为这些字段的可能值比较少,干脆选择就好,不必让用户输入);更新调整各字段的位置,并增加了两个空文本框和标签放在单价和进书日期后面(因为我准备运用一个范围来作查询条件,而不是一个固定的值,这样比较符合实际;单价后面的两个文本框改名为“单价起先”和“单价截止”,进书日期后面的两个文本框改名为“进书日期起先”和“进书日期截

7、止”;画一个矩形框包居处有查询条件,把矩形框背景设置为常规,背景色为深灰色,特殊样式为凹陷,此时矩形框覆盖了其它控件,要用菜单中“格式”一“置于底层”才能让它们显示出来;在窗体上用向导建立一个按钮,按钮标题是查询,名称是“cmd查询”先不管里面的代码,后面再修改:窗体屈性中“记录选定器”=否,“阅读按钮”=否。2 .利用向导设计子窗体在主窗体中用工具箱中的“子窗体/子报表”对象建立一个子窗体;以存竹查询为记录源,选择全部字段;把子窗体命名为“存书查询子窗体”;在主窗体上删除子窗体的标签,并重新调整子窗体的大小:关闭主窗体的设计视图,单独打开子窗体数据表视图,调整字体和行的大小。现在,我们得到了

8、如下的窗体:现在还没有实际的查询功能,我们在后面要依据所运用的方法,修改窗体并增加一些其他的功能。还有一些小的细微环节要留意,比如:按TAB健后的获得光标的控件的依次要在设计视图下,视图菜单的“TAB键次序”来修改;有些文本框获得焦点后是否要打开输入法,比如输入单价和日期的地方要关闭,输入书名和作者的地方要打开,这些要在控件屈性中设置。.查询方法i:在查询中加入条件这种方法对应的实例数据库是:“常用窗体查询.MI)B,1 .设计查询我们打开“存书查询”设计视图如下:在字段【书名】的准则格内写入:1.ikeIIf(ISNUu(Forms!存书查询窗体!书名&Forms!存书查询窗体!书名&*)加

9、入后的设计视图如下:把这个式子说明一下:1.IKEx是特地用于查询字符型字段的运算符,一般介绍AeCESS的书中都有它的用法。ISNU1.1.(Forms!存书查询窗体!书名)、是用来推断窗体”存书查询窗体”上面的“书名”这个文本框是否是空的。假如文本框是空的,则:ISNU1.1.(Forms!存书查询窗体!书名1.=TRUE(真)假如文本框不是空的,贝小ISNU1.1.(Forms!存书查询窗体!书名D=FA1.SE(假)IIF(EXPR,TRUEPARTtFA1.SEPART)函数、EXPR必要参数。用来推断真伪的表达式。TRUEPART必要参数。假如EXPR为TRUE,则返回这部分的值或

10、表达式。FA1.SEPART必要参数。假如EXPR为FA1.SE,则返回这部分的值或表达式。所以当我们在窗体“存书查询窗体”上面的“书名”里写上“ACCESS,整个式子的结果是:1.IKE*ACCESS*相当于查询全部书名中包含“ACCESS”的书籍,这样可以实现模糊查询。1.ikeIIf(ISNUlI(Forms!存书查询窗体!书名),*,Forms!存书查询窗体!书名&*)1.ikeIlf(lsNulI(Forms!存书查询窗体!书名),*,Forms!存书查询窗体!书名)假如把准则改为上面两句中的句,同样状况下当我们在窗体“存书查询窗体”上面的“书名”里写上“ACCESS”,整个式子的结

11、果是:1.IKEACCESS*1.IKEACCESS相当于查询以“ACCESS”开头的书籍(半模糊查询),或者书名就叫“ACCESS”的书(精确查询)。具体运用那一种形式的查询要依据你的实际状况来修改。当我们在窗体”存书查询窗体”上面的“书名”里什么也没有写,整个式子的结果是:1.IKE*相当于查询全部的有书名的书。在书写查询准则时,Forms!存书查询窗体!书名这样的窗体控件名很难写,这时你可以在准则格内点鼠标右键,选择生成器,出现如下图的窗:在左边的树型列表框里找到控件所在的窗体,在中间列表框出现这个窗体包含的全部控件,双击控件名,就会出现“Forms!存书查询窗体!书名”。我们再把其他几

12、个字段的查询准则写出:【类别】:在窗体上是组合框,所以它确定是个精确查询,跟【书名】一样,它是文本字段。查询准则如下:.ikeIIf(IsNull(Forms!存书查询窗体!类别Forms!存书查询窗体!类别D【作者】:跟【书名】一样,它是文本字段。我也准备用模糊查询。查询准则如下:1.ikeIlf(ISNUU(Forms!存书查询窗体!作者&Forms!存书查询窗体!作者&*)【出版社】:跟【类别】的状况完全一样。查询准则如下:1.ike11f(IsNull(Forms!存书查询窗体!出版社),*,Forms!存书查询窗体!出版社)【单价】:是一个数字字段,我在这里准备让用户可以查询“1.5

13、元6.5元”这样的范围。查询准则如下:BetweenIIf(IsNull(Forms!存书查询窗体!单价起先),0,Forms!存书查询窗体!单价起先)AndIIfdsNull(Forms!存书查询窗体!单价截止),5000,Forms!存书查询窗体!单价截止)BETlfEENANlh是查询符合某个范围之内的值所需的条件格式。“BETWEEN1AND5”相当于字段】1AND【字段】W5”。依据前面讲解的IlF的内容,我用一个表格来说明一下各种状况下这个式子的实际结果,便于大家理解:(0和5000是我事先在条件中设定的最小值和最大值)单价起先的值单价截止的值整个式子的实际结果空空BETWEEN0

14、AND50001.5空BETWEEN1.5AND5000空20BETWEEN0AND201.56.5BETWEEN1.5ND6.5【进书日期】:是一个Fl期型字段,我在这里准备让用户可以查询“#2019-5T#2019-5T#”这样的范围。查询准则如下:Between(Ilf(IsNul1(Forms!存书查询窗体!进书日期起先),#2000TT#,Forms!存书查询窗体!进书日期起先D)And(IIfdsNull(Forms!存书查询窗体!进书日期截止),#2099-12-31#,Forms!存书查询窗体!进书日期截止)在这个式子中,#20007-1#和#2099-12-31#是我设定的两

15、个默认的起先和截止Fl期。假如用户不输入,就运用默认值了。这和前面【单价】的状况是一样的。2 .设计按钮及代码2.1 查询按钮查询按钮的代码特别简洁,关键部分只有一句:PrivateSubCmd查询/1ick()Me.存书查询子窗体.Requery这句是关键EndSub在如琢必是用来重新查询控件的数据源,这样可以刷新子窗体显示的记录。对于记录源是表或查询的控件如窗体、列表框、组合框等常常用Requery方法来刷新显示内容。2.2 清除按钮有了查询按钮的代码之后,大家就可以自己测试查询的效果了。不过,每次想换一个查询的条件时要清除上一个条件输入的东西,有时候比较麻烦。我们再来设计一个清除条件的按

16、钮,控件名称是“cmd清除”,放在查询按钮的下面。按钮的代码如下:PrivateSubCmd清除_Click()下面这些控件的相要清空Me.书名=NullMe.类别=NullMe.作者=NullMe.出版社=NullMe.单价起先=NullMe.单价截止=NullMe.进书日期起先=NullMe.进书日期截止=NullMe.存书查询子窗体.Requery清空之后一样要重新查询EndSub2.3 打印按钮有了查询结果,想打印出来,很简洁。由于报表的记录源就是“存书查询”,所以在查询里设计的条件会干脆在报表里体现出来。我们只要用按钮向导制作一个预览报表的按钮就可以了。我们把这个按钮放在子窗体下面的

17、右边。控件名称是“cmd预览报表:由于完全是采纳向导制作的,不需修改代码,所以我就不在这里列出代码了。2.4 导出EXCE1.按钮假如你觉得ACCESS的报表边框太难看,或者你想在报表上加上一些说明什么的。你可能更情愿把数据导出到EXCE1.里进行再加工。为了初学者简洁理解,我准备用个宏来解决这个问题。宏的设计如下图:现在,宏里“输出文件”为空,运行时会自动跳出对话框让你选择保存不目和文件名。假如你想保存在数据库所在书目下的“查询结果.xls”里,可以在“输出文件”一栏里填入:=currentproject,path&.xls,z把这个宏存为导出查询数据宏”。然后再在窗体里加入按钮。当按钮向导

18、出现后,F脆取消。在按钮的属性页里,先把按钮名称改为cmd导出”,在按钮的“单击事务”里F脆用下拉框选择“导出查询数据宏”,如下图。这样就不必编写代码了。3 .增加统计功能常常有人须要在主窗体上显示符合查询条件的记录总数,以及子窗体中某一字段的合计。所以,我们也准备在主窗体上增加记录总数和单价的合计。3.1 子窗体上的设计单独打开子窗体的设计模式,在窗体页脚部分拉出一段窗体;在上面增加两个文本框:一个是“txt计数”,控件来源=COUnt(*),另一个是“txt单价合计”,控件来源=SUm(单价);在子窗体的窗体属性中设置:阅读按钮=否,记录集类型=快照(快照的运行速度快,占用内存少,但不能编

19、辑更新,正适合我们的须要);3.2 主窗体上的设计在子窗体下面的地方设计两个文本框“计数”和“合计”,把它们的标签改为“符合条件记录数:”和“单价合计:”;“计数”文本框的控件来源=存书查询子窗体.Form,txt计数,“合计”文本框的控件来源=存书查询了窗体Form,txt单价合计;由于主窗体上的这两个文本框是自动计算的,为了区分,设置它们的是否有效=否,是否锁定=是,背景颜色=深灰色。4 .方法总结现在,整个窗体就已经完成了。大家可以运用各种条件组合来测试一下窗体的效果。4.1 本方法优点在查询中加入条件这种方法比较简洁,只要在查询中设计好各字段的条件,那么窗体中的代码就特别少,而且在打印

20、报表和导出数据方面也很简洁设计,比较适合初学ACCESS的人运用。4.2 本方法缺点对查询中的数据有限制,全部设计了条件的字段中必需是每条记录都有数据。即使你在窗体中并没有在这个字段对应的文本框中输入条件。举例来说,假设你在表“tb藏书状况”中,把【书籍编号】=16对应的这本书的作者或单价删掉,在“存书查询窗体”中,即使你不输入任何条件,【书籍编号】=16对应的这本书你也看不见。假如在某个查询组合1.子窗体上根本没有符合条件的记录,则主窗体上的“记录数”和“合计”会显示“#错误”。假如把主窗体上的“记录数”和“合计”的控件来源改为:=IIf(ISEITor(存书查询子窗体.Form,txt计数

21、),0,存书查询子窗体.Form,txt计数)=Hf(ISErrOr(存书查询子窗体.Form,txt单价合计),O,存书查询子窗体.Form,txt单价合计)则不会出现“#错误”,这是我在下面地址学到的:报表不能干脆打开,每次打开报表就会跳出提示框要求输入条件。U!查询方法2:用VBA生成窗体筛选条件这种方法对应的实例数据库是:“常用窗体查询2.MI)B,主窗体的控件及“常用窗体查询1.MDIr相同,只是按钮中的代码都改了。子窗体则完全相同。“存书查询”中不须要输入任何条件1 .按钮代码设计1.1 查询按钮本按钮代码的设计思想是依据主窗体上各个条件输入控件的值,用VBA代码生成一个条件组合的

22、字符串作为子窗体的窗体筛选的条件。推断【书名】条件是否有输入的值IfNotIsNulKMe.书名)Then有输入StrWhere=StrWhere&1ike*&Me.书名&)ANDEndIfM是字符串链接运算符,它和“+”不同之处在于两边假如不是字符串表达式,它会自动把表达式的值变成字符串,省了你转换格式了。F书名1.IKE*:英文双引号是VBA用来表示字符串的符号,两个双引号中间是一个字符串。”两个双引号中间什么也没有,表示一个空字符串。留意:空字符串HNIJ1.1.(空值)。所以ISNUuC)=False.rACCESS。英文单引号是SQ1.语句中用来表示字符串的符号,两个单引号中间是一个

23、字符串。(SQ1.语句中也可以运用双引号来表示字符串,但在VBA代码生成SQ1.语句时,为了筒化格式,一律用单引号表示SQ1.语句内的字符串)/声名入用口表明书名是一个字段名、表名或查询名。运用口的作用:可以明确中间是一个名字而不是函数:当字段名、表名或查询名是ACCESS或VBA保留字(如:DATE、NOTE、TYPEoF等)时,确定要用口来标明;当字段名、表名或查询名中包含特殊字符(如停止/截止日期、查询-合计等)时,确定要用口来标明,否则特殊字符会被当作算术运算符而导致出错。ME.书名:是“存书查询窗体”上文本框“书名”的值。Me.书名=Me.书名.Value。Me是对代码所在窗体的引用

24、。假如此时“存书查询窗体”上文本框“书名”的值是ACCESS”,那么此时StrWhere的结果就是:|”(书名Iike*ACCESS*)AND”跟杳询方法I中一样,我们也可以改为半模糊查询和精确杳询,代码如下:StrWhere=StrWhere&”(书名like&Me.书名&*)ANDStrWhere=StrWhere&”(书名like,*&Me.书名&)AND接着看关于【单价】的代码:-推断【单价】条件是否有输入的值,由于有【单价起先】【单价截止】两个文本框所以要分开来考虑IfNotISNUu(Me.单价起先)Then【单价起先】有输入StrWhere=StrWhere&”(单价=&Me.单

25、价起先&)ANDEndIfIfNotISNUII(Me.单价截止)Then【单价截止】有输入StrWhere=StrWhere&”(单价=&Me.单价截止&)ANDEndIf这里用“=“=”来代替“BETWEENAND,效果是一样的,只是不须要像查询方法1中那样假如不填数字,会分别写入0和500()0再来看看关于【进书日期】的代码:推断【进书日期】条件是否有输入的值,由于有【进书日期起先】【进书日期截止】两个文本框所以要分开来考虑IfNotISNUlI(Me.进书日期起先)Then【进书日期起先】有输入StrWhere=StrWhere&”(进书日期=M&Format(Me.进书Fl期起先,y

26、yyy-mm-dd)&#)AND”EndIfIfNotISNUH(Me.进书日期截止)Then【进书日期截止】有输入StrWhere=StrWhere&(进书日期=#&FOrmat(Me.进书日期截止,yyyy-mm-dd)&#)AND”EndIf运用Format(Me.进书日期起先,yyyy-11m-dd),而不是干脆用Me.进书日期起先,是因为有时候干脆用Me.进书Fl期起先的话,会因为计算机日期格式设置的不同而出现一些惊奇的问题。ACCESS中的日期条件始终都是比较麻烦的,不管是选择查询、追加查询还是交叉表查询,设置日期字段的条件都是要特殊留意的。(像查询方法I中干脆在查询准则中引用控件

27、值虽然不会出现类似问题,但交叉表查询中不能运用控件作为日期字段的条件。)先在马上窗口显示一下StrNhere的值,代码调试完成后可以取消下一句Debug.PrintStrWhereDEBUG.PRINT:是特地用于调试的语句,它会把后面表达式,的值显示在VB编辑器的马上窗口里。在适当地地方插入DebUg.Print可以检查程序运行的是否正确。等全部调试结束后,可以把他们都删掉。-让子窗体应用窗体查询Me.存书查询子窗体.Form.Filter=StrWhereMe.存书查询子窗体.Form.FilterOn=True主窗体或单一窗体设置筛选字符串时用:Me.FiIter=或是FonnS!XX窗

28、体.Filter=。在子窗体筛选后要运行一下自编子程序CheCkSUbfOrmCOUnt()CallCheckSubformCountCheckSubformCount是一个自编的子程序,CA1.1.是调用子程序的语句,也可以不写CA1.1.干脆用CheCkSUbfOrmCoUnt调用子程序。1.2 清除按钮代码里都有说明,只讲以下的一段代码:ForEachctlInMe.Controls依据Ctl的控件类型来选择SelectCasectl.ControlTypeCaSeaCTeXtBOX是文本框,要清空(留意,子窗体下面还有两个锁定的文本框不能赋值)Ifctl.1.ocked=FalseTh

29、enctl.Value=NullCaseacComboBox是组合框,也要清空ctl.Value=Null其它类型的控件不处理EndSelectNextFOREAaiCT1.INltE.C碗Ro1.S:意思是把当前窗体内全部的控件都逐个引用一次(子窗体控件内的控件不算在内)。这种用“ForEach对象或属性In对象集合或属性集合”的遍历方法在ACCESS编程中属于比较常见的用法,用处也许多。比如最常见的检查窗体是否打开的代码中也有:FunctionIs1.oaded(strFrmNaneAsString)AsBoolean确定一个窗体是否已被装载。ConstConFormDesign=0Dim

30、objEormAsEormIs1.oaded=FalseForEachobjFormInFormsIfobjForm.FormName=StrFrmNameThenIfObjEomCurrentViewOConFormDesignThen窗体不是设计模式时Is1.oaded=TrueExitFunction一旦找到了此窗体,就退出本函数。EndIfEndIfNextEndFunction1.3 预览报表按钮预览报表按钮中关键是如下语句:StrWhere=Me.存书查询子窗体.Form.Filter在打开报表的同时把子窗体的筛选条件字符串也传递给报表,这样地话报表也会显示和子窗体相同的记录。Do

31、Cmd.OpenReportStDocName,acPreview,StrWhere在我曾经制作的另一个例子:“打印当前记录的例子”里也运用过类似的方法。这个例子可以在下载。关于DoCmd.OpenReport的具体帮助,可以在VB帮助里找到。1.4 导出按钮导出方法只能把表或者查询的内容导出到EXCE1.,但是不能把窗体上的记录集(RECORDSET)导出。所以我们要把了窗体的内容转变为个查询。我在查询中增加了个“查询结果”,其中的设计随意就行,因为每次在运用这个查询之前,我们都会用DAO修改查询的SQ1.语句。思路很简洁,假如子窗体的筛选条件字符串是:(类别1.ike书籍)AND(单价=2

32、0)那么,我们把“查询结果”的SQ1.语句改为:SE1.ECT*FROM存书查询WHERE(类别1.ike书籍)AND(单价=20)这样的话,“查询结果”的记录及子窗体里的记录就是相同的。对应的代码如下:StrWhere=Me.存书查询子窗体.Form.FilterIfStrWhere=Then没有条件StrSQ1.=*SE1.ECT*FROM存书查询”Else有条件StrSQ1.=SE1.ECT*EROM存书查询WHERE&StrWhereEndIf这一部分用来准备查询的SQ1.语句。Setqdf=CurrentDb.QUeryDefS(查询结果”)qdf.SQ1.=qdf.CloseStr

33、SQ1.SetqdfNothing这一部分用来把做好的SQ1.语句放在查询中。DoCmd.0UtPUtToaCoUIPUtQUery,查询结果,acFonnatX1.S,True这一部分的作用,和查询方法1中的“导出查询数据宏”的作用相同。运行时会自动跳出对话框让你选择保存仿目和文件名。假如你想保存在数据库所在书目下的“查询结果.xls”里,可以把这一句改为:StrOutput&查询结果.xls”DoCmd.OutputToacOutputQuery,“查询结果,acFormatX1.S,StrOutput,True假如你想在文件名上保留时间,以便知道是什么时候做的查询,可以改为:StrOut

34、put&查询结果_Format(DateO,*yyyymmdc)&.xlsDoCmd.OutputToacOutputQuery,查询结果,acFormatX1.S,StrOutput,True英文下划线表明卜.一行和本行是同一条语句,在语句比较长时,为了便于阅读,可以用这种方法把每行变短一些。下划线之前要有一个空格作分隔,不然可能会被当作字段名的一部分。1.5 CheckSubfonnCount子程序这段子程序的目的在代码中已经说明了。目前实例数据库中的代码中是用代码设置文本框的“控件来源”。也可以干脆用代码设置控件的值(前提条件是在窗体的设计视图中,把两个文本框的控件来源都删掉,使控件变成

35、未绑定)。此外,我再加几句代码,当子窗体无记录时,卜面的导出和预览按钮都变成灰色。这样的软件显得更专业一些。代码如下:IfMe.存书查询子窗体.Form.Recordset.RecordCount0Then子窗体的记录数0Me.计数=Me.存书查询子窗体.Form,txt计数Me.合计=Me.存书查询子窗体.Form,txt单价合计Med导出.Enabled=TrueMed预览报表.Enabled=TrueElse子窗体的记录数=0Me.计数=0Me.合计=0Med导出.Enabled=FalseMed预览报表.Enabled=FalseEndIf2 .方法总结运用VBA来设置子窗体筛选条件的

36、方法解决了方法1中的几个缺点,大家可以逐一测试。但是编写这样的VBA代码须要对VBA比较熟识,而且要求对逻辑运算有确定基础,不然在运用逻辑运算符AND/OR/NOT和括号组合时会出错。不太适合初学者运用。五.主子窗体交叉表查询实例这种方法对应的实例数据库是:“常用窗体查询3.Ml)r交叉表查询通常作为统计之用,所以查询条件少了一些。一般学习ACCESS的人,都有可能会被ACCESS的向导误导,以为子窗体控件里面确定要放一个子窗体。其实不是,在我的这个例子里,子窗体的对象其实就是交叉查询,如下图。始终有人问,对于交叉表这样字段数量不固定的,怎样在子窗体中显示。其实,干脆在子窗体里显示交叉表木身是

37、最简洁的方法。另种方法是事先设计个包含许多未绑定字段文本框的数据表窗体,在显示之前,先用VBA设置窗体的“记录源”和各文本框的“控件来源”,同时还要限制没有字段可以显示的那些列要隐藏,然后再显示出来。但这样设计要求编写比较多的代码,只适合比较熟识VBA的人运用。(我在这个例子的报表中设计了类似的代码,可以参考。)1 .按钮设计1.1 查询按钮先看一下没有条件的交叉表查询的SQ1.语句:TRANSFoRMSUm(存书查询.单价)AS单价之SUInSE1.ECT存书查询.类别FROM存书查询GROUPBY存书查询.类别PIVOTFOrmat(进书日期,yyyy/mm);再看一下设置了条件的交叉表查

38、询的SQ1.语句:TRANSFoRMSUm(存书查询.单价)AS单价之SUnlSE1.ECT存书查询.类别FROM存书查询WHERE(存书查询.单价)=5)GROUPBY存书查询.类别PV()TFormat(进书日期,“yyyyInnr);可见,WHERE是被插在中间的,所以我在生成SQ1.语句时要用如下代码:IStrSQ1.=TRANSFORMSUnl(存书查询.单价)AS单价之SUinSE1.ECT存书|查询.类别FROM存书查询”strSQ1.=strSQ1.&WHERE(&StrWherestrSQ1.=strSQ1.&*)GROUPBY存书查询.类别PlVOTFormat(进书日期,

39、yyyy三),留意,在字符串中间要留一些空格,比如卜ROM存巾查询”的后面,假如不留,SQ1.语句中“存书查询”和州HERE”会连在起。这样确定是错的。显示交叉表的内容,不能干脆刷新Me.存书查询子窗体.SourceObject=Me.存书查询子窗体.SourceObject=查询.存竹查询_交叉表”这里也是一些人简洁犯错的地方。因为子窗体里是查询对象,用Me.存书查询子窗体.Requery这样的语句是不能更新显示内容的。而要用SOUrCeObjeCt才能更新。假如子窗体对象是窗体,而你又用DAO变更了作为子窗体记录源的查询的SQ1.语句,也要用这种方法来更新显示内容。刷新计数和合计显示Me.

40、计数=I)CoUnt”存巾查询一交叉表”)Me.合计=DSUIn(单价“存书查询,StrNhere)由于子窗体对象不是窗体了,自然就没有什么窗体页脚来让你设计合计字段。所以用只好用DCoUnt和DSUIn来统计了。其他按钮的代码都有注释,我就不特地讲了。2 .报表设计为了适应交叉表杳询列数不固定的状况,我在页面页眉、主体、报表页脚都设计了一些名称有规律的标签、文本框。-打开查询Setrst=CurrentDb.OpenRecordsetCrSE1.ECT*FROM存书查询交叉表WHERE1=2)记录字段总数可能大家对“WHERE1=2”这个条件比较迷惑,其实这是为了让这个rst没有任何记录,因

41、为我们须要的不是记录,只是各个字段的名字。这样也可以少占用一些内存。其他代码已经有注释了,我就不在这里说明。3.方法总结在子窗体中干脆运用交叉表作为子窗体源对象是最简洁的方法。交叉表查询中,日期类型的字段不能引用窗体上的控件作为准则。例如:BCtWeenFORMS!存书查询窗体!进书日期起先AndFORMS!存书查询窗体!进书日期截止ACCESS会报告错误,但是可以用确定的日期常数作为条件,例如:Between#2019-1-1#And2019-12-31#所以要用DAO的方法来修改交叉表查询的SQ1.语句。以交叉表制作的报表,由于字段数不确定,所以设计起来太麻烦,好用性不强。最好是把交叉表数据导出到EXCE1.里再进行处理。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号