组合查询(第一次机房收费系统)

欢迎您的阅读, 经过了一周的不屑努力,终于攻克了,当然还是要感谢张铎同学和晓尚同学的帮助!
这里写图片描述

指导思想

通过拼接一条SQL语句,实现对数据的查询。

代码

1、根据选择的不同组合关系,判断控件的使用
注意:我利用的Timer控件。

Private Sub Timer0_1_Timer()
    '判断第一组控件
    If Trim(comboCombineRelation0.Text) = "与" Or Trim(comboCombineRelation0.Text) = "或" Then
        '激活控件
        comboField(1).Enabled = True
        comboOpSign1.Enabled = True
        txtInquiryContent1.Enabled = True
        comboCombineRelation1.Enabled = True
            '判断第二组控件
            If Trim(comboCombineRelation1.Text) = "与" Or Trim(comboCombineRelation1.Text) = "或" Then
                '激活控件
                comboField(2).Enabled = True
                comboOpSign2.Enabled = True
                txtInquiryContent2.Enabled = True
            Else
                '关闭控件
                comboField(2).Text = ""
                comboOpSign2.Text = ""
                txtInquiryContent2.Text = ""
                comboField(2).Enabled = False
                comboOpSign2.Enabled = False
                txtInquiryContent2.Enabled = False
            End If
    Else
        '关闭第一组控件
        comboField(1).Text = ""
        comboOpSign1.Text = ""
        txtInquiryContent1.Text = ""
        comboCombineRelation1.Text = ""
        comboField(1).Enabled = False
        comboOpSign1.Enabled = False
        txtInquiryContent1.Enabled = False
        comboCombineRelation1.Enabled = False
        '关闭第二组控件
        comboField(2).Text = ""
        comboOpSign2.Text = ""
        txtInquiryContent2.Text = ""
        comboField(2).Enabled = False
        comboOpSign2.Enabled = False
        txtInquiryContent2.Enabled = False
    End If
End Sub

2、根据选择的不同的字段名,出现不同的操作符
提示:利用一个控件进行举例!

Private Sub comboOpSign0_dropdown()
    '清空内容
    comboOpSign0.Clear
    '根据选择的同内容,出现不同的操作符
     If Trim(comboField(0).Text) = "姓名" Or Trim(comboField(0).Text) = "备注" Then
            comboOpSign0.AddItem "="
            comboOpSign0.AddItem "<>"
    Else
        comboOpSign0.AddItem "="
        comboOpSign0.AddItem "<"
        comboOpSign0.AddItem ">"
        comboOpSign0.AddItem "<>"
    End If
End Sub

3、根据不同的字段名,使用不同的控件

Private Sub comboField_Click(Index As Integer)
    '判断第一个字段名,根据不同的内容,显示不同的控件
    If Trim(comboField(0).Text) <> "上机日期" And Trim(comboField(0).Text) <> "下机日期" _
          And Trim(comboField(0).Text) <> "上机时间" And Trim(comboField(0).Text) <> "下机时间" _
          And Trim(comboField(0).Text) <> "" Then
        txtInquiryContent0.Visible = True
        myPicker0.Visible = False
    Else
        '如果是日期或者时间
        If Trim(comboField(0).Text) = "上机日期" Or Trim(comboField(0).Text) = "下机日期" Then
            txtInquiryContent0.Visible = False
            myPicker0.Visible = True
            myPicker0.Format = dtpCustom
        Else
            '如果是时间
            If Trim(comboField(0).Text) = "上机时间" Or Trim(comboField(0).Text) = "下机时间" Then
                txtInquiryContent0.Visible = False
                myPicker0.Visible = True
                myPicker0.Format = dtpTime
            End If
        End If
    End If

    '判断第二个字段名,根据不同的内容,显示不同的控件
    If Trim(comboField(1).Text) <> "上机日期" And Trim(comboField(1).Text) <> "下机日期" _
          And Trim(comboField(1).Text) <> "上机时间" And Trim(comboField(1).Text) <> "下机时间" _
            And Trim(comboField(1).Text) <> "" Then
        txtInquiryContent1.Visible = True
        myPicker1.Visible = False
    Else
        '如果是日期或者时间
        If Trim(comboField(1).Text) = "上机日期" Or Trim(comboField(1).Text) = "下机日期" Then
            txtInquiryContent1.Visible = False
            myPicker1.Visible = True
            myPicker1.Format = dtpCustom
        Else
            '如果是时间
            If Trim(comboField(1).Text) = "上机时间" Or Trim(comboField(1).Text) = "下机时间" Then
                txtInquiryContent1.Visible = False
                myPicker1.Visible = True
                myPicker1.Format = dtpTime
            End If
        End If
    End If


    '判断第三个字段名,根据不同的内容,显示不同的控件
    If Trim(comboField(2).Text) <> "上机日期" And Trim(comboField(2).Text) <> "下机日期" _
          And Trim(comboField(2).Text) <> "上机时间" And Trim(comboField(2).Text) <> "下机时间" _
          And Trim(comboField(2).Text) <> "" Then
        txtInquiryContent2.Visible = True
        myPicker2.Visible = False
    Else
        '如果是日期或者时间
        If Trim(comboField(2).Text) = "上机日期" Or Trim(comboField(2).Text) = "下机日期" Then
            txtInquiryContent2.Visible = False
            myPicker2.Visible = True
            myPicker2.Format = dtpCustom
        Else
            '如果是时间
            If Trim(comboField(2).Text) = "上机时间" Or Trim(comboField(2).Text) = "下机时间" Then
                txtInquiryContent2.Visible = False
                myPicker2.Visible = True
                myPicker2.Format = dtpTime
            End If
        End If
    End If



End Sub

4、根据不同的字段名,选择出不同的列名(为了降低代码量)

'选择不同的默认值
Public Function FileName(comboField$) As String
    Select Case Trim(comboField)
        Case "卡号"
            FileName = "cardno"
        Case "姓名"
            FileName = "studentname"
        Case "上机日期"
            FileName = "ondate"
        Case "上机时间"
            FileName = "ontime"
        Case "下机日期"
            FileName = "offdate"
        Case "下机时间"
            FileName = "offtime"
        Case "消费金额"
            FileName = "consume"
        Case "金额"
            FileName = "cash"
        Case "备注"
            FileName = "status"
    End Select
End Function

5、将”与”和”或”转换为”or” 和”and”

Public Function Sign(CombineRelation$) As String
    Select Case Trim(CombineRelation)
        Case "与"
            Sign = "and "
        Case "或"
            Sign = "or "
    End Select
End Function

6、查询部分

Private Sub cmdInquiry_Click()
    '添加表头
    With myFlexGrid
        .Rows = 1 '设置行数
        .Col = 4
        .CellAlignment = 4 '设置文本格式
        .ColAlignment = 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) = "备注"
    End With
    '判断字段名是否为空
    If Trim(comboField(0).Text) = "" Then
        comboField(0).BackColor = vbRed
        comboField(0).SetFocus
    Else
        comboField(0).BackColor = vbWhite
    End If

    '判断操作符是否为空
    If Trim(comboOpSign0.Text) = "" Then
        comboOpSign0.BackColor = vbRed
        comboOpSign0.SetFocus
    Else
        comboOpSign0.BackColor = vbWhite
    End If

    Select Case Trim(comboField(0).Text)
        '判断为日期类吗
        Case "上机日期"
            myPicker0.MaxDate = Date
            If Format(myPicker0.Value, "yyyy-MM-dd") > Format(myPicker0.MaxDate, "yyyy-MM-dd") Then
                MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                Exit Sub
            End If
            txtInquiryContent0.Text = Format(myPicker0.Value, "yyyy-MM-dd")
        Case "下机日期"
            myPicker0.MaxDate = Date
            If Format(myPicker0.Value, "yyyy-MM-dd") > Format(myPicker0.MaxDate, "yyyy-MM-dd") Then
                MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                Exit Sub
            End If
            txtInquiryContent0.Text = Format(myPicker0.Value, "yyyy-MM-dd")
        '判断为时间类吗
        Case "上机时间"
            txtInquiryContent0.Text = Format(myPicker0.Value, "hh:mm:ss")
        Case "下机时间"
        txtInquiryContent0.Text = Format(myPicker0.Value, "hh:mm:ss")
        '为其他
        Case Else
            If Trim(txtInquiryContent0.Text) = "" Then
                txtInquiryContent0.BackColor = vbRed
                txtInquiryContent0.SetFocus
            Else
                txtInquiryContent0.BackColor = vbWhite
            End If
    End Select
    '如果一个逻辑关系为空
    If Trim(comboCombineRelation0.Text) = "" Then
        txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'"

    Else
            '判断第二个字段名为空
            If Trim(comboField(1).Text) = "" Then
                comboField(1).BackColor = vbRed
                comboField(1).SetFocus
            Else
                comboField(1).BackColor = vbWhite
            End If

            '判断第二个操作符为空
            If Trim(comboOpSign1.Text) = "" Then
                comboOpSign1.BackColor = vbRed
                comboOpSign1.SetFocus
            Else
                comboOpSign1.BackColor = vbWhite
            End If


            '根据不同的选择值,选择不同控件中的值
            Select Case Trim(comboField(1).Text)
                '判断为日期类吗
                Case "上机日期"
                    myPicker1.MaxDate = Date
                    If Format(myPicker1.Value, "yyyy-MM-dd") > Format(myPicker1.MaxDate, "yyyy-MM-dd") Then
                        MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                        Exit Sub
                    End If
                    txtInquiryContent1.Text = Format(myPicker1.Value, "yyyy-MM-dd")
                Case "下机日期"
                    myPicker1.MaxDate = Date
                    If Format(myPicker1.Value, "yyyy-MM-dd") > Format(myPicker1.MaxDate, "yyyy-MM-dd") Then
                        MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                        Exit Sub
                    End If
                    txtInquiryContent1.Text = Format(myPicker1.Value, "yyyy-MM-dd")
                '判断为时间类吗
                Case "上机时间"
                    txtInquiryContent1.Text = Format(myPicker1.Value, "hh:mm:ss")
                Case "下机时间"
                txtInquiryContent1.Text = Format(myPicker1.Value, "hh:mm:ss")
                '为其他
                Case Else
                    If Trim(txtInquiryContent1.Text) = "" Then
                        txtInquiryContent1.BackColor = vbRed
                        txtInquiryContent1.SetFocus
                    Else
                        txtInquiryContent1.BackColor = vbWhite
                    End If
            End Select
        If Trim(comboCombineRelation1.Text) = "" Then
            txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'" _
                    & Sign(comboCombineRelation0.Text) & FileName(comboField(1)) & comboOpSign1.Text & "'" & txtInquiryContent1.Text & "'"

        Else
                '判断第三个字段名为空
                If Trim(comboField(2).Text) = "" Then
                    comboField(2).BackColor = vbRed
                    comboField(2).SetFocus
                Else
                    comboField(2).BackColor = vbWhite
                End If

                '判断第二个操作符为空
                If Trim(comboOpSign2.Text) = "" Then
                    comboOpSign2.BackColor = vbRed
                    comboOpSign2.SetFocus
                Else
                    comboOpSign2.BackColor = vbWhite
                End If


                '根据不同的选择值,选择不同控件中的值
                Select Case Trim(comboField(2).Text)
                    '判断为日期类吗
                    Case "上机日期"
                        myPicker2.MaxDate = Date
                        If Format(myPicker2.Value, "yyyy-MM-dd") > Format(myPicker2.MaxDate, "yyyy-MM-dd") Then
                            MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                            Exit Sub
                        End If
                        txtInquiryContent2.Text = Format(myPicker2.Value, "yyyy-MM-dd")
                    Case "下机日期"
                        myPicker2.MaxDate = Date
                        If Format(myPicker2.Value, "yyyy-MM-dd") > Format(myPicker2.MaxDate, "yyyy-MM-dd") Then
                            MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
                            Exit Sub
                        End If
                        txtInquiryContent2.Text = Format(myPicker2.Value, "yyyy-MM-dd")
                    '判断为时间类吗
                    Case "上机时间"
                        txtInquiryContent2.Text = Format(myPicker2.Value, "hh:mm:ss")
                    Case "下机时间"
                    txtInquiryContent2.Text = Format(myPicker2.Value, "hh:mm:ss")
                    '为其他
                    Case Else
                        If Trim(txtInquiryContent2.Text) = "" Then
                            txtInquiryContent2.BackColor = vbRed
                            txtInquiryContent2.SetFocus
                        Else
                            txtInquiryContent2.BackColor = vbWhite
                        End If
                End Select



         txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'" _
                    & Sign(comboCombineRelation0.Text) & FileName(comboField(1)) & comboOpSign1.Text & "'" & txtInquiryContent1.Text & "'" _
                    & Sign(comboCombineRelation1.Text) & FileName(comboField(2)) & comboOpSign2.Text & "'" & txtInquiryContent2.Text & "'"

        End If
    End If



    Set mrc_Line = ExecuteSQL(txtSQL, msgText)
    While Not mrc_Line.EOF
    '给myFlexgrid添加表头
    With myFlexGrid
        .Rows = .Rows + 1 '设置行数
        .CellAlignment = 4 '设置文本格式
        .ColAlignment = 4  '字体居中
        .TextMatrix(.Rows - 1, 0) = Trim(mrc_Line.Fields(1)) '"卡号"
        .TextMatrix(.Rows - 1, 1) = Trim(mrc_Line.Fields(3)) ' "姓名"
        .TextMatrix(.Rows - 1, 2) = Trim(mrc_Line.Fields(6)) '"上机日期"
        .TextMatrix(.Rows - 1, 3) = Trim(mrc_Line.Fields(7)) ' "上机时间"
        .TextMatrix(.Rows - 1, 4) = Trim(mrc_Line.Fields(8)) ' "下机日期"
        .TextMatrix(.Rows - 1, 5) = Trim(mrc_Line.Fields(9)) ' "下机时间"
        .TextMatrix(.Rows - 1, 6) = Trim(mrc_Line.Fields(11)) ' "消费金额"
        .TextMatrix(.Rows - 1, 7) = Trim(mrc_Line.Fields(12)) ' "金额"
        .TextMatrix(.Rows - 1, 8) = Trim(mrc_Line.Fields(13))  '"备注"
    End With
    mrc_Line.MoveNext
    Wend


End Sub

经历了不断的努力,最后还是完成了,其中也尝试过用函数去做,返回一个SQL语句作为返回值,因为vb中并没有”Time”的数据类型,所以传递参数的时候出现了问题,如果您有这方面的解决办法,欢迎您的帮助!

感谢您的阅读!

猜你喜欢

转载自blog.csdn.net/qizhi666/article/details/82502256