机房的组合查询把数据库查询的方式变得复杂与细腻,组合查询也更便于,用户查询到自己所“心仪的”的数据。
拿机房收费系统里的操作员工作记录窗体为例,我们来具体了解一下组合查询。
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
小结:组合查询总结出两点,一、不要着急动手敲代码,首先理清思路。