你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 跟高手学编程
在VB+Access系统中实现多项条件查询 (下)
 

(上接:在VB+Access系统中实现多项条件查询 (上) )

 

2、多项条件查询代码

⑴、多项条件查询窗体的Form_Load代码,主要用于向Combo1中添加要查询的字段并给下拉列表字段数组赋值。

Private Sub Form_Load()

    On Error GoTo ErrDo

    Combo(1) = "性别"        '向下拉列表字段数组赋值

    Combo(2) = "政治面貌"

    Combo(3) = "文化程度"

    ConditionNo = 0           '条件数

    MSFlexGrid.TextMatrix(0, 0) = "序号"     '表格固定行

    MSFlexGrid.TextMatrix(0, 1) = "逻辑关系"

    MSFlexGrid.TextMatrix(0, 2) = "查询项目"

    MSFlexGrid.TextMatrix(0, 3) = "条件关系"

    MSFlexGrid.TextMatrix(0, 4) = "查询信息"

    Combo0.Enabled = False    '不显示逻辑关系

    Command2.Enabled = False  '无条件时"确认修改"键无效

    Command3.Enabled = False  '无条件时"删除条件"键无效

    Command5.Enabled = False  '无条件时"查询"键无效

    Text1.Top = Combo3.Top    '文本框Text1Combo3处于同一位置

    QueryStr = ""

    For i = 0 To FrmQuery.Data1.Recordset.Fields.Count – 1

    'Combo1中添加要查询的字段

        Combo1.AddItem FrmQuery.Data1.Recordset.Fields(i).Name

    Next

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "多项条件查询"

End Sub

    ⑵、点击Combo1(查询项目),选择一个要查询的字段后,判断是否选择了“性别、政治面貌、文化程度”等下拉列表字段,并据此控制Combo3Text1的显示与隐藏及Combo3的列表值。Combo1的点击事件代码如下:

Private Sub Combo1_Click()    '查询项目

    On Error GoTo ErrDo

    Dim ExitFor As Boolean

    CombOrText = False

    For i = 1 To 3

        If Combo1 = Combo(i) Then '若选择了Combo项则显示Combo3,隐藏Text1

           Combo3.Visible = True

           Text1.Visible = False

           Combo3.Clear

           For j = 0 To FrmQuery.Combo1(i).ListCount – 1

 '将上级窗体相应的Combo下拉列表加入到Combo3

               Combo3.AddItem FrmQuery.Combo1(i).List(j)

           Next

           CombOrText = True

           Exit For

        Else       '否则显示Text1,隐藏Combo3

           Combo3.Visible = False

           Text1.Visible = True

        End If

    Next

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "多项条件查询"

End Sub

⑶、多项条件查询前必须先“增加条件”,即在Combo0(逻辑关系)列表中选择逻辑关系符(多于一个条件时),在Combo1(查询项目)列表中选择要查询的字段,在Combo2 (条件关系)列表中选择关系符,并在Combo3中选择或在Text1中输入查询信息后,再点击“增加条件”键。Command1(增加条件)键的点击事件代码如下:

Private Sub Command1_Click()  '增加条件

    On Error GoTo ErrDo

    If Combo1 = "" Then

       MsgBox "请选择查询项目!", vbCritical, "多项条件查询"

       Exit Sub

    End If

    If Combo2 = "" Then

       MsgBox "请选择条件关系!", vbCritical, "多项条件查询"

       Exit Sub

    End If

    If CombOrText Then    '选择了Combo项,即下拉列表字段

       If Combo3 = "" Then

          MsgBox "请选择查询信息!", vbCritical, "多项条件查询"

          Exit Sub

       End If

    Else       '选择了Text项,即非下拉列表字段

       If Trim(Text1) = "" Then

          MsgBox "请输入查询信息!", vbCritical, "多项条件查询"

          Exit Sub

       End If

    End If

    If ConditionNo = 0 Then

       Combo0.Enabled = False     '若无条件或只有一个条件则不显示逻辑关系

    Else

       Combo0.Enabled = True     '否则显示逻辑关系(AndOR

    End If

    ConditionNo = ConditionNo + 1    '条件数加1

    If ConditionNo > 1 Then MSFlexGrid.Rows = MSFlexGrid.Rows + 1 '查询条件显示区表格增加一行

    If MSFlexGrid.Rows <= 1 Then MSFlexGrid.Rows = MSFlexGrid.Rows + 1

    Text0 = Format(ConditionNo, "00")  '在查询条件编辑区显示条件号

MSFlexGrid.TextMatrix(ConditionNo, 0) = Format(ConditionNo, "00")  

'在显示区显示条件号

    MSFlexGrid.TextMatrix(ConditionNo, 1) = Combo0     '在查询条件显示区表格中显示逻辑关系

    MSFlexGrid.TextMatrix(ConditionNo, 2) = Combo1     '在查询条件显示区表格中显示查询项目

    MSFlexGrid.TextMatrix(ConditionNo, 3) = Combo2     '在查询条件显示区表格中显示条件关系

If CombOrText Then     '若选择了Combo项(即下拉列表字段),则显示查询信息:Combo3之值

      MSFlexGrid.TextMatrix(ConditionNo, 4) = Combo3

Else '否则若选择了Text项(即非下拉列表字段),则显示查询信息:Text1之值

      MSFlexGrid.TextMatrix(ConditionNo, 4) = Text1

    End If

    MSFlexGrid.TextMatrix(1, 1) = ""   '第一行不显示逻辑关系

    Command2.Enabled = True            '“确认修改”键有效

    Command3.Enabled = True            '“删除条件”键有效

    Command5.Enabled = True            '“查询”键有效

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "多项条件查询"

End Sub

⑷、“修改条件”时,必须在“查询条件信息表”中选择一行,再在“查询条件编辑区”各下拉列表中选择或输入相应的值后,点击“确认修改”键。Command2(确认修改)键的点击事件代码如下:

Private Sub Command2_Click()          '确认修改

On Error GoTo ErrDo

If CombOrText Then                '若选择了Combo项(即下拉列表字段)

  If Combo3 = "" Then

    MsgBox "请选择查询信息!", vbCritical, "多项条件查询"

    Exit Sub

  End If

Else         '否则选择了Text项(即非下拉列表字段)

  If Trim(Text1) = "" Then

    MsgBox "请输入查询信息!", vbCritical, "多项条件查询"

    Exit Sub

  End If

End If

'在查询条件显示区表格中显示逻辑关系、查询项目、条件关系

MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 0) = Format(MSFlexGrid.RowSel, "00")

If ConditionNo > 1 Then MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 1) = Combo0

MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 2) = Combo1

MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 3) = Combo2

If CombOrText Then   '若选择了Combo项(即下拉列表字段),则显示查询信息:Combo3之值

  MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 4) = Combo3

Else  '否则若选择了Text项(即非下拉列表字段),则显示查询信息:Text1之值

  MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 4) = Text1

End If

MSFlexGrid.TextMatrix(1, 1) = ""   '第一行不显示逻辑关系

Exit Sub

ErrDo:

MsgBox Error(Err), vbCritical, "多项条件查询"

End Sub

⑸、“删除条件”时,也必须先选择一行,再点击“删除条件”键。Command3(删除条件)键的点击事件代码如下:

Private Sub Command3_Click()    '删除条件

On Error GoTo ErrDo

If MSFlexGrid.Rows <= 1 Then Exit Sub  '无条件时返回

For i = MSFlexGrid.RowSel + 1 To MSFlexGrid.Rows - 1

   For j = 0 To 4

      MSFlexGrid.TextMatrix(i-1, j) = MSFlexGrid.TextMatrix(i, j)

'删除行以后内容分别前移一行

   Next

   MSFlexGrid.TextMatrix(i - 1, 0) = Format(i - 1, "00") 

'删除一行条件序号连续

Next

MSFlexGrid.TextMatrix(1, 1) = ""    '第一行不显示逻辑关系

MSFlexGrid.Rows = MSFlexGrid.Rows - 1   '行数减一

ConditionNo = ConditionNo - 1           '条件数减一

If MSFlexGrid.Rows <= 1 Then

  Command2.Enabled = False              '无条件时“确认修改”键无效

  Command3.Enabled = False              '无条件时“删除条件”键无效

  Command5.Enabled = False              '无条件时“查询”键无效

End If

Exit Sub

ErrDo:

MsgBox Error(Err), vbCritical, "多项条件查询"

End Sub

⑹、按需要设置好所有查询条件后,最后点击“查询”键即可进行多项查询。Command5(查询)键的点击事件代码如下:

Private Sub Command5_Click()      '查询

    On Error GoTo ErrDo

    Dim Str As String

    Dim Col1 As String            '1列,即逻辑关系

    Dim Col2 As String            '2列,即查询项目

    Dim Col3 As String            '3列,即条件关系

    Dim Col4 As String            '4列,即查询信息

    If ConditionNo = 0 Then MsgBox "请给定查询条件!", vbCritical, "多项条件查询"

    QueryStr = ""

    For i = 1 To ConditionNo

      Str = ""

      Col1 = Trim(Left(MSFlexGrid.TextMatrix(i, 1), 4))  '1列,即逻辑关系

'2列,即查询项目

      Col2 = FrmQuery.Data1.Recordset.Fields(Trim(MSFlexGrid.TextMatrix(i, 2))).Name

      Col3 = Trim(Left(MSFlexGrid.TextMatrix(i, 3), 4))  '3列,即条件关系

      Col4 = Trim(MSFlexGrid.TextMatrix(i, 4))         '4列,即查询信息

      Select Case Col3

      Case "Like"     '数学关系符为"Like",即包含

              Str = Col2 & " " & Col3 & " '*" & Col4 & "*'"

         Case "Not"    '数学关系符为"Not Like",即不包含

              Str = "Not " & Col2 & " Like '*" & Col4 & "*'"

         Case Else      'LikeNot Like外,即除包含及不包含外的其它关系符

              If InStr(Col2, "出生年月") <> 0 Then

               Str = Col2 & " " & Col3 & "  #" & Col4 & "#"  '日期型字段

              Else

               Str = Col2 & " " & Col3 & " '" & Col4 & "'"   '非日期型字段

              End If

        End Select

        QueryStr = QueryStr & Col1 & " " & Str & " "         '逻辑关系

    Next

    Me.Hide

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "多项条件查询"

Me.Hide

End Sub

⑺、Command5(取消返回)键的点击事件代码如下:

Private Sub Command4_Click()     '取消返回

    Me.Hide

End Sub

六、查询主窗体命令代码

1.查询主窗体“单项查询”命令代码

查询主窗体中Command1(单项查询)键的的点击事件代码如下:

Private Sub Command1_Click()           '单项查询

    On Error GoTo ErrDo

    FrmSingle.Show vbModal           '显示单项条件查询窗体

    If QueryStr = "" Then Exit Sub        '若单项条件查询窗体中,点击了“'取消”键

    '过滤记录,查询主窗体中的MSFlexGrid1数据表格将显示符合条件的记录

Data1.RecordSource = "SELECT * FROM 人事档案 WHERE " & QueryStr

    Data1.Refresh

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "单项信息查询"

End Sub

2.查询主窗体“多项查询”命令代码

查询主窗体中Command2(多项查询)键的的点击事件代码如下:

Private Sub Command2_Click()      '多项查询

    On Error GoTo ErrDo

    FrmMany.Show vbModal          '显示多项条件查询窗体

    If QueryStr = "" Then Exit Sub   '若多项条件查询窗体中,点击了“'取消”键

    '过滤记录,查询主窗体中的MSFlexGrid1数据表格将显示符合条件的记录

    Data1.RecordSource = "SELECT * FROM 人事档案 WHERE " & QueryStr

    Data1.Refresh

    Exit Sub

ErrDo:

    MsgBox Error(Err), vbCritical, "信息查询"

    Command3_Click                '出现错误时清除条件

End Sub

3.查询主窗体“清除条件”命令代码

Private Sub Command3_Click()      '清除条件

    On Error Resume Next

    '复位,查询主窗体中的MSFlexGrid1数据表格将显示所有记录

    Data1.RecordSource = "SELECT * FROM 人事档案"

    Data1.Refresh

End Sub

七、运行情况

点击查询主窗体中的“单项查询”或“多项查询”命令键后,将根据设置的条件过滤记录,查询主窗体中的MSFlexGrid1数据表格将显示符合条件的记录,如设置图三所示的多项条件后,主窗体中的MSFlexGrid1数据表格将显示5条符合条件的记录(图四)。

进行“多项查询”设置时,若只设置一个条件,则相当于单项条件查询。显然,单项条件查询是多项条件查询的特例。

点击查询主窗体中的“清除条件”命令键后,查询主窗体中的MSFlexGrid1数据表格将显示“人事档案表”中的所有。

八、存在问题

MSFlexGrid表格单元的编辑功能有限,我们对MSFlexGrid表格单元进行编辑时一般都是通过在单元格上适时显示或隐藏Text文本框或Combo下拉列表框,并编辑框内的内容来实现的。如果直接在MSFlexGrid表格单元中进行条件编辑当然是最直观最方便的方法,但是由于在滑动垂直滚动条时,较难控制编辑框的显示与消隐(即在被编辑的单元格移出显示区时应消隐编辑框,在被编辑的单元格移入显示区时应显示编辑框)。因此,为克服这些问题,只好应用前述的“查询条件编辑区”固定所有编辑控件,消极地解决了这个问题。(完)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089