写在前面:
组合查询顾名思义是多条件查询,关键就是确定在一定的条件下需要查询与这个条件想对应的内容,确定好查询内容之后,每一次查询都是在上一个条件基础上加一个条件的查询。
下面就看一下机房中复合查询值的关注的地方。
过程:
1.向combobox控件中填充信息
我在添加的时候就是一个个地添加,结果写了好长的代码,在这里值得学习是设置控件数组,利用索引来设置循环往控件里添加信息,具体的代码如下:
Private Sub Form_Load()
Dim i, j, k
Me.Height = 10185
Me.Width = 15135
Label1.Caption = "输入查询条" & Chr(13) & Chr(10) & "件(请在下" & Chr(13) & Chr(10) & "拉)菜单中" & Chr(13) & Chr(10) & "选择"
'用循环语句向combobox中填充信息
For i = 0 To 2
With combo1(i)
.AddItem "卡号"
.AddItem "学号"
.AddItem "姓名"
.AddItem "性别"
.AddItem "系别"
.AddItem "年级"
.AddItem "班级"
End With
Next i
For j = 0 To 2
With Combo2(j)
.AddItem "="
.AddItem "<"
.AddItem ">"
.AddItem "<>"
End With
Next j
For k = 0 To 1
With Combo3(k)
.AddItem "与"
.AddItem "或"
End With
Next k
End Sub
2.判断查询条件是否为空,定义了一个testtxt函数,当被查询的内容为空,则testtxt的值为false,否则为true.最后把值赋给isempty变量,这样就不需要一个个挨着判断了,不足之处就是用户会不知道该去填写哪个查询条件。
定义了一个testtxt函数用于判断被判断的内容是否为空
'定义一个检查文本框是否为空的函数
Public Function testtxt(txt As String) As Boolean '参数是txt,即文本框内容
If Trim(txt) = "" Then
testtxt = False
Else
testtxt = True
End If
End Function
把判断结果返回给isempty,这样一下子就可以判断几个文本框或comboboxl里的内容是否为空。
'判断查询条件是否为空,用到了函数
isempty0 = testtxt(combo1(0).Text) Or testtxt(Combo2(0).Text) Or testtxt(txtinquire(0).Text)
If isempty0 = False Then
MsgBox "请输入查询条件", vbOKOnly, "提示"
Exit Sub
End If
If Combo3(0).Text <> "" Then
isempty1 = isempty0 Or testtxt(combo1(1).Text) Or testtxt(Combo2(1).Text) Or testtxt(txtinquire(1).Text)
If isempty1 = False Then
MsgBox "请输入查询条件", vbOKOnly, "提示"
Exit Sub
End If
'Exit Sub
End If
If Combo3(1).Text <> "" Then
isempty2 = isempty0 Or isempty1 Or testtxt(Combo3(0).Text) Or testtxt(combo1(2).Text) Or testtxt(Combo2(2).Text) Or testtxt(txtinquire(2).Text)
If isempty2 = False Then
MsgBox "请输入查询条件", vbOKOnly, "提示"
Exit Sub
End If
End If
'把汉字转换成数据库中的字段名,可以自定义一个fieldname函数实现
Private Function fieldname(strfieldname As String) As String
Select Case strfieldname
Case "卡号"
fieldname = "cardno"
Case "学号"
fieldname = "studentno"
Case "姓名"
fieldname = "studentname"
Case "性别"
fieldname = "sex"
Case "系别"
fieldname = "department"
Case "年级"
fieldname = "grade"
Case "班级"
fieldname = "class"
End Select
End Function
Private Function fieldname1(strfieldname As String) As String
Select Case strfieldname
Case "与"
fieldname1 = "and"
Case "或"
fieldname1 = "or"
End Select
End Function
4.组合条件的查询,到这里的时候像热锅上的蚂蚁,不知道怎么是好,现在把思路理清楚了,感觉没有那么麻烦了
遇到的问题:
(1).没有理清楚思路,每个下拉列表框那么多的条件,不知道该怎么去写代码了,另外一方面要判断查询条件是否为空,条件很多,一时没有找到好的解决方法,另一方面要确定查询的内容组合,把这两部分掺杂在了一起,没有分成小的模块,思路没有清楚。
(2).没有想到复合查询其实就是在上一个条件基础上的查询。
其实符合查询在敲学生信息管理系统的时候用到过,现在就来看看学生与机房在组合查询上的区别以及共同之处吧,方便更好地学习。
学生信息管理系统:
这是学生中查询成绩信息的窗体:
代码:
首先写txtsql查询语句
txtSQL = "select * from result_info where "
一个条件的查询:当1中有学号信息时
If Check(0).Value Then
If Trim(Txtsid.Text) = "" Then
MsgBox "学号不能为空", vbOKOnly + vbExclamation, "提示"
Txtsid.SetFocus
Exit Sub
Else
dd(0) = True '作标记,第一个条件被选中
txtSQL = txtSQL & "student_id= '" & Trim(Txtsid.Text) & "'"
End If
End If
两个条件的查询:2中有姓名信息时
If Check(1).Value Then
If Trim(txtname.Text) = "" Then
MsgBox "姓名不能为空", vbOKOnly + vbExclamation, "提示"
txtname.SetFocus
Exit Sub
Else
dd(1) = True
If dd(0) = True Then '如果第一个条件也被选中
txtSQL = txtSQL & " and student_name= '" & txtname.Text & "'"
Else '第一个条件没有被选中,只选中了第二个条件
txtSQL = txtSQL & "student_name= '" & txtname.Text & "'"
End If
End If
End If
三个条件的查询:3中有课程信息时
If Check(2).Value Then
If Trim(txtcourse.Text) = "" Then
MsgBox "课程不能为空!", vbOKOnly + vbExclamation, "提示"
txtcourse.SetFocus
Exit Sub
Else
dd(2) = True '第三个条件被选中
If dd(0) Or dd(1) Then '第一个条件或者第二个条件被选中
txtSQL = txtSQL & "and course_name= '" & txtcourse.Text & "'"
Else '前两个条件都没有被选中
txtSQL = txtSQL & "course_name= '" & txtcourse.Text & "'"
End If
End If
End If
机房收费系统:
以学生基本信息维护窗体为例:
当没有4与5的时候,只对1条件进行查询,当4中有组合关系时,对1和2两个条件进行组合查询,当5中有组合关系时,对1,2,3三个条件进行组合查询。
代码如下:
'一个条件的查询
txtsql = "select * from student_info where " & fieldname(combo1(0).Text) & Combo2(0).Text & "'" & Trim(txtinquire(0).Text) & "'"
If Combo3(0).Text <> "" Then
'添加第二个条件的查询
txtsql = txtsql & fieldname1(Combo3(0).Text) & " " & fieldname(combo1(1).Text) & Combo2(1).Text & "'" & Trim(txtinquire(1).Text) & "'"
End If
If Combo3(1).Text <> "" Then
'添加第三个条件的查询
txtsql = txtsql & fieldname1(Combo3(1).Text) & " " & fieldname(combo1(2).Text) & Combo2(2).Text & " '" & Trim(txtinquire(2).Text) & "'"
End If
Set mrc = executesql(txtsql, msgtext)
经过与学生信息管理系统进行对比,我们会发现组合查询其实没有实质性的区别,复合查询都是在上一个条件的基础上加一个条件的查询。
总结:
思想:学习过程中颗粒归仓,及时总结,多寻找联系,多建立联系,每遇到一个完全陌生的问题的时候,要想以前是否遇见过,要相信用于都没有孤立的知识单独存在,建立知识网。另外在写程序之前一定要先理清思路。
技术:对于复杂,重复的操作,我们可以定义一个函数实现,用的时候直接调用该函数就可以,提高程序的复用性。对于多条件的查询,把复杂问题简单化,化成在原来基础上加一个条件的查询。