ACCESS窗体查询实例要点(4)

2020-04-21 06:25

ACCESS常用的窗体查询方法及实例

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

\书名] like '*ACCESS*') AND \跟查询方法1中一样,我们也可以改为半模糊查询和精确查询,代码如下:

strWhere = strWhere & \书名] like '\书名 & \ strWhere = strWhere & \书名] like '\书名 & \接着看关于【单价】的代码:

'判断【单价】条件是否有输入的值,由于有【单价开始】【单价截止】两个文本框 '所以要分开来考虑 If Not IsNull(Me.单价开始) Then '【单价开始】有输入 strWhere = strWhere & \单价] >= \单价开始 & \ End If If Not IsNull(Me.单价截止) Then '【单价截止】有输入 strWhere = strWhere & \单价] <= \单价截止 & \ End If 这里用“>=”“<=”来代替“BETWEEN AND”,效果是一样的,只是不需要像查询方法1中那样如果不填数字,会分别写入0和5000。 再来看看关于【进书日期】的代码:

'判断【进书日期】条件是否有输入的值,由于有【进书日期开始】【进书日期截止】两个文本框 '所以要分开来考虑 If Not IsNull(Me.进书日期开始) Then '【进书日期开始】有输入 strWhere = strWhere & \进书日期] >= #\进书日期开始, \AND \ End If If Not IsNull(Me.进书日期截止) Then '【进书日期截止】有输入 strWhere = strWhere & \进书日期] <= #\进书日期截止, \AND \ End If 使用Format(Me.进书日期开始, \,而不是直接用Me.进书日期开始,是因为有时候直接用Me.进书日期开始的话,会因为计算机日期格式设置的不同而出现一些奇怪的问题。ACCESS中的日期条件一直都是比较麻烦的,不管是选择查询、追加查询还是交叉表查询,设置日期字段的条件都是要特别注意的。(像查询方法1中直接在查询准则中引用控件值虽然不会出现类似问题,但交叉表查询中不能

刘小军(Alex)2003-5

16

ACCESS常用的窗体查询方法及实例

使用控件作为日期字段的条件。)

'先在立即窗口显示一下strWhere的值,代码调试完成后可以取消下一句 Debug.Print strWhere DEBUG.PRINT:是专门用于调试的语句,它会把后面表达式的值显示在VB编辑器的立即窗口里。在适当地地方插入Debug.Print可以检查程序运行的是否正确。等全部调试结束后,可以把他们都删掉。

'让子窗体应用窗体查询 Me.存书查询子窗体.Form.Filter = strWhere Me.存书查询子窗体.Form.FilterOn = True 主窗体或单一窗体设置筛选字符串时用:

Me.Filter=\\或是 Forms![XX窗体].Filter=\…\。

'在子窗体筛选后要运行一下自编子程序CheckSubformCount() Call CheckSubformCount CheckSubformCount是一个自编的子程序,CALL是调用子程序的语句,也可以不写CALL直接用CheckSubformCount调用子程序。 1.2 清除按钮

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

For Each ctl In Me.Controls '根据ctl的控件类型来选择 Select Case ctl.ControlType Case acTextBox '是文本框,要清空(注意,子窗体下面还有两个锁定的文本框不能赋值) If ctl.Locked = False Then ctl.Value = Null Case acComboBox '是组合框,也要清空 ctl.Value = Null '其它类型的控件不处理 End Select Next FOR EACH CTL IN ME.CONTROLS:意思是把当前窗体内所有的控件都逐个引用一次(子窗体控件内的控件不算在内)。这种用“For Each [对象或属性] In [对象集合或属性集合]”的遍历方法在ACCESS编程中属于比较常见的用法,用处也很多。比如最常见的检查窗体是否打开的代码中也有:

Function IsLoaded(strFrmName As String) As Boolean ' 确定一个窗体是否已被装载。 刘小军(Alex)2003-5

17

ACCESS常用的窗体查询方法及实例

Const conFormDesign = 0 Dim objForm As Form IsLoaded = False For Each objForm In Forms If objForm.FormName = strFrmName Then If objForm.CurrentView <> conFormDesign Then '窗体不是设计模式时 IsLoaded = True Exit Function ' 一旦找到了此窗体,就退出本函数。 End If End If Next End Function 1.3 预览报表按钮

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

strWhere = Me.存书查询子窗体.Form.Filter '在打开报表的同时把子窗体的筛选条件字符串也传递给报表, '这样地话报表也会显示和子窗体相同的记录。 DoCmd.OpenReport stDocName, acPreview, , strWhere 在我曾经制作的另一个例子:“打印当前记录的例子”里也使用过类似的方法。这个例子可以在 http://www.accxp.com/club/topic.cgi?forum=2&topic=6281 下载。 关于DoCmd.OpenReport的详细帮助,可以在VBA帮助里找到。 1.4 导出按钮

导出方法只能把表或者查询的内容导出到EXCEL,但是不能把窗体上的记录集(RECORDSET)导出。所以我们要把子窗体的内容转变为一个查询。 我在查询中增加了一个“查询结果”,其中的设计随便就行,因为每次在使用这个查询之前,我们都会用DAO修改查询的SQL语句。 思路很简单,如果子窗体的筛选条件字符串是:

([类别] Like '书籍') AND ([单价]>=20) 那么,我们把“查询结果”的SQL语句改为:

SELECT * FROM 存书查询 WHERE ([类别] Like '书籍') AND ([单价]>=20) 刘小军(Alex)2003-5 18

ACCESS常用的窗体查询方法及实例

这样的话,“查询结果”的记录与子窗体里的记录就是相同的。 对应的代码如下:

strWhere = Me.存书查询子窗体.Form.Filter If strWhere = \ '没有条件 strSQL = \存书查询]\ Else '有条件 strSQL = \存书查询] WHERE \ End If 这一部分用来准备查询的SQL语句。

Set qdf = CurrentDb.QueryDefs(\查询结果\ qdf.SQL = strSQL qdf.Close Set qdf = Nothing 这一部分用来把做好的SQL语句放在查询中。

DoCmd.OutputTo acOutputQuery, \查询结果\这一部分的作用,和查询方法1中的“导出查询数据宏”的作用相同。运行时会自动跳出对话框让你选择保存目录和文件名。如果你想保存在数据库所在目录下的“查询结果.xls”里,可以把这一句改为:

strOutputFileName=CurrentProject.Path & \查询结果.xls\ DoCmd.OutputTo acOutputQuery, \查询结果\如果你想在文件名上保留时间,以便知道是什么时候做的查询,可以改为:

strOutputFileName=CurrentProject.Path & \查询结果-\ Format(Date(),\ DoCmd.OutputTo acOutputQuery, \查询结果\_:英文下划线表明下一行和本行是同一条语句,在语句比较长时,为了便于阅读,可以用这种方法把每行变短一些。下划线之前要有一个空格作分隔,不然可能会被当作字段名的一部分。 1.5 CheckSubformCount子程序

这段子程序的目的在代码中已经解释了。目前实例数据库中的代码中是用代码设置文本框的“控件来源”。也可以直接用代码设置控件的值(前提条件是在窗体的设计视图中,把两个文本框的控件来源都删掉,使控件变成未绑定)。此外,我再加几句代码,当子窗体无记录时,下面的导出和预览按钮都变成灰色。这

刘小军(Alex)2003-5

19

ACCESS常用的窗体查询方法及实例

样的软件显得更专业一些。代码如下:

If Me.存书查询子窗体.Form.Recordset.RecordCount > 0 Then '子窗体的记录数>0 Me.计数 = Me.[存书查询子窗体].[Form].[txt计数] Me.合计 = Me.[存书查询子窗体].[Form].[txt单价合计] Me.cmd导出.Enabled = True Me.cmd预览报表.Enabled = True Else '子窗体的记录数=0 Me.计数 = 0 Me.合计 = 0 Me.cmd导出.Enabled = False Me.cmd预览报表.Enabled = False End If 2. 方法总结

使用VBA来设置子窗体筛选条件的方法解决了方法1中的几个缺点,大家可以逐一测试。

但是编写这样的VBA代码需要对VBA比较熟悉,而且要求对逻辑运算有一定基础,不然在使用逻辑运算符AND/OR/NOT和括号组合时会出错。不太适合初学者使用。

刘小军(Alex)2003-5 20


ACCESS窗体查询实例要点(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:杭州市机制纸和纸板企业名录2018版501家 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: