共计 2447 个字符,预计需要花费 7 分钟才能阅读完成。
提醒:本文最后更新于 2019-05-12 19:52,文中所关联的信息可能已发生改变,请知悉!
根居网上刘小军的示例和说明文档,结合自己的 ACCESS 数据库做了个窗体多条件查询。
1、建立主窗体
①建立需要查询的窗体,把需要查询的字段建立起来,把窗体面积放大到足以容纳条件输入字段和子窗体,并调整所有控件的字体;
②把窗体的“记录源”和各控件的“数据来源”都删除(很多初学者很容易犯的错误就是这里),把风格和制单改为组合框(因为这些字段的可能值比较少,直接选择就好,不必让用户输入);
③重新调整各字段的位置,
④重量后面的两个文本框改名为“大于重量”和“小于重量”,日期后面的两个文本框改名为“大于时间”和“小于时间”;
⑤画一个矩形框包住所有查询条件,把矩形框背景设置为常规,背景色为深灰色,特殊样式为凹陷,此时矩形框覆盖了其它控件,要用菜单中“格式”→“置于底层”才能让它们显示出来;
⑥在窗体上用向导建立一个按钮,按钮标题是“查询”和“全清”,先不管里面的代码,后面再修改;
⑦窗体属性中“记录选定器”=否,“浏览按钮”=否。
2、建立子窗体
①在主窗体中用工具箱中的“子窗体 / 子报表”对象建立一个子窗体;
②以存书查询为记录源,选择所有字段;
③把子窗体命名为“工艺单查询子窗体”;
④在主窗体上删除子窗体的标签,并重新调整子窗体的大小;
⑤关闭主窗体的设计视图,单独打开子窗体数据表视图,调整字体和行的大小。
现在,得到了如下的窗体:
3、查询方法:用 VBA 生成窗体筛选条件
3.1 查询按钮
本按钮代码的设计思想是根据主窗体上各个条件输入控件的值,用 VBA 代码生成一个条件组合的字符串作为子窗体的窗体筛选的条件。代码如下:
Private Sub 查询_Click()
Dim strWhere As String
strWhere =“”‘判断【品号】条件是否有输入的值
If Not IsNull(Me.[ 品号]) Then‘有输入
strWhere = strWhere &“([品号] like‘*”& Me. 品号 &“*’) and“End If‘判断【品名】条件是否有输入的值
If Not IsNull(Me.[ 品名]) Then‘有输入
strWhere = strWhere &“([品名] like‘*”& Me. 品名 &“*’) and“End If‘判断【成分】条件是否有输入的值
If Not IsNull(Me.[ 成分]) Then‘有输入
strWhere = strWhere &“([成分] like‘*”& Me. 成分 &“*’) and“End If‘判断【风格】条件是否有输入的值
If Not IsNull(Me.[ 风格]) Then‘有输入
strWhere = strWhere &“([风格] like‘”& Me. 风格 &“‘) and“End If‘判断【制单】条件是否有输入的值
If Not IsNull(Me.[ 制单]) Then‘有输入
strWhere = strWhere &“([制单] like‘”& Me. 制单 &“‘) and“End If‘判断【大于重量】条件是否有输入的值
If Not IsNull(Me.[ 大于重量]) Then‘有输入
strWhere = strWhere &“([重量] >=“& Me. 大于重量 &“) and“End If‘判断【小于重量】条件是否有输入的值
If Not IsNull(Me.[ 小于重量]) Then‘有输入
strWhere = strWhere &“([重量] <=“& Me. 小于重量 &“) and“End If‘判断【大于时间】条件是否有输入的值
If Not IsNull(Me.[ 大于时间]) Then‘有输入
strWhere = strWhere &“([日期] >= #”& Format(Me. 大于时间,“yyyy-mm-dd”) &“#) AND“End If‘判断【小于时间】条件是否有输入的值
If Not IsNull(Me.[ 小于时间]) Then‘有输入
strWhere = strWhere &“([日期] <= #”& Format(Me. 小于时间,“yyyy-mm-dd”) &“#) AND“End If‘如果输入了条件,那么 strWhere 的最后肯定有”AND“,这是我们不需要的,‘要用 LEFT 函数截掉这 5 个字符。If Len(strWhere) > 0 Then‘有输入条件
strWhere = Left(strWhere, Len(strWhere) – 5)
End If‘让子窗体应用窗体查询
Me. 工艺单查询子窗体.Form.Filter = strWhere
Me. 工艺单查询子窗体.Form.FilterOn = True
End Sub
3.2 清除按钮
代码里都有说明,只讲以下的一段代码:
Private Sub Command69_Click()‘Screen.PreviousControl.SetFocus‘DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
On Error GoTo Err_cmdCommand69_Click‘这里将使用 FOR EACH CONTROL 的方法来清除控件的值‘这在控件比较多的时候非常有用。‘================================
Dim ctl As Control
For Each ctl In Me.Controls‘根据 ctl 的控件类型来选择
Select Case ctl.ControlType
Case acTextBox‘是文本框,要清空 (注意,子窗体下面还有两个锁定的文本框不能赋值)
ctl.Value = Null
Case acComboBox‘是组合框,也要清空
ctl.Value = Null‘其它类型的控件不处理
End Select
Next‘取消子窗体的筛选
Me.[工艺单查询子窗体].Form.Filter =“”Me.[工艺单查询子窗体].Form.FilterOn = False
Exit_cmdCommand69_Click:
Exit Sub
Err_cmdCommand69_Click:
MsgBox Err.Description
Resume Exit_cmdCommand69_Click
End Sub
就这样可以进行多条件查询了。