机房的组合查询把数据库查询的方式变得复杂与细腻,组合查询也更便于,用户查询到自己所“心仪的”的数据。
拿机房收费系统里的操作员工作记录窗体为例,我们来具体了解一下组合查询。
1.首先将上述窗体的控件做好命名。
字段名一列的三个控件分别为,combo1(0),combo1(1),combo1(2)
操作符一列的三个控件分别为,combo2(0),combo2(1),combo2(2)
查询内容一列的三个控件分别为,Text1(0),Text1(1),Text1(2)
组合关系一列的三个控件分别为,combo3(0),combo3(1),combo3(2)
2.窗体加载代码实现。
3.分析组合关系。
上图解析:
上图的判断组合关系,目的在与:只有选择了组合关系,相应选项才可用。
分四种情况分析
第一层组合关系不为空
第一层组合关系不为空 第二层不为空
第一层组合关系为空 第二层不可用,并且清空
第二层组合关系为空 第三层不可用并且清空
参考代码:
Private Sub Combo3_Click(Index As Integer) '判断组合关系,只有选了组合关系,相应的选项才能用 '第一个组合关系不为空的时候 If Trim(Combo3(0).Text) = "与" Or Trim(Combo3(0).Text) = "或" Then '第二层的选项可用 Combo1(1).Enabled = True Combo2(1).Enabled = True Text1(1).Enabled = True End If '第一个组关系不为空,且第二个组合关系不为空的时候 If Not Trim(Combo3(0).Text) = "" Then If Trim(Combo3(1).Text) = "与" Or Trim(Combo3(1).Text) = "或" Then '第三层的选项可用 Combo1(2).Enabled = True Combo2(2).Enabled = True Text1(2).Enabled = True End If End If '第一个组合关系为空,第二层选项不可用,且要清空 If Trim(Combo3(0).Text) = "" Then Combo1(1).Enabled = False Combo2(1).Enabled = False Text1(1).Enabled = False Combo1(1).Text = "" Combo2(1).Text = "" Text1(1).Text = "" End If '第二个组合关系为空,第三层选项不可用,且要清空 If Trim(Combo3(1).Text) = "" Then Combo1(2).Enabled = False Combo2(2).Enabled = False Text1(2).Enabled = False Combo1(2).Text = "" Combo2(2).Text = "" Text1(2).Text = "" End If End Sub
4.查询逻辑
一:不用组合关系 (下图)
第一层从表中提取信息
如果选项内容为空,提示信息要完善
不为空,判断是否有数据
无数据,提示无数据
有数据,调用添加函数
记录集关闭
二:使用一个组合关系(下图)
从表中提取数据
判断前两层选项是否有空
判断组合关系
与
或
判断数据库中是否有该数据
调用添加函数
释放记录集
三:用到两个组合关系(下图)
从表中提取数据
判断前三层是否有空
组合关系判断
两个组合关系都是 与
判断数据库中是否有该数据,调用添加函数,记录集释放
第一个是与 第二个是或
判断数据库中是否有该数据,调用添加函数,记录集释放
第一个是或 第二个是与
判断数据库中是否有该数据,调用添加函数,记录集释放
两个组合关系都是 或
判断数据库中是否有该数据,调用添加函数,记录集释放
组合查询,参考代码
'点击查询,考虑组合关系 'combo1是第一列的字段,combo运算符, 'text1是查询内容,combo3是组合关系 Private Sub cmdInquire_Click() ' Dim mrc As ADODB.Recordset ' Dim strtxtSQL As String ' Dim MsgText As String '从值班表中提取信息,具体选择条件在下面出现 strtxtSQL = "select * from worklog_Info where " '一:当不使用组合关系。 If Combo3(0).Text = "" Then '判断选项是否为空,第一层选项为空时 If Trim(Combo1(0).Text) = "" Or Trim(Combo2(0).Text) = "" Or Trim(Text1(0).Text) = "" Then MsgBox "请将选项内容填写完整!", vbOKOnly + vbExclamation, "警告" Exit Sub Else '第一层选项均不为空时,sql语句完整 strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Combo2(0).Text & "'" & Text1(0).Text & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) '判断数据库。数据库中没有该数据时 If mrc.EOF Then MsgBox "无该条数据,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(0).SetFocus Text1(0).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia '调用添加函数,将信息加载给myflexgrid End If End If End If Set mrc = Nothing '释放mrc记录集 '二:使用第一个组合关系 '从表中提取数据 strtxtSQL = "select * from worklog_Info where " 'where 后少一个空格 '第一个组合关系不为空 If Not Trim(Combo3(0).Text) = "" Then '判断前两层的选项是否有空 If Trim(Combo1(0).Text) = "" Or Trim(Combo2(0).Text) = "" Or Trim(Text1(0).Text) = "" _ Or Trim(Combo1(1).Text) = "" Or Trim(Combo2(1).Text) = "" Or Trim(Text1(1).Text) = "" Then MsgBox "请将选项内容填写完整!", vbOKOnly + vbExclamation, "警告" Exit Sub Else '如果组合关系为“与” If Combo3(0).Text = "与" Then strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) If mrc.EOF Then MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(1).SetFocus Text1(1).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia End If '如果组合关系为“或” Else strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) '判断数据库中是否有该数据 '如果没有该数据 If mrc.EOF Then MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(1).SetFocus Text1(1).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else '如果有该数据 Call tianjia '调用添加函数 End If End If End If Set mrc = Nothing '释放记录集 End If '三:使用两个组合关系,涉及三层选项 '从表中提取数据 strtxtSQL = "select * from worklog_Info where " If Not Trim(Combo3(1).Text) = "" Then '判断前两层的选项是否有空 If Trim(Combo1(0).Text) = "" Or Trim(Combo2(0).Text) = "" Or Trim(Text1(0).Text) = "" _ Or Trim(Combo1(1).Text) = "" Or Trim(Combo2(1).Text) = "" Or Trim(Text1(1).Text) = "" _ Or Trim(Combo1(2).Text) = "" Or Trim(Combo2(2).Text) = "" Or Trim(Text1(2).Text) = "" Then MsgBox "请将选项内容填写完整!", vbOKOnly + vbExclamation, "警告" Exit Sub Else '两个组合关系均为“与”时 If Combo3(0).Text = "与" And Combo3(1).Text = "与" Then strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _ "and" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) If mrc.EOF Then '91错误,未定义 MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(2).SetFocus Text1(2).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia End If End If '一个组合关系为“与”,一个组合关系为“或” If Combo3(0).Text = "与" And Combo3(1).Text = "或" Then strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _ "or" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) If mrc.EOF Then MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(2).SetFocus Text1(2).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia End If End If '一个组合关系为“或”,一个组合关系为“与” If Combo3(0).Text = "或" And Combo3(1).Text = "与" Then strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _ "and" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) If mrc.EOF Then MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(2).SetFocus Text1(2).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia End If End If '两个组合关系都为“或”时 If Combo3(0).Text = "或" And Combo3(1).Text = "或" Then strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _ & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _ "or" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'" Set mrc = ExecuteSQL(strtxtSQL, MsgText) If mrc.EOF Then MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告" Text1(2).SetFocus Text1(2).Text = "" myflexgrid.Clear Call jiazai Exit Sub Else Call tianjia End If End If Set mrc = Nothing End If End If End Sub
5.函数的定义
'定义一个函数,让数据库名称和选择框对应 Public Function filename(strfilename) As String Select Case strfilename Case "教师" filename = "UserID" Case "注册日期" filename = "LoginDate" Case "注册时间" filename = "LoginTime" Case "注销日期" filename = "LogoutDate" Case "注销时间" filename = "LogoutTime" Case "机器号" filename = "computer" Case "级别" filename = "level" Case "状态" filename = "status" End Select End Function
6.定义添加过程。
Public Function tianjia() '定义一个添加函数,简化过程 With myflexgrid .Rows = 1 Do While Not mrc.EOF .Rows = .Rows + 1 '.CellAlignment = 4 .TextMatrix(.Rows - 1, 0) = Trim(mrc.Fields("UserID")) .TextMatrix(.Rows - 1, 1) = Trim(mrc.Fields("level")) .TextMatrix(.Rows - 1, 2) = Trim(mrc.Fields("LoginDate")) .TextMatrix(.Rows - 1, 3) = Trim(mrc.Fields("LoginTime")) .TextMatrix(.Rows - 1, 4) = Format(mrc.Fields("LogoutDate")) .TextMatrix(.Rows - 1, 5) = Format(mrc.Fields("LogoutTime")) .TextMatrix(.Rows - 1, 6) = VBA.Environ("computername") .TextMatrix(.Rows - 1, 7) = Trim(mrc.Fields("status")) mrc.MoveNext Loop End With mrc.Close End Function
小结:组合查询总结出两点,一、不要着急动手敲代码,首先理清思路。