玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
在VB+Access系统中实现多项条件查询
来源:━━━━《电脑编程技巧与维护》2003第9期作者:刘中甫网址:http://www.jh-lzf.com浏览数:27

在VB+Access系统中实现多项条件查询

摘  要:本文以“人事档案”数据库为例,介绍在VB+ Access系统中实现单项条件查询与多项条件查询的程序设计方法。

关键词:数据库  查询  VB  Access  事件代码

一、前言

对数据库信息进行查询检索是数据库管理软件的主要功能之一,也是其难点之一。本文以“人事档案”数据库为例,在Visual Basic 6.0+Sp3及Microsoft Access2000环境下,介绍在VB+ Access系统中实现单项条件查询与多项条件查询的程序设计方法。

二、字段及公共变量

假设“人事档案”数据库Archives.mdb已经生成(位于当前路径下),库中有 “人事档案”表,表中有12条记录。为简化说明,假设表中仅有如下几个字段: [姓名]TEXT(4),[性别]TEXT(1),[籍贯]TEXT(8),[出生年月]DATE,[政治面貌]TEXT(8),[文化程度]TEXT(8)。

其中“性别、政治面貌、文化程度”三个字段的值只能从列表中选择,以下简称“下拉列表字段”,“性别”的列表值有“男、女”两项;“政治面貌”的列表值有“中共党员、共青团员、民主党员、群众”四项;“文化程度”的列表值有“本科以上、大学本科、大学专科、专科以下”四项。

另外,在模块(Modbas)中定义公共变量如下:

Public QueryStr As String       '查询条件串

Public ConditionNo As Integer   '条件数

Public CombOrText As Boolean     '选择了Combo项还是Text项(即是否选择了下拉列表字段)

Public Combo(3) As String         '下拉列表字段数组,若增加下拉列表字段数,则增加此数组维数

三、查询主窗体

本查询程序示例包含三个窗体:查询主窗体(FrmQuery)、单项条件查询窗体(FrmSingle)、多项条件查询窗体(FrmMany)。其中查询主窗体(图一)上有如下几类控件:

1、三个文本框Text1(1)、Text1(2)、Text1(3)分别显示姓名、籍贯、出生年月等字段的值;

2、三个下拉列表框Combo1(1)、Combo1(2)、Combo1(3) 分别显示性别、政治面貌、文化程度等字段的值;

3、RichTextBox1控件用于显示个人简历;

4、Data1控件的数据库连接方式(Connect)采用VB系统默认的Access 2000(视Microsoft Office版本而定)。可分别在Data1控件的DatabaseName、RecordSource属性中设置Data1所关联的数据库文件名及数据表名,亦可在主窗体的Form_Load中加入如下代码:

Private Sub Form_Load()

   Dim FileName As String

   If Right(App.Path, 1) = "\" Then            '若 App.Path 为根目录

     FileName = App.Path + "Archives.mdb"

   Else

     FileName = App.Path + "\Archives.mdb"

   End If

   Set File_db = OpenDatabase(FileName)        '打开人事档案数据库

   Data1.DatabaseName = FileName

   Data1.RecordSource = "人事档案"             '关联人事档案表

   Data1.Refresh

End Sub

5、MSFlexGrid1控件的数据源(DataSource)为Data1,列数由数据源中“人事档案”表的字段数而定(照片字段不予考虑),本例为6列,固定1行用于显示字段名。

6、几个重要的命令键Command1(单项查询)、Command2(多项查询)、Command3(清除条件)。

四、单项条件查询

1、单项条件查询窗体

在查询主窗体中点击“单项查询”将弹出单项条件查询窗体(图二)。

窗体上有Combo1、Combo2、Combo3三个下拉列表框及一个Text1文本框。其中,查询项目下拉列表(Combo1)为查询主窗体上Data1所关联的数据库的字段;条件关系下拉列表(Combo2)为数学关系符“=、<>、<、≤、>、≥、Like(包含)、Not Like(不包含)”;查询信息为下拉列表选项(Combo3)或输入值(Text1)。

当查询项目为“性别、政治面貌、文化程度”等列表字段时,隐藏Text1控件,显示Combo3控件,此时查询者可在Combo3中选择要查询的信息项;当查询项目选择“姓名、籍贯、出生年月”等非列表字段时,隐藏Combo3控件,显示Text1控件,此时查询者可在Text1中输入要查询的信息值。

2、单项条件查询代码

⑴、单项条件查询窗体的Form_Load代码,主要用于向Combo1中添加要查询的字段。

Private Sub Form_Load()

   QueryStr = ""

   For i = 0 To FrmQuery.Data1.Recordset.Fields.Count – 1      '字段数

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

   Next

End Sub

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

Private Sub Combo1_Click()

On Error GoTo ErrDo

CombOrText = True

Select Case Combo1             '下拉列表字段

    Case "性别"

         i = 1

    Case "政治面貌"

         i = 2

    Case "文化程度"

         i = 3

    Case Else

        CombOrText = False

End Select

If CombOrText 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

Else                          '否则显示Text1,隐藏Combo3

 Combo3.Visible = False

 Text1.Visible = True

End If

Exit Sub

ErrDo:

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

   Resume Next

End Sub

⑶、点击“查询”命令键后,判断是否在Combo1下拉列表中选择了日期型字段(如出生年月),若选择了日期型字段,则必须在查询信息两端加#号;另外,还要判断是否在Combo2下拉列表中选择了数学关系符Like(即包含),若选择了Like,则必须在查询信息两端加*号。“查询”命令键的点击事件代码如下:

Private Sub Command1_Click()     '查询

   On Error GoTo ErrDo

   Dim FindStr As String        '需查找的信息串

   QueryStr = ""

   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

      FindStr = Trim(Combo3)

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

      If Trim(Text1) = "" Then

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

         Exit Sub

      End If

      FindStr = Trim(Text1)

   End If

   Select Case Trim(Left(Combo2, 4))

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

            QueryStr = Combo1 & " " & Trim(Left(Combo2, 4)) & " '*" & FindStr & "*'"

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

            QueryStr = "Not " & Combo1 & " Like '*" & FindStr & "*'"

        Case Else              '除包含和不包含外的其它字段

            If InStr(Trim(Combo1), "出生年月") <> 0 Then    '日期型字段两端加#号

              QueryStr = Combo1 & " " & Trim(Left(Combo2, 4)) & "  #" & FindStr & "#"

            Else              '非日期型其它字段

              QueryStr = Combo1 & " " & Trim(Left(Combo2, 4)) & " '" & FindStr & "'"

            End If

   End Select

Me.Hide

Exit Sub

ErrDo:

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

   Resume Next

End Sub

⑷、“取消”命令键的点击事件代码如下:

Private Sub Command2_Click()           '取消

   QueryStr = ""

   Me.Hide

End Sub

五、多项条件查询

1、多项条件查询窗体

在查询主窗体中点击“多项查询”将弹出多项条件查询窗体(图三)。窗体上的主要控件有:

一、一个表格控件(MSFlexGrid),用于显示已定义的条件,即查询条件显示区。

二、五个命令键:Command1(确认修改)、Command2(增加条件)、Command3(删除条件)、Command4(取消返回)、Command5(查询)。

三、四个下拉列表框Combo0、Combo1、Combo2、Combo3及一个Text1文本框,用于输入或修改条件,即查询条件编辑区。其中

逻辑关系下拉列表(Combo0)为逻辑关系符“AND、OR”。在逻辑关系符中还应该有“Not”,但是,由于数学关系符Like与Not Like、=与<>、<与≥、>与≤互为Not关系,已具有Not功能,因而忽略。

查询项目下拉列表(Combo1)为查询主窗体上Data1所关联的数据库的字段;

条件关系下拉列表(Combo2)为数学关系符“=、<>、<、≤、>、≥、Like(包含)、Not Like(不包含)”;

查询信息为下拉列表选项(Combo3)或输入值(Text1)。

当查询项目为“性别、政治面貌、文化程度”等列表字段时,隐藏Text1控件,显示Combo3控件,此时查询者可在Combo3中选择要查询的信息项;当查询项目选择“姓名、籍贯、出生年月”等非列表字段时,隐藏Combo3控件,显示Text1控件,此时查询者可在Text1中输入要查询的信息值。

Combo3的下拉列表随查询项目中选择的字段而相应变化。当查询项目为“性别”时,Combo3的下拉列表有“男、女”两项;当查询项目为“政治面貌”时,Combo3的下拉列表有“中共党员、共青团员、民主党员、群众”四项;当查询项目为“文化程度”时,Combo3的下拉列表有“本科以上、大学本科、大学专科、专科以下”四项。

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                       '文本框Text1与Combo3处于同一位置

   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(查询项目),选择一个要查询的字段后,判断是否选择了“性别、政治面貌、文化程度”等下拉列表字段,并据此控制Combo3与Text1的显示与隐藏及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      '否则显示逻辑关系(And、OR)

   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                 '除Like、Not 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表格单元中进行条件编辑当然是最直观最方便的方法,但是由于在滑动垂直滚动条时,较难控制编辑框的显示与消隐(即在被编辑的单元格移出显示区时应消隐编辑框,在被编辑的单元格移入显示区时应显示编辑框)。因此,为克服这些问题,只好应用前述的“查询条件编辑区”固定所有编辑控件,消极地解决了这个问题。

上一篇