ACCESS窗体多条件查询/组合查询的方法
根居网上刘小军的示例和说明文档,结合自己的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
就这样可以进行多条件查询了。
共有 0 条评论