组合查询代码及其优化

目录

一、利用数组

二、使用了多个查询条件之间关系框后,使其对应的查询条件框可用

三、对应不同的字段名,改变操作符。

四、对于时间和日期字段名,textbox控件隐藏,使用DTPicker控件

五、重头戏,组合查询代码

(1)先将字段名和查询条件的关系的汉字转换成对应的sql语句

(2)在输入查询代码 


一、利用数组

每一组控件就是一个数组,利用数组写代码,利用数组添加选项。当然不只是这些。

 For i = 0 To 2
        With cboField(i)
            .AddItem "教师"
            .AddItem "注册日期"
            .AddItem "注册时间"
            .AddItem "注销日期"
            .AddItem "注销时间"
            .AddItem "机器名"
        End With
    Next i

二、使用了多个查询条件之间关系框后,使其对应的查询条件框可用

'单击选择框事件
'我的选择框是数组,所以可以直接使用索引值index
Private Sub cboCombineRelation_Click(Index As Integer)
    Dim i As Integer
    i = Index
    If cboCombineRelation(i).Text = "或" Or cboCombineRelation(i).Text = "与" Then
        '由于选择框是两个,而条件的内容框是3个,所以使用第i个选择框,连接的是第i+1个条件的内容框
        cboField(i + 1).Enabled = True
        cboOpSymbol(i + 1).Enabled = True
        txtInquiryContent(i + 1).Enabled = True
    End If
End Sub

三、对应不同的字段名,改变操作符。

因为对应姓名这种字段名,不存在大于和小于关系

Private Sub cboField_Click(Index As Integer)
    Dim i As Integer
    i = Index
    If cboField(i).Text = "姓名" Or cboField(i).Text = "备注" Then
        '如果这里不清除,可能导致在之前添加的基础上又添加
        cboOpSymbol(i).Clear
        cboOpSymbol(i).AddItem "="
        cboOpSymbol(i).AddItem "<>"
    Else
        '如果这里不清除,可能导致在之前添加的基础上又添加
        cboOpSymbol(i).Clear
        cboOpSymbol(i).AddItem "="
        cboOpSymbol(i).AddItem "<"
        cboOpSymbol(i).AddItem ">"
        cboOpSymbol(i).AddItem "<>"
    End If
End Sub

四、对于时间和日期字段名,textbox控件隐藏,使用DTPicker控件

先添加3个DTPicker控件,同样添加的时候使用数组哦。

(1)为什么是3个不是6个啊

哈哈哈,因为DTPicker控件有一个神奇的属性,是Format

format=0-dtpLongDate:格式是2018年12月13日

format=1-dtpShortDate:格式是2018/12/13

format=2-dtpTime:格式是0:00:00,这个时候是时间,不是日期哦

Format=3-dtpCustom,这个时候可以自定义格式,比如dtpicker1.CustomFormat=Format("yy MM dd")

(2)先在开始的时候显示文本框,隐藏dtpicker的3个控件。当隐藏的时候就不可用了。

For m = 0 To 2
    DTPicker1(m).Visible = False
Next m

(3)选择时间或者日期的字段名的时候,显示dtpicker的3个控件。隐藏输入内容的3个文本框

Private Sub cboField_Click(Index As Integer)
    Dim i As Integer
    i = Index
    If cboField(i).Text = "注册日期" Or cboField(i).Text = "注销日期" Then
        '我初始设置的日期格式,所以这里不用设置
        DTPicker1(i).Visible = True
        txtInquiryContent(i).Visible = False
    Else
        If cboField(i).Text = "注册时间" Or cboField(i).Text = "注销时间" Then
            ’设置格式为时间格式
            DTPicker1(i).Format = dtpTime
            DTPicker1(i).Visible = True
            txtInquiryContent(i).Visible = False
        Else
            DTPicker1(i).Visible = False
            txtInquiryContent(i).Visible = True
        End If
    End If
End Sub

(4)、那么查询的时候该查哪个控件的值啊,岂不是又很多代码。嘿嘿,下面的代码解决这个问题

在查询之前,如果dtpicker控件可以将内容赋值给txtInquiryContent控件(也就是输入内容的文本框),然后在输入组合查询代码

Private Sub cmdInquiry_Click()
Dim i As Integer
    For i = 0 To 2
        If DTPicker1(i).Visible = True Then
            txtInquiryContent(i).Text = DTPicker1(i).Value
        End If
    Next i
End Sub

五、重头戏,组合查询代码

(1)先将字段名和查询条件的关系的汉字转换成对应的sql语句

Public Function FieldName(StrFieldName As String) As String
    Select Case StrFieldName
    Case "学号"
        FieldName = "studentno"
    Case "姓名"
        FieldName = "studentname"
    Case "卡号"
        FieldName = "cardno"
   '其他的不一一列举
 End Select
End Function

Public Function RelationName(StrRelationName As String) As String
    Select Case StrRelationName
    Case "与"
        RelationName = "and"
    Case "或"
        RelationName = "or"
    End Select
End Function

(2)在输入查询代码 

Private Sub cmdInquiry_Click()
    Dim txtSQL As String
    Dim msgtext As String
    Dim mrc As ADODB.Recordset
    
    '这里添加上面的dtpicker控件的内容赋值给txtInquiryContent控件
    
    txtSQL = "select * from worklog_info where "
    
    '判断第一个查询条件是否输入数据
    If Not Testtxt(cboField(0).Text) Or Not Testtxt(cboOpSymbol(0).Text) Or Not Testtxt(txtInquiryContent(0).Text) Then
        MsgBox "请输入第一行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
        cboField(0).SetFocus
        Exit Sub
    End If
        
    txtSQL = txtSQL & FieldName(cboField(0).Text) & cboOpSymbol(0).Text & " '" & txtInquiryContent(0).Text & "'"
    
    If Not cboCombineRelation(0).Text = "" Then
            
        '第二行数据是否输入
        If Not Testtxt(cboField(1).Text) Or Not Testtxt(cboOpSymbol(1).Text) Or Not Testtxt(txtInquiryContent(1).Text) Then
            MsgBox "请输入第二行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
            cboField(1).SetFocus
            Exit Sub
        Else
            txtSQL = txtSQL & RelationName(cboCombineRelation(0).Text) & " " & FieldName(cboField(1).Text) & cboOpSymbol(1).Text & "'" & txtInquiryContent(1).Text & "'"
        End If
    End If
    
    If Not cboCombineRelation(1).Text = "" Then
        '第三行数据是否输入
        If Not Testtxt(cboField(2).Text) Or Not Testtxt(cboOpSymbol(2).Text) Or Not Testtxt(txtInquiryContent(2).Text) Then
            MsgBox "请输入第三行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
            cboField(2).SetFocus
            Exit Sub
        Else
            txtSQL = txtSQL & RelationName(cboCombineRelation(1).Text) & " " & FieldName(cboField(2).Text) & cboOpSymbol(2).Text & "'" & txtInquiryContent(2).Text & "'"
        End If
    End If
    Set mrc = ExecuteSQL(txtSQL, msgtext)
    With MSHFlexGrid1
    .rows = 1
    '是内容在其当前单元的水平和垂直居中对齐
    .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) = "状态"
    '判断是否移动到据集对象的最后一条记录
        Do While Not mrc.EOF
            .rows = .rows + 1
            .CellAlignment = 4
            .ColAlignment = 4
            .TextMatrix(.rows - 1, 0) = mrc.Fields(0)
            .TextMatrix(.rows - 1, 1) = mrc.Fields(1)
            .TextMatrix(.rows - 1, 2) = mrc.Fields(2)
            .TextMatrix(.rows - 1, 3) = mrc.Fields(3)
            '后面哟啊跟一个空值是为了当内容是null时,不报错
            .TextMatrix(.rows - 1, 4) = mrc.Fields(4) & ""
            .TextMatrix(.rows - 1, 5) = mrc.Fields(5) & ""
            .TextMatrix(.rows - 1, 6) = mrc.Fields(6) & ""
            .TextMatrix(.rows - 1, 7) = mrc.Fields(7)
            .TextMatrix(.rows - 1, 8) = mrc.Fields(8)
            '移动到下一条记录
            mrc.MoveNext
        Loop
        '调用模块里AdjustColWidth函数,是MSHFlexGrid1单元格的行宽和高根据内容自动调整
        AdjustColWidth Me, MSHFlexGrid1
    End With
    If mrc.RecordCount = 0 Then
        MsgBox "没有您要查询的信息", vbOKCancel + vbExclamation, "提示"
        cboField(0).SetFocus
    End If
    mrc.Close
End Sub

  

猜你喜欢

转载自blog.csdn.net/make_1998/article/details/84992384