【数据库学习】机房收费系统(二)组合查询

   机房的组合查询把数据库查询的方式变得复杂与细腻,组合查询也更便于,用户查询到自己所“心仪的”的数据。

拿机房收费系统里的操作员工作记录窗体为例,我们来具体了解一下组合查询。

【数据库学习】机房收费系统(二)组合查询_第1张图片


 1.首先将上述窗体的控件做好命名。

        字段名一列的三个控件分别为,combo1(0),combo1(1),combo1(2)

操作符一列的三个控件分别为,combo2(0),combo2(1),combo2(2)

查询内容一列的三个控件分别为,Text1(0),Text1(1),Text1(2)

组合关系一列的三个控件分别为,combo3(0),combo3(1),combo3(2)


2.窗体加载代码实现。

3.分析组合关系。

        【数据库学习】机房收费系统(二)组合查询_第2张图片

       上图解析:

上图的判断组合关系,目的在与:只有选择了组合关系,相应选项才可用。
        分四种情况分析

        第一层组合关系不为空
第一层组合关系不为空 第二层不为空
第一层组合关系为空 第二层不可用,并且清空

第二层组合关系为空 第三层不可用并且清空

参考代码:

Private Sub Combo3_Click(Index As Integer)
    '判断组合关系,只有选了组合关系,相应的选项才能用
    
    '第一个组合关系不为空的时候
    If Trim(Combo3(0).Text) = "与" Or Trim(Combo3(0).Text) = "或" Then
        '第二层的选项可用
        Combo1(1).Enabled = True
        Combo2(1).Enabled = True
        Text1(1).Enabled = True
    End If
    
    '第一个组关系不为空,且第二个组合关系不为空的时候
    If Not Trim(Combo3(0).Text) = "" Then
        If Trim(Combo3(1).Text) = "与" Or Trim(Combo3(1).Text) = "或" Then
        '第三层的选项可用
            Combo1(2).Enabled = True
            Combo2(2).Enabled = True
            Text1(2).Enabled = True
         End If
    End If
    
    '第一个组合关系为空,第二层选项不可用,且要清空
    If Trim(Combo3(0).Text) = "" Then
        Combo1(1).Enabled = False
        Combo2(1).Enabled = False
        Text1(1).Enabled = False
        Combo1(1).Text = ""
        Combo2(1).Text = ""
        Text1(1).Text = ""
    End If
        
     '第二个组合关系为空,第三层选项不可用,且要清空
     If Trim(Combo3(1).Text) = "" Then
        Combo1(2).Enabled = False
        Combo2(2).Enabled = False
        Text1(2).Enabled = False
        Combo1(2).Text = ""
        Combo2(2).Text = ""
        Text1(2).Text = ""
    End If
    
    
        
End Sub




4.查询逻辑


一:不用组合关系 (下图)


第一层从表中提取信息
如果选项内容为空,提示信息要完善
不为空,判断是否有数据
无数据,提示无数据
有数据,调用添加函数
记录集关闭

【数据库学习】机房收费系统(二)组合查询_第3张图片

二:使用一个组合关系(下图)


从表中提取数据
判断前两层选项是否有空
判断组合关系


判断数据库中是否有该数据
调用添加函数
释放记录集

三:用到两个组合关系(下图)


从表中提取数据
判断前三层是否有空
组合关系判断
两个组合关系都是 与
判断数据库中是否有该数据,调用添加函数,记录集释放
第一个是与 第二个是或
判断数据库中是否有该数据,调用添加函数,记录集释放
第一个是或 第二个是与
判断数据库中是否有该数据,调用添加函数,记录集释放
两个组合关系都是 或
判断数据库中是否有该数据,调用添加函数,记录集释放


组合查询,参考代码

'点击查询,考虑组合关系
'combo1是第一列的字段,combo运算符,
'text1是查询内容,combo3是组合关系
Private Sub cmdInquire_Click()
'    Dim mrc As ADODB.Recordset
'    Dim strtxtSQL As String
'    Dim MsgText As String
    
    
    '从值班表中提取信息,具体选择条件在下面出现
    strtxtSQL = "select * from worklog_Info where "
    
    '一:当不使用组合关系。
    If Combo3(0).Text = "" Then
    '判断选项是否为空,第一层选项为空时
        If Trim(Combo1(0).Text) = "" Or Trim(Combo2(0).Text) = "" Or Trim(Text1(0).Text) = "" Then
            MsgBox "请将选项内容填写完整!", vbOKOnly + vbExclamation, "警告"
            Exit Sub
        Else '第一层选项均不为空时,sql语句完整
            strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Combo2(0).Text & "'" & Text1(0).Text & "'"
            Set mrc = ExecuteSQL(strtxtSQL, MsgText)
            '判断数据库。数据库中没有该数据时
            If mrc.EOF Then
                MsgBox "无该条数据,请重新选择!", vbOKOnly + vbExclamation, "警告"
                Text1(0).SetFocus
                Text1(0).Text = ""
                myflexgrid.Clear
                Call jiazai
                Exit Sub
            Else
                Call tianjia   '调用添加函数,将信息加载给myflexgrid
            End If
         End If
    End If
    Set mrc = Nothing '释放mrc记录集
    
    '二:使用第一个组合关系
    '从表中提取数据
    strtxtSQL = "select * from worklog_Info where " 'where 后少一个空格
    '第一个组合关系不为空
    If Not Trim(Combo3(0).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) = "" Then
            MsgBox "请将选项内容填写完整!", vbOKOnly + vbExclamation, "警告"
            Exit Sub
        Else
            '如果组合关系为“与”
            If Combo3(0).Text = "与" Then
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                If mrc.EOF Then
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(1).SetFocus
                    Text1(1).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                 Else
                    Call tianjia
                 End If
            '如果组合关系为“或”
            Else
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Text1(1).Text & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                '判断数据库中是否有该数据
                '如果没有该数据
                If mrc.EOF Then
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(1).SetFocus
                    Text1(1).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                Else '如果有该数据
                    Call tianjia '调用添加函数
                End If
             End If
        End If
        Set mrc = Nothing '释放记录集
    End If
            
    
    
    '三:使用两个组合关系,涉及三层选项
    '从表中提取数据
    strtxtSQL = "select * from worklog_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
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                            & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _
                            "and" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                If mrc.EOF Then '91错误,未定义
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(2).SetFocus
                    Text1(2).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                 Else
                    Call tianjia
                 End If
        End If
       
       '一个组合关系为“与”,一个组合关系为“或”
        If Combo3(0).Text = "与" And Combo3(1).Text = "或" Then
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                            & " " & "and" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _
                            "or" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                If mrc.EOF Then
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(2).SetFocus
                    Text1(2).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                 Else
                    Call tianjia
                 End If
        End If
       
       '一个组合关系为“或”,一个组合关系为“与”
        If Combo3(0).Text = "或" And Combo3(1).Text = "与" Then
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                            & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _
                            "and" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                If mrc.EOF Then
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(2).SetFocus
                    Text1(2).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                 Else
                    Call tianjia
                 End If
        End If
       
       '两个组合关系都为“或”时
        If Combo3(0).Text = "或" And Combo3(1).Text = "或" Then
                strtxtSQL = strtxtSQL & filename(Combo1(0).Text) & " " & Trim$(Combo2(0).Text) & "'" & Trim(Text1(0).Text) & "'" _
                            & " " & "or" & " " & filename(Combo1(1).Text) & " " & Trim(Combo2(1).Text) & "'" & Trim(Text1(1).Text) & "'" & " " & _
                            "or" & " " & filename(Combo1(2).Text) & " " & Trim(Combo2(2).Text) & "'" & Trim(Text1(2).Text) & "'"
                Set mrc = ExecuteSQL(strtxtSQL, MsgText)
                If mrc.EOF Then
                    MsgBox "无该条记录,请重新选择!", vbOKOnly + vbExclamation, "警告"
                    Text1(2).SetFocus
                    Text1(2).Text = ""
                    myflexgrid.Clear
                    Call jiazai
                    Exit Sub
                 Else
                    Call tianjia
                 End If
        End If
        Set mrc = Nothing
    End If
 End If
 
   
       
End Sub





5.函数的定义

'定义一个函数,让数据库名称和选择框对应
Public Function filename(strfilename) As String
    Select Case strfilename
    
        Case "教师"
        filename = "UserID"
        Case "注册日期"
        filename = "LoginDate"
        Case "注册时间"
        filename = "LoginTime"
        Case "注销日期"
        filename = "LogoutDate"
        Case "注销时间"
        filename = "LogoutTime"
        Case "机器号"
        filename = "computer"
        Case "级别"
        filename = "level"
        Case "状态"
        filename = "status"
        
     End Select
     
End Function


6.定义添加过程。

Public Function tianjia() '定义一个添加函数,简化过程

    
    With myflexgrid
        .Rows = 1

        
    
     Do While Not mrc.EOF
        .Rows = .Rows + 1
        '.CellAlignment = 4
        .TextMatrix(.Rows - 1, 0) = Trim(mrc.Fields("UserID"))
        .TextMatrix(.Rows - 1, 1) = Trim(mrc.Fields("level"))
        .TextMatrix(.Rows - 1, 2) = Trim(mrc.Fields("LoginDate"))
        .TextMatrix(.Rows - 1, 3) = Trim(mrc.Fields("LoginTime"))
        .TextMatrix(.Rows - 1, 4) = Format(mrc.Fields("LogoutDate"))
        .TextMatrix(.Rows - 1, 5) = Format(mrc.Fields("LogoutTime"))
        .TextMatrix(.Rows - 1, 6) = VBA.Environ("computername")
        .TextMatrix(.Rows - 1, 7) = Trim(mrc.Fields("status"))
        
        mrc.MoveNext
     Loop
     End With
     mrc.Close
        
End Function


小结:组合查询总结出两点,一、不要着急动手敲代码,首先理清思路。

你可能感兴趣的:(数据库)