刚涉及做系统,对简单的查询还可以理清关系,在刚完成的机房收费系统中,组合查询可是着实让我思考了一番。
看一下组合查询窗体吧:
在这个系统中,这样的组合查询窗体有4个。而涉及到的查询字段次数有26次,而我们每次查询都是只是用一个SQL语句。如果全部分情况,按字段,逐一写SQL语句的话,那就得写N条了。写的麻烦不用说,关键大部分都是重复的代码,没有多少价值。所以我们可以把这些重复的代码进行提取,整合。当然这里的逻辑结构很重要,提取不好的话,查询逻辑上就有错误了。
逻辑结构
这里解释两个自定义函数。
第一个是字段判断函数FieldName:这里有字段的查询用到26次,但是其实只有14个字段。我们可以把字段的判断提取到一个函数中。在查询语句中只需调用字段判断函数值即可。
第二个是判断组合查询函数ComboInquire:这个函数依据组合框是否是空来判断是否组合查询。
查询特点:三个条件可以任意组合,不必一定是第一条和第二条组合,或者第一条,第二条,第三条组合;
在模板中定义了判断是否是组合查询的函数,和判断字段值的函数,其他窗体可以调用。
代码如下:
StrSql = "select * from Consumeinfo where " '定义公共查询语句在先 '判断各个文本框是否为空 If TxtIsEmpty(comboField1.Text) Or TxtIsEmpty(comboOperator1.Text) Or TxtIsEmpty(txtFieldValue1.Text) Then MsgBox "请把选项填完整再查询", vbOKOnly + vbCritical, "查询提示" GoTo proc_exit Else StrSql = StrSql & FieldName(comboField1.Text) & comboOperator1.Text & "'" & txtFieldValue1.Text & "'" End If '利用模版函数查看是否是组合查询 If ComboInquire(comboCombo1.Text) Then '是组合查询 If TxtIsEmpty(comboField2.Text) Or TxtIsEmpty(comboOperator2.Text) Or TxtIsEmpty(txtFieldValue2.Text) Then MsgBox "请把组合查询选项填完整再查询", vbOKOnly + vbCritical, "查询提示" GoTo proc_exit Else Select Case comboCombo1.Text Case "与" StrSql = StrSql & " And " & FieldName(comboField2.Text) & comboOperator2.Text & "'" & txtFieldValue2.Text & "'" Case "或" StrSql = StrSql & " Or " & FieldName(comboField2.Text) & comboOperator2.Text & "'" & txtFieldValue2.Text & "'" End Select End If End If '再次判断第三个条件,看是否是组合查询 If ComboInquire(comboCombo2.Text) Then '组合查询 If TxtIsEmpty(comboField3.Text) Or TxtIsEmpty(comboOperator3.Text) Or TxtIsEmpty(txtFieldValue3.Text) Then MsgBox "请把组合查询选项填完整再查询", vbOKOnly + vbCritical, "查询提示" GoTo proc_exit Else Select Case comboCombo2.Text Case "与" StrSql = StrSql & " And " & FieldName(comboField3.Text) & comboOperator3.Text & "'" & txtFieldValue3.Text & "'" Case "或" StrSql = StrSql & " Or " & FieldName(comboField3.Text) & comboOperator3.Text & "'" & txtFieldValue3.Text & "'" End Select End If End If '开始进行查找 Set objrs = ExecuteSQL(StrSql, StrMsg) objrs.Update If objrs.RecordCount = 0 Then MsgBox "没有您要查找的学生上机记录!", vbOKOnly + vbCritical, "查询提示" comboField1.SetFocus MSFlexGrid1.Rows = 1 GoTo proc_exit '存在上机记录查询成功,填充到表格 Else Dim Intindex As Integer MSFlexGrid1.Rows = 1 Do While Not objrs.EOF With MSFlexGrid1 .Rows = .Rows + 1 .TextMatrix(.Rows - 1, 0) = Intindex + 1 .TextMatrix(.Rows - 1, 1) = objrs!CID .TextMatrix(.Rows - 1, 2) = objrs!SName .TextMatrix(.Rows - 1, 3) = objrs!OnDate .TextMatrix(.Rows - 1, 4) = objrs!OnTime .TextMatrix(.Rows - 1, 5) = objrs!OffDate .TextMatrix(.Rows - 1, 6) = objrs!OffTime .TextMatrix(.Rows - 1, 7) = objrs!Cash .TextMatrix(.Rows - 1, 8) = objrs!Consumemoney End With Intindex = Intindex + 1 objrs.MoveNext Loop End If proc_exit: Set objrs = Nothing Exit Sub ’下面是模板函数*************************** '定义组合查询的字段选择函数 Public Function FieldName(StrFiledName As String) As String Select Case StrFiledName Case "卡号" FieldName = "CID" Case "姓名" FieldName = " SName" Case "上机日期" FieldName = "OnDate" Case "上机时间" FieldName = "OnTime" Case "下机日期" FieldName = "OffDate" Case "下机时间" FieldName = "OffTime" Case "教师姓名" FieldName = "TeacherName" Case "级别" FieldName = "TeacherType" Case "性别" FieldName = "Sex" Case "机器名" FieldName = "MachineName" Case "专业" FieldName = "Sdept" Case "班级" FieldName = "Sclass" Case "年级" FieldName = "Sgrade" Case "学院" FieldName = "SAccademy" Case "学号" FieldName = "SID" End Select End Function '定义函数:判断是否是组合查询 Public Function ComboInquire(StrCombo As String) As Boolean If StrCombo = "" Then ComboInquire = False Else ComboInquire = True End If End Function
有好的建议,欢迎大家一起交流。