对于组合查询一开始接触感觉很难下手,其实在之前的学生中已经有涉及过了,只是过程和联系没有这么复杂,因为当时对组合查询的理解不过深入,所以到这里才不知道如何组合。
在做完整个组合查询之后,梳理思路如下:首先在combo的下拉列表中,由于涉及combo比较多依靠additem逐个添加,结果就是累死,所以For……next语句可以将一个combo循环N次,这也是机房当中可以优化的代码有很多,因为涉及到了很多可以重复循环的过程。
For a = 0 To 2
With Combo1(a)
.AddItem "卡号"
.AddItem "学号"
.AddItem "姓名"
.AddItem "性别"
.AddItem "系别"
.AddItem "年级"
.AddItem "班级"
End With
Next a
之所以叫组合查询,就要考虑组合关系,一共有七种组合 1.不选择组合关系 ,只有第一行可用 2.combo(0)=与 3.combo(1)=或 4.选择combo3(0)=或+combo3(1)=或 5.combo3(0)=或+combo3(1)=与 6.combo3(0)=与+combo3(1)=与 7.combo3(0)=与+combo3(1)=或
下面以最复杂的两个组合全选,涉及三层关系为例:
txtsql = "select * from student_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
txtsql = txtsql & FileName(Combo1(0).Text) & " " & Trim(Combo2(0).Text) & _
"'" & Trim(Text1(0).Text) & "'" & " " & "And" & " " & FileName(Combo1(1).Text) _
& " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'" & " " & "And" _
& " " & FileName(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF = True Then '数据库中无记录时
MsgBox "无此记录", vbOKOnly + vbExclamation, "警告!"
Combo1(2).SetFocus
Text1(2).Text = ""
Text1(1).Text = ""
Text1(0).Text = ""
mygrid1.Clear
Exit Sub
Else
Call public
End If
End If
'第一个组合关系为“与”,第二个组合关系为“或”
If Combo3(0).Text = "与" And Combo3(1).Text = "或" Then
txtsql = txtsql & FileName(Combo1(0).Text) & " " & Trim(Combo2(0).Text) & "'" & _
Trim(Text1(0).Text) & "'" & " " & "And" & " " & FileName(Combo1(1).Text) & _
" " & Trim$(Combo2(1).Text) & "'" & Text1(1).Text & "'" & " " & "or" & " " & _
FileName(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF = True Then '数据库中无记录时
MsgBox "无此记录", vbOKOnly + vbExclamation, "警告!"
Combo1(2).SetFocus
Text1(2).Text = ""
Text1(1).Text = ""
Text1(0).Text = ""
mygrid1.Clear
Exit Sub
Else
Call public
End If
End If
'第一个组合关系为“或”,第二个组合关系为“与”
If Combo3(0).Text = "或" And Combo3(1).Text = "与" Then
txtsql = txtsql & FileName(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" _
& Trim(Text1(0).Text) & "'" & " " & "or" & " " & FileName(Combo1(1).Text) _
& " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'" & " " & "and" & " " _
& FileName(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF = True Then '数据库中无记录时
MsgBox "无此记录", vbOKOnly + vbExclamation, "警告!"
Combo1(2).SetFocus
Text1(2).Text = ""
Text1(1).Text = ""
Text1(0).Text = ""
mygrid1.Clear
Exit Sub
Else
Call public
End If
End If
'第一个组合关系为“或”,第二个组合关系为“或”
If Combo3(0).Text = "或" And Combo3(1).Text = "或" Then
txtsql = txtsql & FileName(Combo1(0).Text) & " " & Trim(Combo2(0).Text) & "'" _
& Trim(Text1(0).Text) & "'" & " " & "or" & " " & FileName(Combo1(1).Text) _
& " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'" & " " & "or" & " " _
& FileName(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF Then '数据库中无记录时
MsgBox "无此记录", vbOKOnly + vbExclamation, "警告!"
Combo1(2).SetFocus
Text1(2).Text = ""
Text1(1).Text = ""
Text1(0).Text = ""
mygrid1.Clear
Exit Sub
Else
Call public
End If
End If
Set mrc = Nothing '释放记录集
End If
End If
注:call public 由于每一种组合可能性都需要在mshflexgrid中显示,所以定义了一个公用函数,每次都重复调用即可。
在查询数据库中,将combo下拉列表的字段名转换成数据库中的字段
Private Function FileName(strFileName As String) As String
Select Case strFileName
Case "卡号"
FileName = "cardno"
Case "学号"
FileName = "studentno"
Case "姓名"
FileName = "studentname"
Case "性别"
FileName = "sex"
Case "系别"
FileName = "department"
Case "年级"
FileName = "grade"
Case "班级"
FileName = "class"
End Select
End Function
总结:1、组合查询自己做还是很吃力的,所以一开始没有头绪。我也是参考了师哥师姐的博客,但是在参考完之后一定要回过头来重新思考这样才能变成自己脑子的东西,这才是站在巨人肩膀上,相反不是单纯为了实现功能,功能实现就过了,这是没有意思的。2、对一些功能的领悟够比如这个窗体当中有一个修改的功能,一开始以为只是完全的靠自己修改,后来才知道他的作用是通过选中mshflexgrid中的一行在修改界面显示这一行的数据,然后修改这一行并更新到数据库。3、代码书写的不够规范。没有明显的分行和注释,对一段代码的分行可以看出你对代码的理解程度,另外注释是必不可少的,现在由于整体的代码量很少不注释似乎没有什么影响,但是将来的编程过程中大量的代码不容易一眼找到你要修改的地方或者合作完成的程序如何让别人明白你编写部分的意思,这就是注释的作用。另外大家都会出现mshflexgrid中的单元格显示不完整数据的情况,一开始我也是以为控件属性或者居中显示的原因,后来发现是代码书写不规范,trim去空格不能少,这样规范书写组合查询就完成了。