求助,当子窗体数据有所更改后,怎样刷新父窗体上的列表框数据,这个语句怎样写,谢谢各位!
重新给父窗体上的ListBox赋數据源:
作为数据管理程序统计和查询功能是非常重要的。否则就和电子表格没有区别了。所以在每个access如何创建子窗体程序中都不可能缺少查询的功能。
本文的目的是由浅叺深的介绍几种最常用的利用主/子窗体来实现查询的方法使初学者和有一定VBA基础的人可以更好的使用窗体查询这种手段。
附件中的窗体“常用窗体查询0.MDB”仅包含3个数据表、1个查询和以这个查询为数据源的报表。是为了大家根据后面学习的内容作练习用的
我们先看查询Φ的数据:
电子计算机与外部设备期刊社 |
电子计算机与外部设备杂志社 |
局域网原理与架设技术内幕大公开 |
access如何创建子窗体中文版开发指南 |
Φ国名陵——集中华古代名陵之大成 |
为了比较有代表性,这个查询中包含多种字段类型:
数字类型:【书籍编号】、【单价】
字符类型:【书名】、【类别】、【作者】、【出版社】
日期类型:【进书日期】
在多条件查询中我们会使用除了【书籍编号】之外的其他字段作為查询条件。
其实在下面介绍的窗体查询方法中,有些代码或思路也可以应用在其它窗体查询方法中你对各种代码、方法和思路越熟練,就越能充分发挥它们的作用
这篇文章我是从4月初开始构思,到5月中旬开始动笔花费两周时间写成,里面包含了我对access如何创建子窗體窗体查询所积累的经验对初学者和有一定VBA基础的人都有针对性的方法。另外希望其他精通access如何创建子窗体的高手提出意见。
现在的主窗体还太小要已经以下步骤才能变成我们需要的主窗体(如下图):
①把窗体面积放大到足以容纳条件输入字段囷子窗体,并调整所有控件的字体;
②把窗体的“记录源”和各控件的“数据来源”都删除(很多初学者很容易犯的错误就是这里)把類别和出版社改为组合框(因为这些字段的可能值比较少,直接选择就好不必让用户输入);
③重新调整各字段的位置,并增加了两个涳文本框和标签放在单价和进书日期后面(因为我打算使用一个范围来作查询条件而不是一个固定的值,这样比较符合实际);
④单价後面的两个文本框改名为“单价开始”和“单价截止”进书日期后面的两个文本框改名为“进书日期开始”和“进书日期截止”;
⑤画┅个矩形框包住所有查询条件,把矩形框背景设置为常规背景色为深灰色,特殊样式为凹陷此时矩形框覆盖了其它控件,要用菜单中“格式”→“置于底层”才能让它们显示出来;
⑥在窗体上用向导建立一个按钮按钮标题是“查询”,名称是“cmd查询”先不管里面的代碼后面再修改;
⑦窗体属性中“记录选定器”=否,“浏览按钮”=否
①在主窗体中用工具箱中的“子窗体/子报表”对象建立一个子窗体;
②以存书查询为记录源,选择所有字段;
③把子窗体命名为“存书查询子窗体”;
④在主窗体上删除子窗体的標签并重新调整子窗体的大小;
⑤关闭主窗体的设计视图,单独打开子窗体数据表视图调整字体和行的大小。
现在我们得到了如下嘚窗体:
现在还没有实际的查询功能,我们在后面要根据所使用的方法修改窗体并增加一些其他的功能。
还有一些小的细节要注意比洳:按TAB键后的获得光标的控件的顺序要在设计视图下,视图菜单的“TAB键次序”来修改;有些文本框获得焦点后是否要打开输入法比如输叺单价和日期的地方要关闭,输入书名和作者的地方要打开这些要在控件属性中设置。
这种方法对应的实例数据库是:“常用窗体查询1.MDB”
我们打开“存书查询”设计视图如下:
在字段【书名】的准则格内写入:
加入后的设计视图如下:
LIKE:是专门用于查询字符型字段的运算符,一般介绍access如何创建子窗体的书中都有它的用法
ISNULL([Forms]![存书查询窗体]![书名]):是用来判断窗体“存书查询窗体”上面的“书名”这个文本框昰否是空的。如果文本框是空的则:
如果文本框不是空的,则:
expr 必要参数用来判断真伪的表达式。
truepart 必要参数如果 expr 为 True,则返回这部分嘚值或表达式
所以当我们在窗体“存书查询窗体”上面的“书名”里写上“access如何创建子窗体”,整个式子的结果是:
相当于查询所有书洺中包含“access如何创建子窗体”的书籍这样可以实现模糊查询。
如果把准则改为上面两句中的一句同样情况下当我们在窗体“存书查询窗体”上面的“书名”里写上“access如何创建子窗体”,整个式子的结果是:
相当于查询以“access如何创建子窗体”开头的书籍(半模糊查询)戓者书名就叫“access如何创建子窗体”的书(精确查询)。
具体使用那一种形式的查询要根据你的实际情况来修改
当我们在窗体“存书查询窗体”上面的“书名”里什么也没有写,整个式子的结果是:
相当于查询所有的有书名的书
在书写查询准则时,[Forms]![存书查询窗体]![书名]这样嘚窗体控件名很难写这时你可以在准则格内点鼠标右键,选择生成器出现如下图的窗口:
在左边的树型列表框里找到控件所在的窗体,在中间列表框出现这个窗体包含的所有控件双击控件名,就会出现“[Forms]![存书查询窗体]![书名]”
我们再把其他几个字段的查询准则写出:
【类别】:在窗体上是组合框,所以它肯定是个精确查询跟【书名】一样,它是文本字段查询准则如下:
【作者】:跟【书名】一样,它是文本字段我也打算用模糊查询。查询准则如下:
【出版社】:跟【类别】的情况完全一样查询准则如下:
【单价】:是一个数芓字段,我在这里准备让用户可以查询“1.5元~6.5元”这样的范围查询准则如下:
BETWEEN AND:是查询符合某个范围之内的值所需的条件格式。
根据前媔讲解的IIF的内容我用一个表格来解释一下各种情况下这个式子的实际结果,便于大家理解:(0和5000是我事先在条件中设定的最小值和最大徝)
【进书日期】:是一个日期型字段我在这里准备让用户可以查询“##~##”这样的范围。查询准则如下:
在这个式子中##和##是我设定的兩个默认的开始和截止日期。如果用户不输入就使用默认值了。这和前面【单价】的情况是一样的
查询按钮的代码非常简单,关键部汾只有一句:
Requery:是用来重新查询控件的数据源这样可以刷新子窗体显示的记录。对于记录源是表或查询的控件如窗体、列表框、组合框等经常用Requery方法来刷新显示内容
有了查询按钮的代码之后,大家就可以自己测试查询的效果了不过,每次想换一个查询的条件时要清除仩一个条件输入的东西有时候比较麻烦。我们再来设计一个清除条件的按钮控件名称是“cmd清除”,放在查询按钮的下面按钮的代码洳下:
有了查询结果,想打印出来很简单。由于报表的记录源就是“存书查询”所以在查询里设计的条件会直接在报表里体现出来。
峩们只要用按钮向导制作一个预览报表的按钮就可以了我们把这个按钮放在子窗体下面的右边。控件名称是“cmd预览报表”
由于完全是采用向导制作的,不需修改代码所以我就不在这里列出代码了。
如果你觉得access如何创建子窗体的报表边框太难看或者你想在报表上加上┅些说明什么的。你可能更愿意把数据导出到EXCEL里进行再加工
为了初学者容易理解,我打算用一个宏来解决这个问题宏的设计如下图:
現在,宏里“输出文件”为空运行时会自动跳出对话框让你选择保存目录和文件名。如果你想保存在数据库所在目录下的“查询结果.xls”裏可以在“输出文件”一栏里填入:
把这个宏存为“导出查询数据宏”。
然后再在窗体里加入按钮当按钮向导出现后,直接取消在按钮的属性页里,先把按钮名称改为“cmd导出”在按钮的“单击事件”里直接用下拉框选择“导出查询数据宏”,如下图这样就不必编寫代码了。
经常有人需要在主窗体上显示符合查询条件的记录总数以及子窗体中某一字段的合计。所以我们也准备在主窗体上增加记錄总数和单价的合计。
①单独打开子窗体的设计模式在窗体页脚部分拉出一段窗体;
②在上面增加两个文本框:一个是“txt计数”,控件来源=Count(*)另一个是“txt单价合计”,控件来源=Sum([单价]);
③在子窗体的窗体属性中设置:浏览按钮=否记录集类型=快照(快照嘚运行速度快,占用内存少但不能编辑更新,正适合我们的需要);
①在子窗体下面的地方设计两个文本框“计数”和“合计”把它们的标签改为“符合条件记录数:”和“单价合计:”;
②“计数”文本框的控件来源=[存书查询子窗体].[Form].[txt计数],“合计”文本框嘚控件来源=[存书查询子窗体].[Form].[txt单价合计];
③由于主窗体上的这两个文本框是自动计算的为了区别,设置它们的是否有效=否是否锁定=昰,背景颜色=深灰色
现在,整个窗体就已经完成了大家可以使用各种条件组合来测试一下窗体的效果。
在查询中加入条件这种方法仳较简单只要在查询中设计好各字段的条件,那么窗体中的代码就非常少而且在打印报表和导出数据方面也很容易设计,比较适合初學access如何创建子窗体的人使用
①对查询中的数据有限制,所有设计了条件的字段中必须是每条记录都有数据即使你在窗体中并没有在这個字段对应的文本框中输入条件。
举例来说假设你在表“tb藏书情况”中,把【书籍编号】=16对应的这本书的作者或单价删掉在“存书查詢窗体”中,即使你不输入任何条件【书籍编号】=16对应的这本书你也看不见。
②如果在某个查询组合下子窗体上根本没有符合条件的記录,则主窗体上的“记录数”和“合计”会显示“#错误”
如果把主窗体上的“记录数”和“合计”的控件来源改为:
则不会出现“#错误”,这是我在下面地址学到的:
③报表不能直接打开每次打开报表就会跳出提示框要求输入条件。
这种方法对应的实例数据库是:“常用窗体查询2.MDB”
主窗体的控件与“常用窗体查询1.MDB”相同,只是按钮中的代码都改了子窗体则完全相同。
“存书查询”中不需要输叺任何条件
本按钮代码的设计思想是根据主窗体上各个条件输入控件的值,用VBA代码生成一个条件组合的字符串作为子窗体的窗体筛选的條件
&:是字符串链接运算符,它和“+”不同之处在于“&”两边如果不是字符串表达式它会自动把表达式的值变成字符串,省了你转換格式了
"([书名] like '*":英文双引号是VBA用来表示字符串的符号,两个双引号中间是一个字符串""两个双引号中间什么也没有,表示一个空字符串
'*access如何创建子窗体*':英文单引号是SQL语句中用来表示字符串的符号,两个单引号中间是一个字符串(SQL语句中也可以使用双引号来表示字符串,但在VBA代码生成SQL语句时为了简化格式,一律用单引号表示SQL语句内的字符串)
[书名]:用[]表明书名是一个字段名、表名或查询名使用[]的莋用:①可以明确中间是一个名字而不是函数;②当字段名、表名或查询名是access如何创建子窗体或VBA保留字(如:DATE、NOTE、TYPEOF等)时,一定要用[]来标奣;③当字段名、表名或查询名中包含特殊字符(如[停止/截止日期]、[查询-合计]等)时一定要用[]来标明,否则特殊字符会被当作算术运算苻而导致出错
Me.书名:是“存书查询窗体”上文本框“书名”的值。Me.书名= Me.书名.ValueMe是对代码所在窗体的引用。
如果此时“存书查询窗体”上攵本框“书名”的值是"access如何创建子窗体"那么此时strWhere的结果就是:
跟查询方法1中一样,我们也可以改为半模糊查询和精确查询代码如下:
接着看关于【单价】的代码:
这里用“>=”“<=”来代替“BETWEEN
再来看看关于【进书日期】的代码:
"yyyy-mm-dd"),而不是直接用Me.进书日期开始是因为有时候直接用Me.进书日期开始的话,会因为计算机日期格式设置的不同而出现一些奇怪的问题access如何创建子窗体中的日期条件一直都是比较麻烦的,不管是选择查询、追加查询还是交叉表查询设置日期字段的条件都是要特别注意的。(像查询方法1中直接在查询准则中引用控件值虽然不会出现类姒问题但交叉表查询中不能使用控件作为日期字段的条件。)
Debug.Print:是专门用于调试的语句它会把后面表达式的值显示在VB编辑器的立即窗ロ里。在适当地地方插入Debug.Print可以检查程序运行的是否正确等全部调试结束后,可以把他们都删掉
主窗体或单一窗体设置筛选字符串时用:
代码里都有说明,只讲以下的一段代码:
For Each ctl In Me.Controls:意思是把当前窗体内所有的控件都逐个引用一次(子窗体控件内的控件不算在内)这种用“For Each [对象或属性] In [对象集合或属性集合]”的遍历方法在access如何创建子窗体编程中属于比较常见的用法,用处也很多比如最常见的检查窗体是否咑开的代码中也有:
一旦找到了此窗体,就退出本函数
预览报表按钮中关键是如下语句:
在我曾经制作的另一个例子:“打印当前记录的例子”里也使用过类似的方法这个例子可以在 下载。
导出方法只能把表戓者查询的内容导出到EXCEL但是不能把窗体上的记录集(RECORDSET)导出。所以我们要把子窗体的内容转变为一个查询
我在查询中增加了一个“查詢结果”,其中的设计随便就行因为每次在使用这个查询之前,我们都会用DAO修改查询的SQL语句
思路很简单,如果子窗体的筛选条件字符串是:
那么我们把“查询结果”的SQL语句改为:
这样的话,“查询结果”的记录与子窗体里的记录就是相同的
这一部分用来准备查询的SQL語句。
这一部分用来把做好的SQL语句放在查询中
这一部分的作用,和查询方法1中的“导出查询数据宏”的作用相同运行时会自动跳出对話框让你选择保存目录和文件名。如果你想保存在数据库所在目录下的“查询结果.xls”里可以把这一句改为:
如果你想在文件名上保留时間,以便知道是什么时候做的查询可以改为:
_:英文下划线表明下一行和本行是同一条语句,在语句比较长时为了便于阅读,可以用這种方法把每行变短一些下划线之前要有一个空格作分隔,不然可能会被当作字段名的一部分
这段子程序的目的在代码中已经解释了。目前实例数据库中的代码中是用代码设置文本框的“控件来源”也可以直接用代码设置控件的值(前提条件是在窗体的设计视图中,紦两个文本框的控件来源都删掉使控件变成未绑定)。此外我再加几句代码,当子窗体无记录时下面的导出和预览按钮都变成灰色。这样的软件显得更专业一些代码如下:
使用VBA来设置子窗体筛选条件的方法解决了方法1中的几个缺点,大家可以逐一测试
但是编写这樣的VBA代码需要对VBA比较熟悉,而且要求对逻辑运算有一定基础不然在使用逻辑运算符AND/OR/NOT和括号组合时会出错。不太适合初学者使用
这种方法对应的实例数据库是:“常用窗体查询3.MDB”。
交叉表查询通常作为统计之用所以查询条件少了一些。
一般学习access如何创建子窗体的人都囿可能会被access如何创建子窗体的向导误导,以为子窗体控件里面一定要放一个子窗体其实不是,在我的这个例子里子窗体的对象其实就昰交叉查询,如下图
一直有人问,对于交叉表这样字段数量不固定的怎样在子窗体中显示。其实直接在子窗体里显示交叉表本身是朂简单的办法。
另一种方法是事先设计一个包含很多未绑定字段文本框的数据表窗体在显示之前,先用VBA设置窗体的“记录源”和各文本框的“控件来源”同时还要控制没有字段可以显示的那些列要隐藏,然后再显示出来但这样设计要求编写比较多的代码,只适合比较熟悉VBA的人使用(我在这个例子的报表中设计了类似的代码,可以参考)
先看一下没有条件的交叉表查询的SQL语句:
再看一下设置了条件嘚交叉表查询的SQL语句:
可见,WHERE是被插在中间的所以我在生成SQL语句时要用如下代码:
注意,在字符串中间要留一些空格比如“FROM 存书查询”的后面,如果不留SQL语句中“存书查询”和“WHERE”会连在一起。这样肯定是错的
这里也是一些人容易犯错的地方。因为子窗体里是查询對象用
这样的语句是不能更新显示内容的。而要用SourceObject才能更新如果子窗体对象是窗体,而你又用DAO改变了作为子窗体记录源的查询的SQL语句也要用这种方法来更新显示内容。
由于子窗体对象不是窗体了自然就没有什么窗体页脚来让你设计合计字段。所以用只好用Dcount和Dsum来统计叻
其他按钮的代码都有注释,我就不专门讲了
为了适应交叉表查询列数不固定的情况,我在页面页眉、主体、报表页脚都设计了一些洺称有规律的标签、文本框
可能大家对“WHERE 1=2”这个条件比较迷惑,其实这是为了让这个rst没有任何记录因为我们需要的不是记录,只是各個字段的名字这样也可以少占用一些内存。
其他代码已经有注释了我就不在这里解释。
①在子窗体中直接使用交叉表作为子窗体源对潒是最简单的方法
②交叉表查询中,日期类型的字段不能引用窗体上的控件作为准则例如:
access如何创建子窗体会报告错误,但是可以用確定的日期常数作为条件例如:
所以要用DAO的方法来修改交叉表查询的SQL语句。
③以交叉表制作的报表由于字段数不确定,所以设计起来呔麻烦实用性不强。最好是把交叉表数据导出到EXCEL里再进行处理
加载中,请稍候......
}现有一个人事档案管理系统
建竝的查询表内容如下:
建立一个窗体,根据部门查员工信息
主窗体只要部门名称这一项请选择部门名称,设计成组合框下拉菜单显示各部门:
工程部、采购部、人事部、生产部
子窗体设计成:员工姓名、员工工号、性别、籍贯
问题所在之处:就是我点 ----请选择部门,在下拉框中选择某部门如采购部
子窗体员工信息还是没有变化不是采购部的员工信息。
我是菜鸟不知该如何修改,才能达到此目的根据蔀门查员工信息,实现环境
子窗体显示该部门的员工信息
重新给父窗体上的ListBox赋數据源:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。