⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 query

📁 组合查询 组合查询 组合查询
💻
📖 第 1 页 / 共 3 页
字号:
    uddDown = 1
End Enum

'查询条件
Private Enum QueryItem
    qiFields = 0        '查询字段
    qiOperation = 1     '关系符号
    qivalue = 2         '查询字段条件
    qiRelation = 3      '不同查询条件间的关系
End Enum

'查询字段的类型
Private Enum QueryFieldType
    qftSelect = 0
    qftNumber = 1
    qftString = 2
End Enum

'查询字段可选值的类型
Private Enum QuerySelectValueType
    qsvtInput = 0          '文本框输入
    qsvtSelect = 1         'ComboBox选择
    qsvtDateTime = 2       '时间类型
End Enum

Private mconQueryParam As ADODB.Connection
Private mrsQueryParam  As ADODB.Recordset
Private mrsValueToSelect  As ADODB.Recordset
Public mrsQueryResult  As ADODB.Recordset
Private mconQueryResult As ADODB.Connection

Private msQuerySql  As String            '当前输入查询条件sql语句
Private msQuerySource As String          '查询的表或视图
Private msFieldSource As String          '查询类型
Private msTotalTemp  As String           '当前输入的查询条件汇总
Private mRequestdb As RequestDB

Public mQueryPrintType As QueryPrintType '查询打印类型




Public Function Initialize(FormCaption As String, _
                           QuerySource As String, _
                           FieldSource As String) As Long
                           
    Dim sSql As String
    
    Dim strczyh As String
    Dim sSqlCzyh As String
    Dim lresult As Long
   
    
    strczyh = "01"
    
    Set mRequestdb = New RequestDB
    Set mrsQueryParam = New ADODB.Recordset
    Me.Caption = FormCaption
    msQuerySource = QuerySource
    msFieldSource = FieldSource
    Set mRequestdb.DBRecordset = mrsQueryParam
    
    sSqlCzyh = "select * from zhcx_dyzd where czyh='" & strczyh & "' and cxlx='" & msFieldSource & "'"
    lresult = mRequestdb.ExcuteQuery(sSqlCzyh)
    sSql = "select * from zhcx_cxcs where  cxlx='" & msFieldSource & "'"
    mRequestdb.ExcuteQuery (sSql)
    If lresult = 4 Then   '如果该操作员号不存在,读取全部字段,选中字段为空,查询字段为全部字段
        
        Call ReadValueToListControl(lstFields, mrsQueryParam, "zwmc")
        Call ReadValueToListControl(cmbQuery(qiFields), mrsQueryParam, "zwmc")
    Else                  '操作员号存在,判断是否存在选中字段
        sSql = "select * from cx_zhcx_cxcs where cxlx = '" _
               & msFieldSource & "' and czyh = '" & strczyh & "' and xz='" & 1 & "'"
        Set mrsValueToSelect = New ADODB.Recordset
        Set mRequestdb.DBRecordset = mrsValueToSelect
        lresult = mRequestdb.ExcuteQuery(sSql)
        If lresult <> 4 Then  '存在选中字段
            
            Call ReadValueToListControl(lstSelectedFields, mrsValueToSelect, "zwmc") '读取选中字段到选中字段列表框
            sSql = "select * from cx_zhcx_cxcs where cxlx = '" _
               & msFieldSource & "' and czyh = '" & strczyh & "' and xz='" & 0 & "'"
            Set mRequestdb.DBRecordset = mrsValueToSelect
            mRequestdb.ExcuteQuery (sSql)
            Call ReadValueToListControl(lstFields, mrsValueToSelect, "zwmc") ' 读取全部字段到全部字段列表框
            'Call RemoveSelected(lstSelectedFields, lstFields) '将选中字段从全部字段里移出
            Call ReadValueToListControl(cmbQuery(qiFields), mrsQueryParam, "zwmc") '读取全部字段到查询字段列表框

        Else       '不存在选中字段
             Call ReadValueToListControl(lstFields, mrsQueryParam, "zwmc")
             Call ReadValueToListControl(cmbQuery(qiFields), mrsQueryParam, "zwmc")
        End If
        
        Set mRequestdb.DBRecordset = mrsValueToSelect
        sSql = "select cxtj,sqlyj from zhcx_lscxtj where czyh='" & strczyh & "' and cxlx='" & msFieldSource & "'"
        lresult = mRequestdb.ExcuteQuery(sSql)
        If lresult <> 4 Then
            mrsValueToSelect.MoveFirst
            Do While Not mrsValueToSelect.EOF
                Combolscxtj.AddItem (mrsValueToSelect(0))
                Combolscxyj.AddItem (mrsValueToSelect(1))
                mrsValueToSelect.MoveNext
            Loop
        End If
    End If
    
    
    
    Call InitOperationComboBox(-1)
    Call InitRelationComboBox
    Call cmdMove_Click(-1)
    Call lstSelectedFields_Click

      

End Function
'根据选中字段将其从全部字段中移出
Private Function RemoveSelected(ObjlistSelected As ListBox, objlist As ListBox)
If ObjlistSelected.ListCount <> 0 Then
    Dim i As Integer
    Dim j As Integer
    For i = 0 To objlist.ListCount - 1
        For j = 0 To ObjlistSelected.ListCount - 1
            If objlist.List(i) = ObjlistSelected.List(j) Then
                objlist.RemoveItem (i)
            End If
        Next
    Next
End If
End Function





Public Function GetQuerySql() As String
    GetQuerySql = msQuerySql
End Function



'检验[增加查询条件]Button的可用性
Private Sub CheckAddQueryBtnEnabled()
    cmdAddQuery.Enabled = True
    
    If cmbQuery(qiFields).Text = "" Or cmbQuery(qiOperation).Text = "" Then
        GoTo EndSub
    End If
    
    If cmbQuery(qivalue).Text = "" And cmbQuery(qivalue).Visible = True Then
        GoTo EndSub
    End If
    
    If txtQueryValue.Text = "" And txtQueryValue.Visible = True _
       And CInt(cmbQuery(qiOperation).Tag) = CInt(qftNumber) Then
        GoTo EndSub
    End If
    
    
    If cmbQuery(qiRelation).Text = "" And cmbQuery(qiRelation).Enabled = True Then
        GoTo EndSub
    End If
    
    Exit Sub
EndSub:
    cmdAddQuery.Enabled = False
    
End Sub

Private Sub InitOperationComboBox(qft As QueryFieldType)
    
'根据不同数据类型确定不同关系操作符
    With cmbQuery(qiOperation)
        .Clear
        .Text = ""
        .Tag = qft
        Select Case qft
            Case qftSelect:
                .AddItem "等于"
                .AddItem "不等于"
            Case qftNumber:
                .AddItem "大于"
                .AddItem "大于等于"
                .AddItem "等于"
                .AddItem "小于"
                .AddItem "小于等于"
                .AddItem "不等于"
            Case qftString:
                .AddItem "等于"
                .AddItem "不等于"
                .AddItem "类似"
             '   .AddItem "包含"
             '   .AddItem "不包含"
            Case Else
                .AddItem "大于"
                .AddItem "大于等于"
                .AddItem "等于"
                .AddItem "小于"
                .AddItem "小于等于"
                .AddItem "不等于"
                .AddItem "类似"
               ' .AddItem "包含"
               ' .AddItem "不包含"
        End Select
    End With
End Sub


Private Function GetOperateCodeByName(Name As String) As String
'通过中文名称得到关系运算符
     Select Case Name
        Case "大于":
            GetOperateCodeByName = ">"
        Case "大于等于":
            GetOperateCodeByName = ">="
        Case "等于":
            GetOperateCodeByName = "="
        Case "小于":
            GetOperateCodeByName = "<"
        Case "小于等于":
            GetOperateCodeByName = "<="
        Case "不等于":
             GetOperateCodeByName = "<>"
            
        Case "类似":
             GetOperateCodeByName = "like"
        'Case "包含":
        '     GetOperateCodeByName = "in"
        'Case "不包含":
       '      GetOperateCodeByName = "not in"
        Case Else
             GetOperateCodeByName = ""
     End Select
     
End Function

Private Sub InitRelationComboBox()
    With cmbQuery(qiRelation)
        .AddItem "并且"
        .AddItem "或者"
        .Text = ""
        .Enabled = False
    End With

End Sub



Private Sub MoveItems(Source As ListBox, Target As ListBox, Optional All As Boolean = False)
    Dim i As Integer
    Dim iLastMovePos As Integer
    
    '全部移动
    If All Then
        For i = 0 To Source.ListCount - 1
            Target.AddItem (Source.List(i))
        Next i
        Source.Clear
        Exit Sub
    End If
    
    '仅移动选中的项
     For i = 0 To Source.ListCount - 1
       If i > Source.ListCount - 1 Then
            Exit For
       End If
       If Source.Selected(i) Then
            Target.AddItem (Source.List(i))
            Source.RemoveItem (i)
            iLastMovePos = i
            i = i - 1
       End If
     Next i
     
     If iLastMovePos < Source.ListCount Then
        Source.Selected(iLastMovePos) = True
     ElseIf iLastMovePos > 0 Then
        Source.Selected(iLastMovePos - 1) = True
     End If
     
End Sub



Private Sub cmbQuery_Change(Index As Integer)
    Call CheckAddQueryBtnEnabled
End Sub

Private Sub cmbQuery_Click(Index As Integer)
 '    On Error GoTo Errtrap
     
     Dim qft As QueryFieldType
     Dim iIndex As Integer
     Dim iSelect As Integer
     Dim sSql As String
     
     iIndex = cmbQuery(qiFields).ListIndex
     
     Select Case Index
        Case qiFields:
            If cmbQuery(qiFields).Text <> "" Then
                mrsQueryParam.MoveFirst
                mrsQueryParam.Move iIndex
                qft = mrsQueryParam.Fields("ysfh")
                
                '判断查询条件的输入类型(TextBox,or ComboBox,or DatePicker)
                iSelect = mrsQueryParam.Fields("zdlx")
                dtpQueryValue.Visible = False
                txtQueryValue.Visible = False
                cmbQuery(qivalue).Visible = False
                Select Case iSelect
                    Case qsvtInput:
                        txtQueryValue.Visible = True
                    Case qsvtSelect:
                        'On Error Resume Next
                        cmbQuery(qivalue).Visible = True
                        sSql = mrsQueryParam.Fields("cqyj")
                        Set mRequestdb.DBRecordset = mrsValueToSelect
                        mRequestdb.ExcuteQuery (sSql)
                        
                        'Set mrsValueToSelect = mconQueryParam.Execute(sSql)

                        Call ReadValueToListControl(cmbQuery(qivalue), mrsValueToSelect, "bm", "nr")
                        'Call ReadValueToListControl(cmbQuery(qiValue), mrsValueToSelect, "nr")
                        'mrsValueToSelect.Close
                        
                        
                    Case qsvtDateTime:
                        dtpQueryValue.Visible = True
                    Case Else
                        txtQueryValue.Visible = True
                End Select
                
                Call InitOperationComboBox(qft)
            End If
     End Select
     
     Call CheckAddQueryBtnEnabled
     
'Errtrap:
'     On Error GoTo 0
     
End Sub

Private Sub cmbQuery_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDelete Then
        cmbQuery(Index).Text = ""
    End If
End Sub

Private Sub cmbQuery_KeyPress(Index As Integer, KeyAscii As Integer)
    KeyAscii = 0
End Sub

Private Sub cmdAddQuery_Click()
    
     '查询条件转化成SQL语名 ,并在界面上显示增加的查询条件
    Dim stemp As String
    Dim iIndex As Integer
    Dim sFieldName As String
    Dim sOperateion As String
    
    'And or 操作符
    If cmbQuery(qiRelation).Enabled = True Then
        stemp = cmbQuery(qiRelation).Text
        If cmbQuery(qiRelation).ListIndex = 0 Then
            msQuerySql = msQuerySql & " And"
        Else
            msQuerySql = msQuerySql & " or"
        End If
    Else
        cmbQuery(qiRelation).Enabled = True
    End If
    
    '查询字段
    stemp = stemp & " [" & cmbQuery(qiFields).Text & "]"
    
    iIndex = cmbQuery(qiFields).ListIndex
    mrsQueryParam.MoveFirst
    mrsQueryParam.Move iIndex
    sFieldName = mrsQueryParam.Fields("zdmc")
    
    '要求选择的字段,字段名后两位截掉。
    If cmbQuery(qivalue).Visible Then
        sFieldName = Mid$(sFieldName, 1, Len(sFieldName) - 2)
    End If
     msQuerySql = msQuerySql & " " & sFieldName
    
    '关系运算符
    stemp = stemp & " " & cmbQuery(qiOperation).Text
    
    sOperateion = GetOperateCodeByName(cmbQuery(qiOperation).Text)
    msQuerySql = msQuerySql & " " & sOperateion
    
    '条件
    If cmbQuery(qivalue).Visible Then
        stemp = stemp & " " & cmbQuery(qivalue).Text
        msQuerySql = msQuerySql & " '" & GetStringLeftByFlag(cmbQuery(qivalue).Text, "-") & "'"
        'msQuerySql = msQuerySql & " '" & cmbQuery(qiValue).Text & "'"
    ElseIf txtQueryValue.Visible Then
        stemp = stemp & " " & txtQueryValue.Text
        '数字型
        If CInt(cmbQuery(qiOperation).Tag) = CInt(qftNumber) Then
            
            msQuerySql = msQuerySql & " " & txtQueryValue.Text
        Else '字符型
            If UCase(sOperateion) = "LIKE" Then
                msQuerySql = msQuerySql & " '%" & txtQueryValue.Text & "%'"
            Else
                msQuerySql = msQuerySql & " '" & txtQueryValue.Text & "'"
            End If
        End If
    Else
        stemp = stemp & " " & dtpQueryValue.Value
        msQuerySql = msQuerySql & " " & ("#" & CDate(Format(dtpQueryValue.Value, "yyyy - mm - dd")) & "#")
      
    End If
    
    Debug.Print msQuerySql
 
    msTotalTemp = msTotalTemp & stemp
    lstQuerySql.AddItem Trim(stemp)
    cmbQuery(qiFields).SetFocus
    
    
    Call CheckAddQueryBtnEnabled
    cmdClearQuery.Enabled = True
  
    
     '- 查询按钮
     If lstSelectedFields.ListCount <= 0 Then
        cmdBeginQuery.Enabled = False
     Else
        cmdBeginQuery.Enabled = True
     End If
    
End Sub

Private Sub cmdBeginQuery_Click()
    Dim sSql() As String
    Dim sZwmc() As String
    Dim sSqlSel As String
    Dim lresult As Long
    Dim i As Integer
    
    If Combolscxtj.Text <> "" Or msTotalTemp <> "" Then '判断是否选中历史条件或输入条件进行查询

        sSqlSel = "select * from zhcx_lscxtj where czyh='" & strczyh & "' and cxlx= '" & msFieldSource & "' and cxtj='" & msTotalTemp & "'"

        lresult = mRequestdb.ExcuteQuery(sSqlSel)
        If lresult = 4 Then   '判断是否有重复的历史查询条件,如果没有则添加到下拉框并存盘
            If Combolscxtj.ListCount < 10 Then  '如果下拉框最大数大于10,则删除最后一项
                Combolscxtj.AddItem (msTotalTemp)
                Combolscxyj.AddItem (msQuerySql)
            Else
                Combolscxtj.RemoveItem 9
                Combolscxyj.RemoveItem 9
                Combolscxtj.AddItem (msTotalTemp)  '添加历史查询条件到下拉框
                Combolscxyj.AddItem (msQuerySql)   '添加历史查询SQL语句到下拉框

            End If
        End If
    End If
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -