2、多項條件查詢(xún)代碼
⑴、多項條件查詢(xún)窗體的Form_Load代碼,主要用于向Combo1中添加要查詢(xún)的字段并給下拉列表字段數組賦值。
Private Sub Form_Load()
On Error GoTo ErrDo
Combo(1) = "性別" '向下拉列表字段數組賦值
Combo(2) = "政治面貌"
Combo(3) = "文化程度"
ConditionNo = 0 '條件數
MSFlexGrid.TextMatrix(0, 0) = "序號" '表格固定行
MSFlexGrid.TextMatrix(0, 1) = "邏輯關(guān)系"
MSFlexGrid.TextMatrix(0, 2) = "查詢(xún)項目"
MSFlexGrid.TextMatrix(0, 3) = "條件關(guān)系"
MSFlexGrid.TextMatrix(0, 4) = "查詢(xún)信息"
Combo0.Enabled = False '不顯示邏輯關(guān)系
Command2.Enabled = False '無(wú)條件時(shí)"確認修改"鍵無(wú)效
Command3.Enabled = False '無(wú)條件時(shí)"刪除條件"鍵無(wú)效
Command5.Enabled = False '無(wú)條件時(shí)"查詢(xún)"鍵無(wú)效
Text1.Top = Combo3.Top '文本框Text1與Combo3處于同一位置
QueryStr = ""
For i = 0 To FrmQuery.Data1.Recordset.Fields.Count – 1
'向Combo1中添加要查詢(xún)的字段
Combo1.AddItem FrmQuery.Data1.Recordset.Fields(i).Name
Next
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "多項條件查詢(xún)"
End Sub
⑵、點(diǎn)擊Combo1(查詢(xún)項目),選擇一個(gè)要查詢(xún)的字段后,判斷是否選擇了“性別、政治面貌、文化程度”等下拉列表字段,并據此控制Combo3與Text1的顯示與隱藏及Combo3的列表值。Combo1的點(diǎn)擊事件代碼如下:
Private Sub Combo1_Click() '查詢(xún)項目
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, "多項條件查詢(xún)"
End Sub
⑶、多項條件查詢(xún)前必須先“增加條件”,即在Combo0(邏輯關(guān)系)列表中選擇邏輯關(guān)系符(多于一個(gè)條件時(shí)),在Combo1(查詢(xún)項目)列表中選擇要查詢(xún)的字段,在Combo2 (條件關(guān)系)列表中選擇關(guān)系符,并在Combo3中選擇或在Text1中輸入查詢(xún)信息后,再點(diǎn)擊“增加條件”鍵。Command1(增加條件)鍵的點(diǎn)擊事件代碼如下:
Private Sub Command1_Click() '增加條件
On Error GoTo ErrDo
If Combo1 = "" Then
MsgBox "請選擇查詢(xún)項目!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
If Combo2 = "" Then
MsgBox "請選擇條件關(guān)系!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
If CombOrText Then '選擇了Combo項,即下拉列表字段
If Combo3 = "" Then
MsgBox "請選擇查詢(xún)信息!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
Else '選擇了Text項,即非下拉列表字段
If Trim(Text1) = "" Then
MsgBox "請輸入查詢(xún)信息!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
End If
If ConditionNo = 0 Then
Combo0.Enabled = False '若無(wú)條件或只有一個(gè)條件則不顯示邏輯關(guān)系
Else
Combo0.Enabled = True '否則顯示邏輯關(guān)系(And、OR)
End If
ConditionNo = ConditionNo + 1 '條件數加1
If ConditionNo > 1 Then MSFlexGrid.Rows = MSFlexGrid.Rows + 1 '查詢(xún)條件顯示區表格增加一行
If MSFlexGrid.Rows <= 1 Then MSFlexGrid.Rows = MSFlexGrid.Rows + 1
Text0 = Format(ConditionNo, "00") '在查詢(xún)條件編輯區顯示條件號
MSFlexGrid.TextMatrix(ConditionNo, 0) = Format(ConditionNo, "00")
'在顯示區顯示條件號
MSFlexGrid.TextMatrix(ConditionNo, 1) = Combo0 '在查詢(xún)條件顯示區表格中顯示邏輯關(guān)系
MSFlexGrid.TextMatrix(ConditionNo, 2) = Combo1 '在查詢(xún)條件顯示區表格中顯示查詢(xún)項目
MSFlexGrid.TextMatrix(ConditionNo, 3) = Combo2 '在查詢(xún)條件顯示區表格中顯示條件關(guān)系
If CombOrText Then '若選擇了Combo項(即下拉列表字段),則顯示查詢(xún)信息:Combo3之值
MSFlexGrid.TextMatrix(ConditionNo, 4) = Combo3
Else '否則若選擇了Text項(即非下拉列表字段),則顯示查詢(xún)信息:Text1之值
MSFlexGrid.TextMatrix(ConditionNo, 4) = Text1
End If
MSFlexGrid.TextMatrix(1, 1) = "" '第一行不顯示邏輯關(guān)系
Command2.Enabled = True '“確認修改”鍵有效
Command3.Enabled = True '“刪除條件”鍵有效
Command5.Enabled = True '“查詢(xún)”鍵有效
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "多項條件查詢(xún)"
End Sub
⑷、“修改條件”時(shí),必須在“查詢(xún)條件信息表”中選擇一行,再在“查詢(xún)條件編輯區”各下拉列表中選擇或輸入相應的值后,點(diǎn)擊“確認修改”鍵。Command2(確認修改)鍵的點(diǎn)擊事件代碼如下:
Private Sub Command2_Click() '確認修改
On Error GoTo ErrDo
If CombOrText Then '若選擇了Combo項(即下拉列表字段)
If Combo3 = "" Then
MsgBox "請選擇查詢(xún)信息!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
Else '否則選擇了Text項(即非下拉列表字段)
If Trim(Text1) = "" Then
MsgBox "請輸入查詢(xún)信息!", vbCritical, "多項條件查詢(xún)"
Exit Sub
End If
End If
'在查詢(xún)條件顯示區表格中顯示邏輯關(guān)系、查詢(xún)項目、條件關(guān)系
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項(即下拉列表字段),則顯示查詢(xún)信息:Combo3之值
MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 4) = Combo3
Else '否則若選擇了Text項(即非下拉列表字段),則顯示查詢(xún)信息:Text1之值
MSFlexGrid.TextMatrix(MSFlexGrid.RowSel, 4) = Text1
End If
MSFlexGrid.TextMatrix(1, 1) = "" '第一行不顯示邏輯關(guān)系
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "多項條件查詢(xún)"
End Sub
⑸、“刪除條件”時(shí),也必須先選擇一行,再點(diǎn)擊“刪除條件”鍵。Command3(刪除條件)鍵的點(diǎn)擊事件代碼如下:
Private Sub Command3_Click() '刪除條件
On Error GoTo ErrDo
If MSFlexGrid.Rows <= 1 Then Exit Sub '無(wú)條件時(shí)返回
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) = "" '第一行不顯示邏輯關(guān)系
MSFlexGrid.Rows = MSFlexGrid.Rows - 1 '行數減一
ConditionNo = ConditionNo - 1 '條件數減一
If MSFlexGrid.Rows <= 1 Then
Command2.Enabled = False '無(wú)條件時(shí)“確認修改”鍵無(wú)效
Command3.Enabled = False '無(wú)條件時(shí)“刪除條件”鍵無(wú)效
Command5.Enabled = False '無(wú)條件時(shí)“查詢(xún)”鍵無(wú)效
End If
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "多項條件查詢(xún)"
End Sub
⑹、按需要設置好所有查詢(xún)條件后,最后點(diǎn)擊“查詢(xún)”鍵即可進(jìn)行多項查詢(xún)。Command5(查詢(xún))鍵的點(diǎn)擊事件代碼如下:
Private Sub Command5_Click() '查詢(xún)
On Error GoTo ErrDo
Dim Str As String
Dim Col1 As String '第1列,即邏輯關(guān)系
Dim Col2 As String '第2列,即查詢(xún)項目
Dim Col3 As String '第3列,即條件關(guān)系
Dim Col4 As String '第4列,即查詢(xún)信息
If ConditionNo = 0 Then MsgBox "請給定查詢(xún)條件!", vbCritical, "多項條件查詢(xún)"
QueryStr = ""
For i = 1 To ConditionNo
Str = ""
Col1 = Trim(Left(MSFlexGrid.TextMatrix(i, 1), 4)) '第1列,即邏輯關(guān)系
'第2列,即查詢(xún)項目
Col2 = FrmQuery.Data1.Recordset.Fields(Trim(MSFlexGrid.TextMatrix(i, 2))).Name
Col3 = Trim(Left(MSFlexGrid.TextMatrix(i, 3), 4)) '第3列,即條件關(guān)系
Col4 = Trim(MSFlexGrid.TextMatrix(i, 4)) '第4列,即查詢(xún)信息
Select Case Col3
Case "Like" '數學(xué)關(guān)系符為"Like",即包含
Str = Col2 & " " & Col3 & " '*" & Col4 & "*'"
Case "Not" '數學(xué)關(guān)系符為"Not Like",即不包含
Str = "Not " & Col2 & " Like '*" & Col4 & "*'"
Case Else '除Like、Not Like外,即除包含及不包含外的其它關(guān)系符
If InStr(Col2, "出生年月") <> 0 Then
Str = Col2 & " " & Col3 & " #" & Col4 & "#" '日期型字段
Else
Str = Col2 & " " & Col3 & " '" & Col4 & "'" '非日期型字段
End If
End Select
QueryStr = QueryStr & Col1 & " " & Str & " " '邏輯關(guān)系
Next
Me.Hide
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "多項條件查詢(xún)"
Me.Hide
End Sub
⑺、Command5(取消返回)鍵的點(diǎn)擊事件代碼如下:
Private Sub Command4_Click() '取消返回
Me.Hide
End Sub
六、查詢(xún)主窗體命令代碼
1.查詢(xún)主窗體“單項查詢(xún)”命令代碼
查詢(xún)主窗體中Command1(單項查詢(xún))鍵的的點(diǎn)擊事件代碼如下:
Private Sub Command1_Click() '單項查詢(xún)
On Error GoTo ErrDo
FrmSingle.Show vbModal '顯示單項條件查詢(xún)窗體
If QueryStr = "" Then Exit Sub '若單項條件查詢(xún)窗體中,點(diǎn)擊了“'取消”鍵
'過(guò)濾記錄,查詢(xún)主窗體中的MSFlexGrid1數據表格將顯示符合條件的記錄
Data1.RecordSource = "SELECT * FROM 人事檔案 WHERE " & QueryStr
Data1.Refresh
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "單項信息查詢(xún)"
End Sub
2.查詢(xún)主窗體“多項查詢(xún)”命令代碼
查詢(xún)主窗體中Command2(多項查詢(xún))鍵的的點(diǎn)擊事件代碼如下:
Private Sub Command2_Click() '多項查詢(xún)
On Error GoTo ErrDo
FrmMany.Show vbModal '顯示多項條件查詢(xún)窗體
If QueryStr = "" Then Exit Sub '若多項條件查詢(xún)窗體中,點(diǎn)擊了“'取消”鍵
'過(guò)濾記錄,查詢(xún)主窗體中的MSFlexGrid1數據表格將顯示符合條件的記錄
Data1.RecordSource = "SELECT * FROM 人事檔案 WHERE " & QueryStr
Data1.Refresh
Exit Sub
ErrDo:
MsgBox Error(Err), vbCritical, "信息查詢(xún)"
Command3_Click '出現錯誤時(shí)清除條件
End Sub
3.查詢(xún)主窗體“清除條件”命令代碼
Private Sub Command3_Click() '清除條件
On Error Resume Next
'復位,查詢(xún)主窗體中的MSFlexGrid1數據表格將顯示所有記錄
Data1.RecordSource = "SELECT * FROM 人事檔案"
Data1.Refresh
End Sub
七、運行情況
點(diǎn)擊查詢(xún)主窗體中的“單項查詢(xún)”或“多項查詢(xún)”命令鍵后,將根據設置的條件過(guò)濾記錄,查詢(xún)主窗體中的MSFlexGrid1數據表格將顯示符合條件的記錄,如設置圖三所示的多項條件后,主窗體中的MSFlexGrid1數據表格將顯示5條符合條件的記錄(圖四)。
進(jìn)行“多項查詢(xún)”設置時(shí),若只設置一個(gè)條件,則相當于單項條件查詢(xún)。顯然,單項條件查詢(xún)是多項條件查詢(xún)的特例。
點(diǎn)擊查詢(xún)主窗體中的“清除條件”命令鍵后,查詢(xún)主窗體中的MSFlexGrid1數據表格將顯示“人事檔案表”中的所有。
八、存在問(wèn)題
因MSFlexGrid表格單元的編輯功能有限,我們對MSFlexGrid表格單元進(jìn)行編輯時(shí)一般都是通過(guò)在單元格上適時(shí)顯示或隱藏Text文本框或Combo下拉列表框,并編輯框內的內容來(lái)實(shí)現的。如果直接在MSFlexGrid表格單元中進(jìn)行條件編輯當然是最直觀(guān)最方便的方法,但是由于在滑動(dòng)垂直滾動(dòng)條時(shí),較難控制編輯框的顯示與消隱(即在被編輯的單元格移出顯示區時(shí)應消隱編輯框,在被編輯的單元格移入顯示區時(shí)應顯示編輯框)。因此,為克服這些問(wèn)題,只好應用前述的“查詢(xún)條件編輯區”固定所有編輯控件,消極地解決了這個(gè)問(wèn)題。(完)