机房收费——组合查询之逻辑结构

刚涉及做系统,对简单的查询还可以理清关系,在刚完成的机房收费系统中,组合查询可是着实让我思考了一番。

看一下组合查询窗体吧:

 

在这个系统中,这样的组合查询窗体有4个。而涉及到的查询字段次数有26次,而我们每次查询都是只是用一个SQL语句。如果全部分情况,按字段,逐一写SQL语句的话,那就得写N条了。写的麻烦不用说,关键大部分都是重复的代码,没有多少价值。所以我们可以把这些重复的代码进行提取,整合。当然这里的逻辑结构很重要,提取不好的话,查询逻辑上就有错误了。

 

逻辑结构

机房收费——组合查询之逻辑结构_第1张图片

 

这里解释两个自定义函数

第一个是字段判断函数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


有好的建议,欢迎大家一起交流。

 

你可能感兴趣的:(机房收费——组合查询之逻辑结构)