ACCESS窗体查询实例91163.docx

上传人:b****7 文档编号:10696097 上传时间:2023-02-22 格式:DOCX 页数:28 大小:448.02KB
下载 相关 举报
ACCESS窗体查询实例91163.docx_第1页
第1页 / 共28页
ACCESS窗体查询实例91163.docx_第2页
第2页 / 共28页
ACCESS窗体查询实例91163.docx_第3页
第3页 / 共28页
ACCESS窗体查询实例91163.docx_第4页
第4页 / 共28页
ACCESS窗体查询实例91163.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

ACCESS窗体查询实例91163.docx

《ACCESS窗体查询实例91163.docx》由会员分享,可在线阅读,更多相关《ACCESS窗体查询实例91163.docx(28页珍藏版)》请在冰豆网上搜索。

ACCESS窗体查询实例91163.docx

ACCESS窗体查询实例91163

一.概述

作为数据管理程序,统计和查询功能是非常重要的。

否如此,就和电子表格没有区别了。

所以,在每个ACCESS程序中都不可能缺少查询的功能。

本文的目的是由浅入深的介绍几种最常用的利用主/子窗体来实现查询的方法,使初学者和有一定VBA根底的人可以更好的使用窗体查询这种手段。

附件中的窗体“〞,仅包含3个数据表、1个查询和以这个查询为数据源的报表。

是为了大家根据后面学习的容作练习用的。

我们先看查询中的数据:

书籍编号

书名

类别

作者

单价

进书日期

22

CHIP-01-08

报刊

电子计算机与外部设备期刊社

电子计算机与外部设备

2001-9-28

25

电脑新时代-6光盘

光盘

UNKNOWN

电脑新时代

2002-7-8

27

学电脑-7光盘

光盘

UNKNOWN

人民邮电

2002-7-13

28

CHIP-02-07光盘

光盘

电子计算机与外部设备杂志社

电子计算机与外部设备

2002-7-13

16

MCSE学习指南

书籍

SyngressMedia公司

人民邮电

2001-9-28

17

局域网原理与架设技术幕大公开

书籍

蔡昌均

中国青年

2001-9-28

19

AccessVBA根底

书籍

EvanCallahan

人民邮电

2001-9-28

20

中文版Access2001一册通

书籍

琳等

人民邮电

2001-9-28

21

书籍

SteveBrown

电子工业

2001-9-28

23

中文版

书籍

microsoft

中国青年

2001-9-28

24

Access中文版开发指南

书籍

AlisonBalter

人民邮电

2002-2-16

29

Access2002数据库系统开发实例导航

书籍

桂思强

中国铁道

2003-3-10

30

中国名陵——集中华古代名陵之大成

书籍

罗哲文等

百花文艺

2003-5-20

31

边缘部落——福音谷

书籍

林茨〔撰文摄影〕

教育

2003-5-20

为了比拟有代表性,这个查询中包含多种字段类型:

数字类型:

【书籍编号】、【单价】

字符类型:

【书名】、【类别】、【作者】、【】

日期类型:

【进书日期】

在多条件查询中,我们会使用除了【书籍编号】之外的其他字段作为查询条件。

其实,在下面介绍的窗体查询方法中,有些代码或思路也可以应用在其它窗体查询方法中,你对各种代码、方法和思路越熟练,就越能充分发挥它们的作用。

这篇文章我是从4月初开始构思,到5月中旬开始动笔,花费两周时间写成,里面包含了我对ACCESS窗体查询所积累的经验,对初学者和有一定VBA根底的人都有针对性的方法。

另外,希望其他精通ACCESS的高手提出意见。

二.制作主/子窗体的步骤

1.利用向导制作主窗体

现在的主窗体还太小,要已经以下步骤才能变成我们需要的主窗体〔如如下图〕:

①把窗体面积放大到足以容纳条件输入字段和子窗体,并调整所有控件的字体;

②把窗体的“记录源〞和各控件的“数据来源〞都删除〔很多初学者很容易犯的错误就是这里〕,把类别和改为组合框〔因为这些字段的可能值比拟少,直接选择就好,不必让用户输入〕;

③重新调整各字段的位置,并增加了两个空文本框和标签放在单价和进书日期后面〔因为我打算使用一个围来作查询条件,而不是一个固定的值,这样比拟符合实际〕;

④单价后面的两个文本框改名为“单价开始〞和“单价截止〞,进书日期后面的两个文本框改名为“进书日期开始〞和“进书日期截止〞;

⑤画一个矩形框包住所有查询条件,把矩形框背景设置为常规,背景色为深灰色,特殊样式为凹陷,此时矩形框覆盖了其它控件,要用菜单中“格式〞→“置于底层〞才能让它们显示出来;

⑥在窗体上用向导建立一个按钮,按钮标题是“查询〞,名称是“cmd查询〞先不管里面的代码,后面再修改;

⑦窗体属性中“记录选定器〞=否,“浏览按钮〞=否。

2.利用向导设计子窗体

①在主窗体中用工具箱中的“子窗体/子报表〞对象建立一个子窗体;

②以存书查询为记录源,选择所有字段;

③把子窗体命名为“存书查询子窗体〞;

④在主窗体上删除子窗体的标签,并重新调整子窗体的大小;

⑤关闭主窗体的设计视图,单独打开子窗体数据表视图,调整字体和行的大小。

现在,我们得到了如下的窗体:

现在还没有实际的查询功能,我们在后面要根据所使用的方法,修改窗体并增加一些其他的功能。

还有一些小的细节要注意,比如:

按TAB键后的获得光标的控件的顺序要在设计视图下,视图菜单的“TAB键次序〞来修改;有些文本框获得焦点后是否要打开输入法,比如输入单价和日期的地方要关闭,输入书名和作者的地方要打开,这些要在控件属性中设置。

三.查询方法1:

在查询中参加条件

这种方法对应的实例数据库是:

“〞。

1.设计查询

我们打开“存书查询〞设计视图如下:

在字段【书名】的准如此格写入:

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[书名]),'*','*'&[Forms]!

[存书查询窗体]!

[书名]&'*')

参加后的设计视图如下:

把这个式子解释一下:

LIKE:

是专门用于查询字符型字段的运算符,一般介绍ACCESS的书中都有它的用法。

ISNULL([Forms]!

[存书查询窗体]!

[书名]):

是用来判断窗体“存书查询窗体〞上面的“书名〞这个文本框是否是空的。

如果文本框是空的,如此:

ISNULL([Forms]!

[存书查询窗体]!

[书名])=TRUE〔真〕

如果文本框不是空的,如此:

ISNULL([Forms]!

[存书查询窗体]!

[书名])=FALSE〔假〕

IIF(expr,truepart,falsepart)函数:

expr必要参数。

用来判断真伪的表达式。

truepart必要参数。

如果expr为True,如此返回这局部的值或表达式。

falsepart必要参数。

如果expr为False,如此返回这局部的值或表达式。

所以当我们在窗体“存书查询窗体〞上面的“书名〞里写上“ACCESS〞,整个式子的结果是:

LIKE*ACCESS*

相当于查询所有书名中包含“ACCESS〞的书籍,这样可以实现模糊查询。

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[书名]),'*',[Forms]!

[存书查询窗体]!

[书名]&'*')

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[书名]),'*',[Forms]!

[存书查询窗体]!

[书名])

如果把准如此改为上面两句中的一句,同样情况下当我们在窗体“存书查询窗体〞上面的“书名〞里写上“ACCESS〞,整个式子的结果是:

LIKEACCESS*

LIKEACCESS

相当于查询以“ACCESS〞开头的书籍〔半模糊查询〕,或者书名就叫“ACCESS〞的书〔准确查询〕。

具体使用那一种形式的查询要根据你的实际情况来修改。

当我们在窗体“存书查询窗体〞上面的“书名〞里什么也没有写,整个式子的结果是:

LIKE*

相当于查询所有的有书名的书。

在书写查询准如此时,[Forms]!

[存书查询窗体]!

[书名]这样的窗体控件名很难写,这时你可以在准如此格点鼠标右键,选择生成器,出现如如下图的窗口:

在左边的树型列表框里找到控件所在的窗体,在中间列表框出现这个窗体包含的所有控件,双击控件名,就会出现“[Forms]!

[存书查询窗体]!

[书名]〞。

我们再把其他几个字段的查询准如此写出:

【类别】:

在窗体上是组合框,所以它肯定是个准确查询,跟【书名】一样,它是文本字段。

查询准如此如下:

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[类别]),'*',[Forms]!

[存书查询窗体]!

[类别])

【作者】:

跟【书名】一样,它是文本字段。

我也打算用模糊查询。

查询准如此如下:

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[作者]),'*','*'&[Forms]!

[存书查询窗体]!

[作者]&'*')

【】:

跟【类别】的情况完全一样。

查询准如此如下:

LikeIIf(IsNull([Forms]!

[存书查询窗体]!

[]),'*',[Forms]!

[存书查询窗体]!

[])

【单价】:

是一个数字字段,我在这里准备让用户可以查询“〞这样的围。

查询准如此如下:

BetweenIIf(IsNull([Forms]!

[存书查询窗体]!

[单价开始]),0,[Forms]!

[存书查询窗体]!

[单价开始])AndIIf(IsNull([Forms]!

[存书查询窗体]!

[单价截止]),5000,[Forms]!

[存书查询窗体]!

[单价截止])

BETWEENAND:

是查询符合某个围之的值所需的条件格式。

“BETWEEN1AND5〞相当于“【字段】≥1AND【字段】≤5〞。

根据前面讲解的IIF的容,我用一个表格来解释一下各种情况下这个式子的实际结果,便于大家理解:

〔0和5000是我事先在条件中设定的最小值和最大值〕

[单价开始]的值

[单价截止]的值

整个式子的实际结果

BETWEEN0AND5000

BETWEEN1.5AND5000

20

BETWEEN0AND20

【进书日期】:

是一个日期型字段,我在这里准备让用户可以查询“#2001-5-1#~#2002-5-1#〞这样的围。

查询准如此如下:

Between(IIf(IsNull([Forms]!

[存书查询窗体]!

[进书日期开始]),#2000-1-1#,[Forms]!

[存书查询窗体]!

[进书日期开始]))And(IIf(IsNull([Forms]!

[存书查询窗体]!

[进书日期截止]),#2099-12-31#,[Forms]!

[存书查询窗体]!

[进书日期截止]))

在这个式子中,#2000-1-1#和#2099-12-31#是我设定的两个默认的开始和截止日期。

如果用户不输入,就使用默认值了。

这和前面【单价】的情况是一样的。

2.设计按钮与代码

2.1查询按钮

查询按钮的代码非常简单,关键局部只有一句:

PrivateSubcmd查询_Click()

Me.存书查询子窗体.Requery'这句是关键

EndSub

Requery:

是用来重新查询控件的数据源,这样可以刷新子窗体显示的记录。

对于记录源是表或查询的控件如窗体、列表框、组合框等经常用Requery方法来刷新显示容。

2.2去除按钮

有了查询按钮的代码之后,大家就可以自己测试查询的效果了。

不过,每次想换一个查询的条件时要去除上一个条件输入的东西,有时候比拟麻烦。

我们再来设计一个去除条件的按钮,控件名称是“cmd去除〞,放在查询按钮的下面。

按钮的代码如下:

PrivateSubcmd去除_Click()

'下面这些控件的值要清空

Me.书名=Null

Me.类别=Null

Me.作者=Null

Me.=Null

Me.单价开始=Null

Me.单价截止=Null

Me.进书日期开始=Null

Me.进书日期截止=Null

Me.存书查询子窗体.Requery'清空之后一样要重新查询

EndSub

2.3打印按钮

有了查询结果,想打印出来,很简单。

由于报表的记录源就是“存书查询〞,所以在查询里设计的条件会直接在报表里表现出来。

我们只要用按钮向导制作一个预览报表的按钮就可以了。

我们把这个按钮放在子窗体下面的右边。

控件名称是“cmd预览报表〞。

由于完全是采用向导制作的,不需修改代码,所以我就不在这里列出代码了。

2.4导出EXCEL按钮

如果你觉得ACCESS的报表边框太难看,或者你想在报表上加上一些说明什么的。

你可能更愿意把数据导出到EXCEL里进展再加工。

为了初学者容易理解,我打算用一个宏来解决这个问题。

宏的设计如如下图:

现在,宏里“输出文件〞为空,运行时会自动跳出对话框让你选择保存目录和文件名。

如果你想保存在数据库所在目录下的“〞里,可以在“输出文件〞一栏里填入:

=[currentproject].[path]&"\查询结果.xls"

把这个宏存为“导出查询数据宏〞。

然后再在窗体里参加按钮。

当按钮向导出现后,直接取消。

在按钮的属性页里,先把按钮名称改为“cmd导出〞,在按钮的“单击事件〞里直接用下拉框选择“导出查询数据宏〞,如如下图。

这样就不必编写代码了。

3.增加统计功能

经常有人需要在主窗体上显示符合查询条件的记录总数,以与子窗体中某一字段的合计。

所以,我们也准备在主窗体上增加记录总数和单价的合计。

3.1子窗体上的设计

①单独打开子窗体的设计模式,在窗体页脚局部拉出一段窗体;

②在上面增加两个文本框:

一个是“txt计数〞,控件来源=Count(*),另一个是“txt单价合计〞,控件来源=Sum([单价]);

③在子窗体的窗体属性中设置:

浏览按钮=否,记录集类型=快照〔快照的运行速度快,占用存少,但不能编辑更新,正适合我们的需要〕;

3.2主窗体上的设计

①在子窗体下面的地方设计两个文本框“计数〞和“合计〞,把它们的标签改为“符合条件记录数:

〞和“单价合计:

〞;

②“计数〞文本框的控件来源=[存书查询子窗体].[Form].[txt计数],“合计〞文本框的控件来源=[存书查询子窗体].[Form].[txt单价合计];

③由于主窗体上的这两个文本框是自动计算的,为了区别,设置它们的是否有效=否,是否锁定=是,背景颜色=深灰色。

4.方法总结

现在,整个窗体就已经完成了。

大家可以使用各种条件组合来测试一下窗体的效果。

4.1本方法优点

在查询中参加条件这种方法比拟简单,只要在查询中设计好各字段的条件,那么窗体中的代码就非常少,而且在打印报表和导出数据方面也很容易设计,比拟适合初学ACCESS的人使用。

4.2本方法缺点

①对查询中的数据有限制,所有设计了条件的字段中必须是每条记录都有数据。

即使你在窗体中并没有在这个字段对应的文本框中输入条件。

举例来说,假设你在表“tb藏书情况〞中,把【书籍编号】=16对应的这本书的作者或单价删掉,在“存书查询窗体〞中,即使你不输入任何条件,【书籍编号】=16对应的这本书你也看不见。

②如果在某个查询组合下,子窗体上根本没有符合条件的记录,如此主窗体上的“记录数〞和“合计〞会显示“#错误〞。

如果把主窗体上的“记录数〞和“合计〞的控件来源改为:

=IIf(IsError([存书查询子窗体].[Form].[txt计数]),0,[存书查询子窗体].[Form].[txt计数])

=IIf(IsError([存书查询子窗体].[Form].[txt单价合计]),0,[存书查询子窗体].[Form].[txt单价合计])

如此不会出现“#错误〞,这是我在下面地址学到的:

c:

\iknow\docshare\data\cur_work\\access\topic.asp?

topic_id=8183&forum_id=44

③报表不能直接打开,每次打开报表就会跳出提示框要求输入条件。

四.查询方法2:

用VBA生成窗体筛选条件

这种方法对应的实例数据库是:

“〞。

主窗体的控件与“〞一样,只是按钮中的代码都改了。

子窗体如此完全一样。

“存书查询〞中不需要输入任何条件。

1.按钮代码设计

1.1查询按钮

本按钮代码的设计思想是根据主窗体上各个条件输入控件的值,用VBA代码生成一个条件组合的字符串作为子窗体的窗体筛选的条件。

'判断【书名】条件是否有输入的值

IfNotIsNull(Me.书名)Then

'有输入

strWhere=strWhere&"([书名]like'*"&Me.书名&"*')AND"

EndIf

&:

是字符串运算符,它和“+〞不同之处在于“&〞两边如果不是字符串表达式,它会自动把表达式的值变成字符串,省了你转换格式了。

"([书名]like'*":

英文双引号是VBA用来表示字符串的符号,两个双引号中间是一个字符串。

""两个双引号中间什么也没有,表示一个空字符串。

注意:

空字符串≠NULL〔空值〕。

所以IsNull("")=False。

'*ACCESS*':

英文单引号是SQL语句中用来表示字符串的符号,两个单引号中间是一个字符串。

〔SQL语句中也可以使用双引号来表示字符串,但在VBA代码生成SQL语句时,为了简化格式,一律用单引号表示SQL语句的字符串〕

[书名]:

用[]明确书名是一个字段名、表名或查询名。

使用[]的作用:

①可以明确中间是一个名字而不是函数;②当字段名、表名或查询名是ACCESS或VBA保存字〔如:

DATE、NOTE、TYPEOF等〕时,一定要用[]来标明;③当字段名、表名或查询名中包含特殊字符〔如[停止/截止日期]、[查询-合计]等〕时,一定要用[]来标明,否如此特殊字符会被当作算术运算符而导致出错。

Me.书名:

是“存书查询窗体〞上文本框“书名〞的值。

Me.书名=Me.书名.Value。

Me是对代码所在窗体的引用。

如果此时“存书查询窗体〞上文本框“书名〞的值是"ACCESS",那么此时strWhere的结果就是:

"([书名]like'*ACCESS*')AND"

跟查询方法1中一样,我们也可以改为半模糊查询和准确查询,代码如下:

strWhere=strWhere&"([书名]like'"&Me.书名&"*')AND"

strWhere=strWhere&"([书名]like'"&Me.书名&"')AND"

接着看关于【单价】的代码:

'判断【单价】条件是否有输入的值,由于有【单价开始】【单价截止】两个文本框

'所以要分开来考虑

IfNotIsNull(Me.单价开始)Then

'【单价开始】有输入

strWhere=strWhere&"([单价]>="&Me.单价开始&")AND"

EndIf

IfNotIsNull(Me.单价截止)Then

'【单价截止】有输入

strWhere=strWhere&"([单价]<="&Me.单价截止&")AND"

EndIf

这里用“>=〞“<=〞来代替“BETWEENAND〞,效果是一样的,只是不需要像查询方法1中那样如果不填数字,会分别写入0和5000。

再来看看关于【进书日期】的代码:

'判断【进书日期】条件是否有输入的值,由于有【进书日期开始】【进书日期截止】两个文本框

'所以要分开来考虑

IfNotIsNull(Me.进书日期开始)Then

'【进书日期开始】有输入

strWhere=strWhere&"([进书日期]>=#"&Format(Me.进书日期开始,"yyyy-mm-dd")&"#)AND"

EndIf

IfNotIsNull(Me.进书日期截止)Then

'【进书日期截止】有输入

strWhere=strWhere&"([进书日期]<=#"&Format(Me.进书日期截止,"yyyy-mm-dd")&"#)AND"

EndIf

使用Format(Me.进书日期开始,"yyyy-mm-dd"),而不是直接用,是因为有时候直接用的话,会因为计算机日期格式设置的不同而出现一些奇怪的问题。

ACCESS中的日期条件一直都是比拟麻烦的,不管是选择查询、追加查询还是交叉表查询,设置日期字段的条件都是要特别注意的。

〔像查询方法1中直接在查询准如此中引用控件值虽然不会出现类似问题,但交叉表查询中不能使用控件作为日期字段的条件。

'先在立即窗口显示一下strWhere的值,代码调试完成后可以取消下一句

Debug.PrintstrWhere

Debug.Print:

是专门用于调试的语句,它会把后面表达式的值显示在VB编辑器的立即窗口里。

在适当地地方插入Debug.Print可以检查程序运行的是否正确。

等全部调试完毕后,可以把他们都删掉。

'让子窗体应用窗体查询

Me.存书查询子窗体.Form.Filter=strWhere

Me.存书查询子窗体.Form.FilterOn=True

主窗体或单一窗体设置筛选字符串时用:

Me.Filter="…"或是Forms!

[XX窗体].Filter="…"。

'在子窗体筛选后要运行一下自编子程序CheckSubformCount()

CallCheckSubformCount

CheckSubformCount是一个自编的子程序,CALL是调用子程序的语句,也可以不写CALL直接用CheckSubformCount调用子程序。

1.2去除按钮

代码里都有说明,只讲以下的一段代码:

'根据ctl的控件类型来选择

CaseacTextBox'是文本框,要清空(注意,子窗体下面还有两个锁定的文本框不能赋值)

Ifctl.Locked=FalseThenctl.Value=Null

CaseacboBox'是组合框,也要清空

ctl.Value=Null

'其它类型的控件不处理

EndSelect

Next

意思是把当前窗体所有的控件都逐个引用一次〔子窗体控件的控件不算在〕。

这种用“ForEach[对象或属性]In[对象集合或属性集合]〞的遍历方法在ACCESS编程中属于比拟常见的用法,用处也很多。

比如最常见的检查窗体是否打开的代码中也有:

FunctionIsLoaded(strFrmNameAsString)AsBoolean

'确定一个窗体是否已被装载。

ConstconFormDesign=0

DimobjFormAsForm

IsLoaded=False

ForEachobjFormInForms

IfobjForm.FormName=strFrmNameThen

IfobjForm.CurrentView<>conFormDesignThen'窗体不是设计模式时

IsLoaded=True

ExitFunction'一旦找到了此窗体,就退出本函数。

EndIf

EndIf

Next

EndFunction

1.3预览报表按钮

预览报表按钮中关键是如下语句:

'在打开报表的同时把子窗体的筛选条件字符串也传递给报表,

'这样地话报表也会显示和子窗体一样的记录。

DoCmd.OpenReportstDoame,acPreview,,strWhere

在我曾经制作的另一个例子:

“打印当前记录的例子〞里也使用过类似的方法。

这个例子可以在.accxp./club/topic.cgi?

forum=2&t

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1