版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一.概述作为数据管理程序,统计和查询功能是非常重要的。否则,就和电子表格没有 区别了。所以,在每个 ACCESS程序中都不可能缺少查询的功能。本文的目的是由浅入深的介绍几种最常用的利用主 /子窗体来实现查询的方法, 使初学者和有一定VBA基础的人可以更好的使用窗体查询这种手段。附件中的窗体“常用窗体查询 O.MDB ”,仅包含3个数据表、1个查询和以这个 查询为数据源的报表。是为了大家根据后面学习的内容作练习用的。我们先看查询中的数据:书籍 编号书名类别作者出版社单价进书日期22CHIP-01-08报刊电子计算机与外部设 备期刊社电子计算机与外部 设备¥ 16.802001-9-28
2、25电脑新时代-6光盘光盘UNKNOWN电脑新时代¥ 5.002002-7-827学电脑-7光盘光盘UNKNOWN人民邮电¥ 5.002002-7-1328CHIP-02-07 光盘光盘电子计算机与外部设 备杂志社电子计算机与外部 设备¥ 5.002002-7-1316MCS醉习指南书籍Syngress Media 公司人民邮电¥ 62.002001-9-2817局域网原理与架设技 术内幕大公开书籍蔡昌均中国青年¥ 69.002001-9-2819AccessVBA 基础书籍Eva nCallaha n人民邮电¥ 39.002001-
3、9-2820中文版 Access2001 册通书籍赵琳等人民邮电¥ 42.002001-9-2821VISUALBASIC5.0 教程书籍SteveBrow n电子工业¥ 28.002001-9-2823中文版VisualBasic5.0 程序员指南书籍microsoft中国青年¥ 70.002001-9-2824Access中文版开发指 南书籍Alison Balter人民邮电¥ 128.002002-2-1629Access 2002数据库系统开发实例导航书籍桂思强中国铁道¥ 25.002003-3-1030中国名陵集中华古代名陵之大成书籍
4、罗哲文等百花文艺¥ 14.002003-5-2031边缘部落一一福音谷书籍林茨(撰文摄影)河北教育¥ 27.002003-5-20为了比较有代表性,这个查询中包含多种字段类型:数字类型:【书籍编号】、【单价】字符类型:【书名】、【类别】、【作者】、【出版社】 日期类型:【进书日期】在多条件查询中,我们会使用除了【书籍编号】之外的其他字段作为查询条件。其实,在下面介绍的窗体查询方法中,有些代码或思路也可以应用在其它窗体 查询方法中,你对各种代码、方法和思路越熟练,就越能充分发挥它们的作用。这篇文章我是从4月初开始构思,到5月中旬开始动笔,花费两周时间写成, 里面包含了我对AC
5、CESS窗体查询所积累的经验,对初学者和有一定VBA基础 的人都有针对性的方法。另外,希望其他精通 ACCESS的高手提出意见。二.制作主/子窗体的步骤1. 利用向导制作主窗体话确予舊萍衣审的布局:期 剋 B 别舌股价书 搁怕出里诜丄2>|<|“诒聯走囱住上股用疇些孑段:可从实千表或査诃中堆皿.I程询:再书蚤询P可用宇殴:私査询取谢 | 卜 r |下芫成®取消 | 上一步(B】|下TOP芫成©诺为宙借措定你題:収上是片号创逢亩住所需的全部诘启.诵确至黑委打开窃读还是要俵改宙怖设计厂打开裔体查看或辅入信.息 柑務垠曾体设计M)厂显看有关硬用菊悻的粘BhdD活请至斯
6、再稈式|存书査匚殖炜l£J 叭5蜒鷲111g匚11融si-F取谢 上一步(B) |下一歩0!)芫威®取洎 上一齿耐"|芫威(fF|现在的主窗体还太小,要已经以下步骤才能变成我们需要的主窗体(如下图): 把窗体面积放大到足以容纳条件输入字段和子窗体,并调整所有控件的字体; 把窗体的“记录源”和各控件的“数据来源”都删除(很多初学者很容易犯 的错误就是这里),把类别和出版社改为组合框(因为这些字段的可能值比较少, 直接选择就好,不必让用户输入); 重新调整各字段的位置,并增加了两个空文本框和标签放在单价和进书日期 后面(因为我打算使用一个范围来作查询条件,而不是一个固
7、定的值,这样比 较符合实际); 单价后面的两个文本框改名为“单价开始”和“单价截止”,进书日期后面的 两个文本框改名为“进书日期开始”和“进书日期截止”; 画一个矩形框包住所有查询条件,把矩形框背景设置为常规,背景色为深灰 色,特殊样式为凹陷,此时矩形框覆盖了其它控件,要用菜单中“格式"Ta置 于底层”才能让它们显示出来; 在窗体上用向导建立一个按钮,按钮标题是“查询”,名称是“ cmd查询”先 不管里面的代码,后面再修改; 窗体属性中“记录选定器”=否,“浏览按钮”=否。2. 利用向导设计子窗体可炭用现有亩住创建子亩徉惑子报養"也可以幣表和/卓查询目 订创屯诵确足在子筍1
8、$丰子报衷中色色哪些乎図诵湧将阳于子旨住或子报表的数据来诅.p阻弔现帕漲槿询臣用现石的世讦Z1查询:存书至词可用字段:可口丛E盍茅亍歪利i£査询中堆搖乎段.5稔 牡18名SJ者版阶 书书笑隹$*%书日期取甜I|下一歩昭)|取詢11上一歩叩|下一步|完成叩 在主窗体中用工具箱中的“子窗体/子报表”对象建立一个子窗体; 以存书查询为记录源,选择所有字段; 把子窗体命名为“存书查询子窗体”; 在主窗体上删除子窗体的标签,并重新调整子窗体的大小; 关闭主窗体的设计视图,单独打开子窗体数据表视图,调整字体和行的大小现在,我们得到了如下的窗体:现在还没有实际的查询功能,我们在后面要根据所使用的方
9、法,修改窗体并增 加一些其他的功能。还有一些小的细节要注意,比如:按 TAB键后的获得光标的控件的顺序要在设 计视图下,视图菜单的“ TAB键次序”来修改;有些文本框获得焦点后是否要 打开输入法,比如输入单价和日期的地方要关闭,输入书名和作者的地方要打 开,这些要在控件属性中设置。.查询方法1:在查询中加入条件这种方法对应的实例数据库是:“常用窗体查询1.MDB1. 设计查询我们打开“存书查询”设计视图如下:在字段【书名】的准则格内写入:Like llf(lsNull(Forms!存书查询窗体!书名),'*','*'& Forms!存书查询窗体!书名&a
10、mp; '*')加入后的设计视图如下:把这个式子解释一下:LIKE :是专门用于查询字符型字段的运算符,一般介绍 ACCESS的书中都有它 的用法。ISNULL(Forms!存书查询窗体!书名):是用来判断窗体“存书查询窗体”上 面的“书名”这个文本框是否是空的。如果文本框是空的,贝心ISNULL(Forms!存书查询窗体!书名)=TRUE (真)如果文本框不是空的,贝心ISNULL(Forms!存书查询窗体!书名)=FALSE (假)IIF(EXPR, TRUEPART, FALSEPART)函数:EXPR必要参数。用来判断真伪的表达式TRUEPART必要参数。如果 EXPR
11、为TRUE,则返回这部分的值或表达式。FALSEPART必要参数。如果 EXPR为FALSE,则返回这部分的值或表达式所以当我们在窗体“存书查询窗体”上面的“书名”里写上“ACCESS”,整个式子的结果是:LIKE *ACCESS*相当于查询所有书名中包含“ ACCESS”的书籍,这样可以实现模糊查询Like llf(lsNull(Forms!存书查询窗体!书名),'*', Forms!存书查询窗体!书名& '*')Like llf(lsNull(Forms!存书查询窗体!书名),'*', Forms!存书查询窗体!书名)如果把准则改为上
12、面两句中的一句,同样情况下当我们在窗体“存书查询窗体” 上面的“书名”里写上“ ACCESS”,整个式子的结果是:LIKE ACCESS*LIKE ACCESS相当于查询以“ACCESS”开头的书籍(半模糊查询),或者书名就叫“ACCESS” 的书(精确查询)。具体使用那一种形式的查询要根据你的实际情况来修改。当我们在窗体“存书查询窗体”上面的“书名”里什么也没有写,整个式子的 结果是:LIKE *相当于查询所有的有书名的书 在书写查询准则时,Forms!存书查询窗体!书名这样的窗体控件名很难写, 这时你可以在准则格内点鼠标右键,选择生成器,出现如下图的窗口:在左边的树型列表框里找到控件所在的
13、窗体,在中间列表框出现这个窗体包含 的所有控件,双击控件名,就会出现“ Forms!存书查询窗体!书名”。我们再把其他几个字段的查询准则写出:【类别】:在窗体上是组合框,所以它肯定是个精确查询,跟【书名】一样,它 是文本字段。查询准则如下:Like llf(lsNull(Forms!存书查询窗体!类别),'*',Forms!存书查询窗体!类别)【作者】:跟【书名】一样,它是文本字段。我也打算用模糊查询。查询准则如下:Like llf(lsNull(Forms!存书查询窗体!作者),'*','*'& Forms!存书查询窗体!作者&
14、 '*')【出版社】:跟【类别】的情况完全一样。查询准则如下:Like IIf(IsNull(Forms!存书查询窗体!出版社),'*',Forms! 存书查询窗体!出版社)【单价】:是一个数字字段,我在这里准备让用户可以查询“1.5元6.5元”这样的范围。查询准则如下:Between IIf(IsNull(Forms!存书查询窗体!单价开始),0,Forms!存书查询窗体!单价开始)And IIf(IsNull(Forms!存书查询窗体!单价截止),5000,Forms!存书查询窗体!单价截止)BETWEEN AND :是查询符合某个范围之内的值所需的条件格式
15、。“ BETWEEN 1 AND 5 ”相当于“【字段】1 AND【字段】W 5”。根据前面讲解的IIF的内容,我用一个表格来解释一下各种情况下这个式子的实 际结果,便于大家理解:(0和5000是我事先在条件中设定的最小值和最大值)单价开始的值单价截止的值整个式子的实际结果空空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 (l
16、lf(lsNull(Forms!存书查询窗体!进书日期开始),#2000-1-1#,Forms! 存书查询窗体! 进书日期开始) And (llf(lsNull(Forms!存书查询窗体! 进书日期截止),#2099-12-31#,Forms!存书查询窗体!进书日期截止)在这个式子中,#2000-1-1#和#2099-12-31#是我设定的两个默认的开始和截止日 期。如果用户不输入,就使用默认值了。这和前面【单价】的情况是一样的。2. 设计按钮及代码2.1查询按钮查询按钮的代码非常简单,关键部分只有一句:Private Sub cmd 查询 _Click()Me.存书查询子窗体.Requery
17、 ' 这句是关键End SubREQUERY :是用来重新查询控件的数据源,这样可以刷新子窗体显示的记录。 对于记录源是表或查询的控件如窗体、列表框、组合框等经常用Requery方法来 刷新显示内容。2.2清除按钮有了查询按钮的代码之后,大家就可以自己测试查询的效果了。不过,每次想 换一个查询的条件时要清除上一个条件输入的东西,有时候比较麻烦。我们再 来设计一个清除条件的按钮,控件名称是“cmd清除”,放在查询按钮的下面按钮的代码如下:Private Sub cmd 清除 _Click()' 下面这些控件的值要清空Me.书名=NullMe.类别=NullMe.作者=NullMe
18、. 出版社=NullMe. 单价开始=NullMe. 单价截止=NullMe.进书日期开始=NullMe.进书日期截止=NullMe.存书查询子窗体.Requery '清空之后一样要重新查询End Sub2.3打印按钮有了查询结果,想打印出来,很简单。由于报表的记录源就是“存书查询”,所以在查询里设计的条件会直接在报表里体现出来。我们只要用按钮向导制作一个预览报表的按钮就可以了。我们把这个按钮放在 子窗体下面的右边。控件名称是“ cmd预览报表”。由于完全是采用向导制作的,不需修改代码,所以我就不在这里列出代码了。2.4导出EXCEL按钮如果你觉得ACCESS的报表边框太难看,或者你想
19、在报表上加上一些说明什么 的。你可能更愿意把数据导出到 EXCEL里进行再加工。为了初学者容易理解,我打算用一个宏来解决这个问题。宏的设计如下图:现在,宏里“输出文件”为空,运行时会自动跳出对话框让你选择保存目录和 文件名。如果你想保存在数据库所在目录下的“查询结果.xls ”里,可以在“输出文件” 一栏里填入:查询结果.xls"把这个宏存为“导出查询数据宏” 然后再在窗体里加入按钮。当按钮向导出现后,直接取消。在按钮的属性页里, 先把按钮名称改为“cmd导出”,在按钮的“单击事件”里直接用下拉框选择“导 出查询数据宏”,如下图。这样就不必编写代码了。百命令按钮;Ed导出爭件|其他|
20、全部|I卜” I导出查询数据宏3. 增加统计功能经常有人需要在主窗体上显示符合查询条件的记录总数,以及子窗体中某一字 段的合计。所以,我们也准备在主窗体上增加记录总数和单价的合计。3.1子窗体上的设计 单独打开子窗体的设计模式,在窗体页脚部分拉出一段窗体; 在上面增加两个文本框:一个是“ txt计数”,控件来源二Count(*),另一个是txt单价合计”,控件来源二Sum(单价); 在子窗体的窗体属性中设置:浏览按钮=否,记录集类型=快照(快照的运 行速度快,占用内存少,但不能编辑更新,正适合我们的需要) ;3.2主窗体上的设计持合条件记录載:卜存书查询二单价合计:卜存书査询冇预览报表洁玲入奢
21、询条件导出EXCEL 在子窗体下面的地方设计两个文本框“计数”和“合计”,把它们的标签改为 “符合条件记录数:”和“单价合计:”; “计数”文本框的控件来源=存书查询子窗体.Form.txt计数,“合计”文 本框的控件来源=存书查询子窗体.Form.txt单价合计; 由于主窗体上的这两个文本框是自动计算的,为了区别,设置它们的是否有 效=否,是否锁定=是,背景颜色=深灰色。4. 方法总结现在,整个窗体就已经完成了。大家可以使用各种条件组合来测试一下窗体的 效果。匕战社"3书縉H号菟JWftft*21>ISUALEi.SIC5,。執甩电干二毀A c ._eu s 2加2取師廉航幵
22、笈窝曲号肮书籍中国*30B国居陛一宾t华吉tts陛才乂应31莎苗茗一晋各林叢河北彳单忻賞计;|号出噫花匚羊(530邊书 mn Izooo-i-i至3099-32-3:!4.1本方法优点在查询中加入条件这种方法比较简单,只要在查询中设计好各字段的条件,那 么窗体中的代码就非常少,而且在打印报表和导出数据方面也很容易设计,比 较适合初学ACCESS的人使用。4.2本方法缺点 对查询中的数据有限制,所有设计了条件的字段中必须是每条记录都有数据。 即使你在窗体中并没有在这个字段对应的文本框中输入条件。举例来说,假设你在表“ tb藏书情况”中,把【书籍编号】=16对应的这本书的 作者或单价删掉,在“存书
23、查询窗体”中,即使你不输入任何条件,【书籍编号】 =16对应的这本书你也看不见。 如果在某个查询组合下,子窗体上根本没有符合条件的记录,则主窗体上的 “记录数”和“合计”会显示“#错误”。如果把主窗体上的“记录数”和“合计”的控件来源改为:=llf(lsError(存书查询子窗体.Form.txt 计数),0, 存书查询子窗体.Form.txt 计数)=llf(lsError(存书查询子窗体.Form.txt 单价合计),0, 存书查询子窗体.Form.txt 单价合计)则不会出现“#错误”,这是我在下面地址学到的:http:/www.erpbus. net/access/topic.asp?
24、topic_id=8183&forumd=44 报表不能直接打开,每次打开报表就会跳出提示框要求输入条件。四.查询方法2 :用VBA生成窗体筛选条件这种方法对应的实例数据库是:“常用窗体查询2.MDB ”。主窗体的控件与“常用窗体查询 1.MDB ”相同,只是按钮中的代码都改了。子 窗体则完全相同。“存书查询”中不需要输入任何条件。1.按钮代码设计1.1查询按钮本按钮代码的设计思想是根据主窗体上各个条件输入控件的值,用VBA代码生成一个条件组合的字符串作为子窗体的窗体筛选的条件。'判断【书名】条件是否有输入的值If Not lsNull(Me.书名)Then' 有输入s
25、trWhere = strWhere & "(书名like '*" & Me.书名 & "*') AND "End If& :是字符串链接运算符,它和“ + ”不同之处在于“ &”两边如果不是字符串 表达式,它会自动把表达式的值变成字符串,省了你转换格式了。"(书名LIKE '*":英文双引号是VBA用来表示字符串的符号,两个双引号中 间是一个字符串。""两个双引号中间什么也没有,表示一个空字符串。注意:空字符串工NULL (空值)。所以IsNull(
26、"")=False。'*ACCESS*':英文单引号是SQL语句中用来表示字符串的符号,两个单引号中 间是一个字符串。(SQL语句中也可以使用双引号来表示字符串,但在VBA代码生成SQL语句时,为了简化格式,一律用单引号表示SQL语句内的字符串)书名:用表明书名是一个字段名、表名或查询名。使用的作用:可以明确中间是一个名字而不是函数;当字段名、表名或查询名是ACCESS或VBA保留字(如:DATE、NOTE、TYPEOF等)时,一定要用来标明;当字段名、 表名或查询名中包含特殊字符(如停止/截止日期、查询-合计等)时,一定 要用来标明,否则特殊字符会被当作算
27、术运算符而导致出错。ME.书名:是“存书查询窗体”上文本框“书名”的值。Me.书名二Me.书名.Value。 Me是对代码所在窗体的引用。刘小军(Alex ) 2003-515如果此时“存书查询窗体”上文本框“书名”的值是"ACCESS",那么此时strWhere 的结果就是:"(书名like '*ACCESS*') AND "跟查询方法1中一样,我们也可以改为半模糊查询和精确查询,代码如下:strWhere = strWhere & "(书名like '" & Me.书名 & &quo
28、t;*') AND "strWhere = strWhere & "(书名like '" & Me.书名 & "') AND "接着看关于【单价】的代码:'判断【单价】条件是否有输入的值,由于有【单价开始】【单价截止】两个文本框' 所以要分开来考虑If Not lsNull(Me.单价开始)Then'【单价开始】有输入strWhere = strWhere & "(单价="& Me. 单价开始 & ") AND &quo
29、t;End IfIf Not lsNull(Me.单价截止)Then'【单价截止】有输入strWhere = strWhere & "(单价="& Me. 单价截止 & ") AND "End If这里用“ =”“ =”来代替“ BETWEEN AND ”,效果是一样的,只是不需要 像查询方法1中那样如果不填数字,会分别写入0和5000。再来看看关于【进书日期】的代码:'判断【进书日期】条件是否有输入的值,由于有【进书日期开始】【进书日期截止】两个文本框' 所以要分开来考虑If Not IsNull(Me.
30、进书日期开始)Then'【进书日期开始】有输入strWhere = strWhere & "(进书日期=#" & Format(Me.进书日期开始,"yyyy-mm-dd") & "#)AND "End IfIf Not IsNull(Me.进书日期截止)Then'【进书日期截止】有输入strWhere = strWhere & "(进书日期=#" & Format(Me.进书日期截止,"yyyy-mm-dd") & "#
31、)AND "End If使用Format(Me.进书日期开始,"yyyy-mm-dd"),而不是直接用 Me.进书日期开始,是因为有 时候直接用Me进书日期开始的话,会因为计算机日期格式设置的不同而出现一些奇 怪的问题。ACCESS中的日期条件一直都是比较麻烦的,不管是选择查询、追 加查询还是交叉表查询,设置日期字段的条件都是要特别注意的。(像查询方法1中直接在查询准则中引用控件值虽然不会出现类似问题,但交叉表查询中不能使用控件作为日期字段的条件。)' 先在立即窗口显示一下 strWhere的值,代码调试完成后可以取消下一句Debug.Pri nt str
32、WhereDEBUG.PRINT:是专门用于调试的语句,它会把后面表达式的值显示在VB编辑器的立即窗口里。在适当地地方插入Debug.Pri nt可以检查程序运行的是否正确。等全部调试结束后,可以把他们都删掉。' 让子窗体应用窗体查询Me. 存书查询子窗体.Form.Filter = strWhereMe. 存书查询子窗体.Form.FilterOn = True主窗体或单一窗体设置筛选字符串时用:Me.Filter=""或是 Forms!XX 窗体.Filter二""。' 在子窗体筛选后要运行一下自编子程序CheckSubformCou
33、 nt()Call CheckSubformCou ntCheckSubformCount是一个自编的子程序,CALL是调用子程序的语句,也可以 不写CALL直接用CheckSubformCount调用子程序。1.2清除按钮代码里都有说明,只讲以下的一段代码:For Each ctl In Me.C on trols' 根据ctl的控件类型来选择Select Case ctl.C on trolTypeCase acTextBox '是文本框,要清空(注意,子窗体下面还有两个锁定的文本框不能赋值)If ctl.Locked = False Then ctl.Value = Nu
34、llCase acComboBox '是组合框,也要清空ctl.Value = Null'其它类型的控件不处理End SelectNextFOR EACH CTL IN ME.CONTROLS :意思是把当前窗体内所有的控件都逐个引 用一次(子窗体控件内的控件不算在内)。这种用“ For Each对象或属性In 对 象集合或属性集合”的遍历方法在ACCESS编程中属于比较常见的用法,用处 也很多。比如最常见的检查窗体是否打开的代码中也有:Function lsLoaded(strFrmName As String) As Boolea n'确定一个窗体是否已被装载。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 '窗体不是设计模式时IsLoaded = TrueExit Fun ction '一旦找到了此窗体,就退出本函数。End IfEnd IfNextEnd Function1.3预览报表按钮预览报表按钮中关键是如下语句:strWher
36、e = Me. 存书查询子窗体.Form.Filter'在打开报表的同时把子窗体的筛选条件字符串也传递给报表,' 这样地话报表也会显示和子窗体相同的记录。DoCmd.Ope nReport stDocName, acPreview, , strWhere在我曾经制作的另一个例子:“打印当前记录的例子”里也使用过类似的方法。这个例子可以在 下载。关于DoCmd.OpenReport的详细帮助,可以在 VBA帮助里找到。1.4导出按钮导出方法只能把表或者查询的内容导出到EXCEL,但是不能把窗体上的记录集(RECORDSET)导出。所以我们要把子窗体的内容转变为一个查询。我在查询中
37、增加了一个“查询结果”,其中的设计随便就行,因为每次在使用这 个查询之前,我们都会用 DAO修改查询的SQL语句。思路很简单,如果子窗体的筛选条件字符串是:(类别Like ' 书籍')AND ( 单价>=20)那么,我们把“查询结果”的SQL语句改为:SELECT * FROM 存书查询 WHERE (类别Like ' 书籍')AND ( 单价>=20)这样的话,“查询结果”的记录与子窗体里的记录就是相同的刘小军(Alex)2003-5对应的代码如下:strWhere = Me.存书查询子窗体.Form.FilterIf strWhere = &qu
38、ot;" Then'没有条件strSQL = "SELECT * FROM 存书查询"Else有条件strSQL = "SELECT * FROM End If存书查询WHERE " & strWhere这部分用来准备查询的SQL语句。Set qdf = Curre ntDb.QueryDefs(” qdf.SQL = strSQL qdf.Close查询结果")Set qdf = Noth ing这一部分用来把做好的SQL语句放在查询中DoCmd.OutputTo acOutputQuery,"查询结果&q
39、uot;, acFormatXLS, , True这一部分的作用,和查询方法1中的“导出查询数据宏”的作用相同。运行时 会自动跳出对话框让你选择保存目录和文件名。如果你想保存在数据库所在目 录下的“查询结果.xls”里,可以把这一句改为:查询结果.xls"DoCmd.OutputTo acOutputQuery,"查询结果", acFormatXLS, strOutputFileName , True如果你想在文件名上保留时间,以便知道是什么时候做的查询,可以改为:查询结果-"& _Format(Date(),"yyyymmdd&quo
40、t;) & ".xls"DoCmd.OutputTo acOutputQuery,"查询结果", acFormatXLS, strOutputFileName , True_:英文下划线表明下一行和本行是同一条语句,在语句比较长时,为了便于阅 读,可以用这种方法把每行变短一些。下划线之前要有一个空格作分隔,不然 可能会被当作字段名的一部分。1.5 CheckSubformCount 子程序这段子程序的目的在代码中已经解释了。目前实例数据库中的代码中是用代码 设置文本框的“控件来源”。也可以直接用代码设置控件的值(前提条件是在窗 体的设计视图中,把
41、两个文本框的控件来源都删掉,使控件变成未绑定)。此外, 我再加几句代码,当子窗体无记录时,下面的导出和预览按钮都变成灰色。这 样的软件显得更专业一些。代码如下:If Me.存书查询子窗体.Form.Recordset.RecordCount > 0 Then'子窗体的记录数0Me.计数=Me.存书查询子窗体.Form.txt计数Me.合计=Me.存书查询子窗体.Form.txt单价合计Me.cmd导出.Enabled = TrueMe.cmd预览报表.Enabled = TrueElse'子窗体的记录数=0Me.计数=0Me.合计=0Me.cmd导出.Enabled =
42、FalseMe.cmd预览报表.Enabled = FalseEnd If2.方法总结使用VBA来设置子窗体筛选条件的方法解决了方法 1中的几个缺点,大家可以 逐一测试。但是编写这样的VBA代码需要对VBA比较熟悉,而且要求对逻辑运算有一定 基础,不然在使用逻辑运算符 AND/OR/NOT和括号组合时会出错。不太适合初 学者使用。五.主子窗体交叉表查询实例这种方法对应的实例数据库是:“常用窗体查询3.MDB交叉表查询通常作为统计之用,所以查询条件少了一些。一般学习ACCESS的人,都有可能会被ACCESS的向导误导,以为子窗体控件 里面一定要放一个子窗体。其实不是,在我的这个例子里,子窗体的对
43、象其实 就是交叉查询,如下图。子窗休/于报盍:存书杳询子窗休源对象 链接子孚段 灘接主字盘是否有娄t . , , - r , 是舌速走,金刖匕旬.存书查询芟更表表.tb就书'昏呪 表.t砒版壮名单 表lb規團查询存书查诲直询.存书宜I址交冥表一直有人问,对于交叉表这样字段数量不固定的,怎样在子窗体中显示。其实, 直接在子窗体里显示交叉表本身是最简单的办法。另一种方法是事先设计一个包含很多未绑定字段文本框的数据表窗体,在显示 之前,先用VBA设置窗体的“记录源”和各文本框的“控件来源”,同时还要 控制没有字段可以显示的那些列要隐藏,然后再显示出来。但这样设计要求编 写比较多的代码,只适合比较熟悉 VBA的人使用。(我在这个例子的报表中设 计了类似的代码,可以参考。)1. 按钮设计1.1查询按钮先看一下没有条件的交叉表查询的 SQL语句:TRANSFORM SumK书查询单价)AS 单价之SumSELECT存书查询类别FROM存书查询GROUP BY存书查询类别PIVOT Format(进书日期,"yyyy/mm");再看一下设置了条件的交叉
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年江西省庐山市高三物理下册期末考试模拟检测卷带答案
- 2026年河南省荥阳市高三生物下册期末考试模拟考试卷含答案
- 2026年安徽省宁国市高一化学上册期末考试测试卷附参考答案(完整版)
- 2026年浙江省义乌市高三生物上册期末考试模拟试卷含答案
- 2026年山西省侯马市高一化学上册期末考试模拟卷(综合题)附答案
- 五年级数学下册 第3课时 求一个数是另一个数的几分之几
- 基于栅格邻域可视性的最优路径问题深度剖析与算法优化
- 基于机器视觉的嵌入式道岔缺口检测系统:原理、应用与展望
- 基于机器学习的CDN-P2P文件分发网络用户需求预测模型构建与实践
- 基于有限元的球磨机结构强度精细化解析与优化策略研究
- 2025年大学生微电子与集成电路考试试题及答案
- 磨工技师试题及答案解析
- 华为光芯片机考题库
- 中国人寿保全知识课件
- 2025年银川文化旅游发展集团有限公司招聘笔试参考题库含答案解析
- 高考英语3500词顺序版
- 江苏省中等职业学校学业水平试卷题含答案
- 环卫工人交通安全知识培训课件正式完整版
- 吉利工厂过程质量对标标准手册V4
- 医院应急预案汇编3
- 秦统一中国(李)
评论
0/150
提交评论