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