前言:机房收费系统有三大难点:组合查询、下机和报表,那么在敲完基本窗体后,首先要面对的就是组合查询这一道大难题,果不其然,我在这里也卡了一段时间,经过昨天的探讨与查询,终于解决了这个问题,那么话不多说,我们开始研究吧:
组合查询,核心关键点如下:
1.组合查询的语法。组合查询需要涉及的SQL语法较为复杂,所以很容易出错;
2.函数的运用。由于在combo控件中显示的数据和你要从数据库中查的数据不一样,所以需要用函数来定义;
3.逻辑设计。这个自然不用多说,三个查询条件和两个组合,一旦你的逻辑出了问题,那么设计起来是会非常麻烦的,甚至无从下口。
界面如下:
逻辑图:
我设计的基本功能逻辑设计:开始只可以使用查询1,即无组合查询,只用一种条件进行查询;而当想使用组合查询时,点击组合关系1的combo控件,选定“与”或“或”,即可使frame2旗下的控件可用…以此类推,实现组合查询的功能
那么针对开头提到的函数怎么解决呢?因为combofields控件(查询1、2、3开头第一个combo控件)内部的可选项都是相同的,而我们在查询时需要使用数据库表内能识别的数据,所以进行函数定义即可:
Public Function FieldsName(StrFieldsName As String) As String
Select Case Trim(StrFieldsName)
Case "卡号"
FieldsName = "cardno"
Case "学号"
FieldsName = "studentno"
Case "姓名"
FieldsName = "studentname"
Case "性别"
FieldsName = "sex"
Case "学院"
FieldsName = "department"
Case "年级"
FieldsName = "grade"
Case "班级"
FieldsName = "class"
Case "与"
FieldsName = "and "
Case "或"
FieldsName = "or "
End Select
而针对之后的语句查询,代码如下:
Private Sub cmdInquire_Click()
txtSQL = "select * from student_info where "
'判断字段选择是否为空
If Trim(comboSign1.Text) = "" Or Trim(txtFind1.Text) = "" Or Trim(comboFields1.Text) = "" Then
Label6.Caption = "请您输入条件!"
Exit Sub
Else
'选择查询1
txtSQL = txtSQL & FieldsName(comboFields1.Text) & " " & comboSign1.Text & "'" & txtFind1.Text & "'"
'选择组合2
If Trim(comboRelate1.Text <> "") Then
'如果查询2有空值
If Trim(comboSign2.Text) = "" Or Trim(txtFind2.Text) = "" Or Trim(comboFields2.Text) = "" Then
Label6.Caption = "您已经选择了组合1查询!"
Exit Sub
'若查询2都有数据
Else
txtSQL = txtSQL & FieldsName(comboRelate1) & FieldsName(comboFields2.Text) & comboSign2.Text & "'" & txtFind2.Text & "'"
'选择组合3
If Trim(comboRelate2.Text <> "") Then
'如果三个查询3都为空
If Trim(comboSign3.Text) = "" Or Trim(txtFind3.Text) = "" Or Trim(comboFields3.Text) = "" Then
Label6.Caption = "您已经选择了组合2查询!"
Exit Sub
'若查询3都有数据
Else
txtSQL = txtSQL & FieldsName(comboRelate2) & FieldsName(comboFields3.Text) & comboSign3.Text & "'" & txtFind3.Text & "'"
End If
End If
End If
End If
End If
Set mrs = ExecuteSQL(txtSQL, MsgText)
With MyFlexGrid
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "姓名"
.TextMatrix(0, 3) = "性别"
.TextMatrix(0, 4) = "系别"
.TextMatrix(0, 5) = "年级"
.TextMatrix(0, 6) = "班级"
.TextMatrix(0, 7) = "金额"
.TextMatrix(0, 8) = "备注"
.TextMatrix(0, 9) = "类型"
.TextMatrix(0, 10) = "日期"
.TextMatrix(0, 11) = "时间"
Do While Not mrs.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(mrs!cardno)
.TextMatrix(.Rows - 1, 1) = Trim(mrs!studentno)
.TextMatrix(.Rows - 1, 2) = Trim(mrs!studentname)
.TextMatrix(.Rows - 1, 3) = Trim(mrs!sex)
.TextMatrix(.Rows - 1, 4) = Trim(mrs!department)
.TextMatrix(.Rows - 1, 5) = Trim(mrs!grade)
.TextMatrix(.Rows - 1, 6) = Trim(mrs!Class)
.TextMatrix(.Rows - 1, 7) = Trim(mrs!cash)
.TextMatrix(.Rows - 1, 8) = Trim(mrs!explain)
.TextMatrix(.Rows - 1, 9) = Trim(mrs!Status)
.TextMatrix(.Rows - 1, 10) = Trim(mrs!Date)
.TextMatrix(.Rows - 1, 11) = Trim(mrs!Time)
mrs.MoveNext
Loop
End With
End Sub
PS:其中,组合关系中的"与"和"或"在fieldsName(comborelate)中以及前面的函数定义有涉及,大家可以仔细留意其组合形式
总结:其实组合查询,说难也没有那么难,因为涉及的知识点都是我们之前在学生里也使用的,比如函数定义、组合查询语句;而说简单也不简单,因为逻辑关系较为复杂。只要仔细和耐心,遇到问题找他人来一起探讨,就没有目前解决不了的问题