1. 程式人生 > >機房收費系統---組合查詢

機房收費系統---組合查詢

     在機房收費系統中,在對大型的資料中進行檢索的時候。通過一個欄位進行檢索的時候,往往得到很多沒有價值的結果。這樣的查詢沒有多大意義。所以人們往往通過新增欄位的方式。逐步進行篩選。這樣得到的資料,又少又有用。

通過新增欄位的形式來進行組合篩選。


預設是單個查詢方式。

當使用的多的話,就可以通過新增欄位的形式來進行組合查詢。新增欄位形式如下:


因為,在text中的文字與資料庫中的欄位名不一致,所以這樣的SQL語句達不到要求,所以需要把 text文字中的欄位轉換為資料庫中所使用的欄位。

所以使用了tag屬性:

Private Sub cboField1_Click()           '把選擇的欄位轉換成  sql語句中的欄位
    If cboField1.Text = "教師" Then cboField1.Tag = "UserId"
    If cboField1.Text = "上機日期" Then cboField1.Tag = "loginDate"
    If cboField1.Text = "上機時間" Then cboField1.Tag = "loginTime"
    If cboField1.Text = "登出日期" Then cboField1.Tag = "logoutDate"
    If cboField1.Text = "登出時間" Then cboField1.Tag = "logoutTime"
    If cboField1.Text = "機器號" Then cboField1.Tag = "computer"
End Sub

Private Sub cboMode1_Click()            '把選擇的 欄位 組合關係 轉換成SQL中的 組合關係關鍵字
    If cboMode1.Text = "與" Then cboMode1.Tag = "and"
    If cboMode1.Text = "或" Then cboMode1.Tag = "or"

    cboField2.Visible = True            ’新增欄位,開啟一個新欄位
    cboSign2.Visible = True
    txtInquire2.Visible = True
    cboMode2.Visible = True
End Sub

在下述的查詢中,依次向txtSQL中新增 sql語句,形成的SQL語句形式為:

select * from worklog_Info where (UserId='**' and loginDate='**' and ---) order by serial

然後依次新增檢索欄位如下:

Private Sub cmdInquire_Click()
    Dim txtSQL As String
    Dim MsgText As String
    Dim mrc As ADODB.Recordset
    
    '首先寫一個不完全的SQL語句,一會兒補充
    txtSQL = "select * from student_Info where (" & cboField1.Tag & cboSign1.Text & "'" & txtInquire1.Text & "'"
    
    If cboMode1.Text <> "" Then      '檢驗第二個組合欄位的正確性
        If cboField2.Text = "" Then
            MsgBox "請選擇欄位名!", vbOKOnly + vbExclamation, "警告"
            cboField2.SetFocus
            Exit Sub
        End If
        If cboSign2.Text = "" Then
            MsgBox "請輸入操作符!", vbOKOnly + vbExclamation, "警告"
            cboSign2.SetFocus
            Exit Sub
        End If
        If txtInquire2.Text = "" Then
            MsgBox "請輸入要查詢的內容", vbOKOnly + vbExclamation, "警告"
            txtInquire2.SetFocus
            Exit Sub
        End If
        
        '第二個組合欄位正確,開始新增資訊
        txtSQL = txtSQL & " " & cboMode1.Tag & " " & cboField2.Tag & cboSign2.Text & "'" & txtInquire2.Text & "'"
    End If
    
    If cboMode2.Text <> "" Then     '檢驗第三組 組合欄位的正確性
        If cboField3.Text = "" Then
            MsgBox "請選擇欄位名!", vbOKOnly + vbExclamation, "警告"
            cboField3.SetFocus
            Exit Sub
        End If
        If cboSign3.Text = "" Then
            MsgBox "請輸入操作符!", vbOKOnly + vbExclamation, "警告"
            cboSign3.SetFocus
            Exit Sub
        End If
        If txtInquire3.Text = "" Then
            MsgBox "請輸入要查詢的內容", vbOKOnly + vbExclamation, "警告"
            txtInquire3.SetFocus
            Exit Sub
        End If
        
        '第三個組合欄位正確,開始新增資訊
        txtSQL = txtSQL & " " & cboMode2.Tag & " " & cboField3.Tag & cboSign3.Text & "'" & txtInquire3.Text & "'"
    End If
    
    txtSQL = txtSQL & ") "   '把SQL語句補充完整
    'Debug.Print txtSQL   用於除錯程式使用
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    
    If mrc.RecordCount = 0 Then         '如果要查詢的結果為空,則提醒使用者
        myFlexGrid.Clear
        MsgBox "結果集為空!", vbOKOnly + vbExclamation, "警告"
        Exit Sub
    End If
    
    With myFlexGrid         '把標題寫上
        .Row = 0
        .TextMatrix(.Row, 0) = "學號"
        .TextMatrix(.Row, 1) = "姓名"
        .TextMatrix(.Row, 2) = "卡號"
        .TextMatrix(.Row, 3) = "餘額"
        .TextMatrix(.Row, 4) = "學院"
        .TextMatrix(.Row, 5) = "專業"
        .TextMatrix(.Row, 6) = "年級"
        .TextMatrix(.Row, 7) = "班級"
        .TextMatrix(.Row, 8) = "性別"
        .TextMatrix(.Row, 9) = "狀態"
        .TextMatrix(.Row, 10) = "備註"
    End With
    
    myFlexGrid.Rows = mrc.RecordCount + 1           '設定大小
    
    With myFlexGrid         '對查詢到的結果進行遍歷,顯示出來
        .Row = 0
        While mrc.EOF = False
            .Row = .Row + 1
            .TextMatrix(.Row, 0) = mrc.Fields(1)
            .TextMatrix(.Row, 1) = mrc.Fields(2)
            .TextMatrix(.Row, 2) = mrc.Fields(0)
            .TextMatrix(.Row, 3) = mrc.Fields(8)
            .TextMatrix(.Row, 4) = mrc.Fields(4)
            .TextMatrix(.Row, 5) = mrc.Fields(5)
            .TextMatrix(.Row, 6) = mrc.Fields(6)
            .TextMatrix(.Row, 7) = mrc.Fields(7)
            .TextMatrix(.Row, 8) = mrc.Fields(3)
            .TextMatrix(.Row, 9) = mrc.Fields(11)
            .TextMatrix(.Row, 10) =mrc.Fields(9)
            mrc.MoveNext
        Wend
    End With
End Sub
在給控制元件,新增tag屬性的時候,由於我使用的不是控制元件陣列。所以,寫的程式碼有點繁瑣。

如果是控制元件資料,可以通過for迴圈來減少程式碼量。