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

【機房收費系統】——組合查詢

在機房收費系統中,其中的組合查詢僅僅在剛開始的時候構思了一點自己的想
法,但是並沒用付諸於行動,去嘗試自己的是否正確,而是選擇了去看之前看
到的一篇關於組合查詢的部落格,說起來有些愧疚的啊。還好的是當我理清思路
之後剩下的組合查詢都是自己的寫的了。
在這分享一下自己的思路,共分為三步。(以學生基本資訊維護為例)
1.首先窗體的建立,加入需要控制元件等來補充介面。
2.當執行之時需要新增資訊,也就是供使用者選擇的訊息。

Dim a, b, c
    '對於控制元件陣列簡單的新增方法!!!
    For a = 0 To 2
        With Combo1(a)
            .AddItem "卡號"
.AddItem "學號" .AddItem "姓名" .AddItem "性別" .AddItem "系別" .AddItem "年紀" .AddItem "班級" End With Next a For b = 0 To 2 With Combo2(b) .AddItem "=" .AddItem "<" .AddItem ">"
.AddItem "<>" End With Next b For c = 0 To 1 With Combo3(c) .AddItem "與" .AddItem "或" End With Next c
3.有了控制元件和訊息之後就到了查詢和顯示了。
大家都知道一般的sql查詢語句為
`txtsql='select * from student_info where status='使用' _
 and username='" & txtuserno.text & "'"`
我們先來分析一下這個語句,其中前半句
前半句`txtsql='select * from student_info where`
無論放到哪,查什麼的東西都是一樣的。主要的是後面,後面內容主要分為四部分
1.欄位名(status)                 2.操作符(=)
3.要查詢的內容,即限制條件('使用')   4.組合關係(and)
知道了這四部分,我們就可以簡單的寫出sql語句了。
(1)由於combo1中新增的資訊為漢語,不能夠在sql語句中直接使用
所以我首先定義了一個過程,來進行轉換。
Private Function tName(Englishname As String) As String
    '定義一個過程,進而在進行判斷的時候,可以省略
    Select Case Englishname
        Case "卡號"
            tName = "cardno"
        Case "學號"
            tName = "studentno"
        Case "姓名"
            tName = "studentname"
        Case "性別"
            tName = "sex"
        Case "系別"
            tName = "department"
        Case "年級"
            tName = "grade"
        Case "班級"
            tName = "class"
    End Select

End Function
(2)接下來就是查詢語句了。
Private Sub cmdquery_Click()
    Dim a(組合關係)

'我將每一行的查詢都分開了,這樣的話可以使整體上看上去更加簡潔,規範。
'調錯等也比較方便。除此之外,他們的txtsql可以繼承上面的!放很多。

 '第一行查詢。。。。。。。。。。。。。。。。。。。。。
    If Not texttxt(Combo1(0).Text) Then
        MsgBox "請輸入第一行欄位名", vbOKOnly + vbExclamation, "提示"
        Combo1(0).SetFocus
        Exit Sub
    ElseIf Not texttxt(Combo2(0).Text) Then
        MsgBox "請輸入第一行操作符", vbOKOnly + vbExclamation, "提示"
        Combo2(0).SetFocus
        Exit Sub
    ElseIf Not texttxt(Text1(0).Text) Then
        MsgBox "請在第一行輸入要查詢的內容", vbOKOnly + vbExclamation, "提示"
        Text1(0).SetFocus
        Exit Sub
    Else

        txtsql = "select * from student_info where " &          tName(Combo1(0).Text) & Combo2(0).Text & "'" & Text1(0).Text & "'"
        Set mrc = ExecuteSQl(txtsql, msgTxt)
'其中欄位名tName(Combo1(0).Text),操作符Combo2(0).Text,
'查詢的內容Text1(0).Text。

        If mrc.EOF Then
            MsgBox "當前沒有該內容", vbOKOnly + vbExclamation, "提示"
            Exit Sub
        Else
            If Combo3(0).Text = "" Then
            GoTo case1
            End If
        End If
    End If

    '第二行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    Select Case Combo3(0)   '判斷與或者非,並記入a(組合關係)
        Case "與"
            a = "and"
        Case "或"
            a = "or"
    End Select

    If Not texttxt(Combo1(1).Text) Then
        MsgBox "請輸入第二行欄位名", vbOKOnly + vbExclamation, "提示"
        Combo1(1).SetFocus
        Exit Sub
    ElseIf Not texttxt(Combo2(1).Text) Then
        MsgBox "請輸入第二行操作符", vbOKOnly + vbExclamation, "提示"
        Combo2(1).SetFocus
        Exit Sub
    ElseIf Not texttxt(Text1(1).Text) Then
        MsgBox "請在第二行輸入要查詢的內容", vbOKOnly + vbExclamation, "提示"
        Text1(1).SetFocus
        Exit Sub
    Else
        txtsql = txtsql & a & " " & tName(Combo1(1).Text) & Combo2(1).Text & "'" & Text1(1).Text & "'"
        Set mrc = ExecuteSQl(txtsql, msgTxt)
'該語句的第二個txtsql是對於第一行txtsql的繼承,
'後面的分別為組合關係a,欄位名tName(Combo1(1).Text),
'操作符Combo2(1).Text,要查詢的內容Text1(1).Text。

        If mrc.EOF Then
            MsgBox "當前沒有該內容", vbOKOnly + vbExclamation, "提示"
            Exit Sub
        Else
            If Combo3(1).Text = "" Then
                GoTo case1
            End If
        End If
    End If

    '第三行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    Select Case Combo3(1)
        Case "與"
            a = "and"
        Case "或"
            a = "or"
    End Select

    If Not texttxt(Combo1(2).Text) Then
        MsgBox "請輸入第三行欄位名", vbOKOnly + vbExclamation, "提示"
        Combo1(2).SetFocus
        Exit Sub
    ElseIf Not texttxt(Combo2(2).Text) Then
        MsgBox "請輸入第三行操作符", vbOKOnly + vbExclamation, "提示"
        Combo2(2).SetFocus
        Exit Sub
    ElseIf Not texttxt(Text1(2).Text) Then
        MsgBox "請在第三行輸入要查詢的內容", vbOKOnly + vbExclamation, "提示"
        Text1(2).SetFocus
        Exit Sub
    Else
        txtsql = txtsql & a & " " & tName(Combo1(2).Text) & Combo2(2).Text & "'" & Text1(2).Text & "'"
        Set mrc = ExecuteSQl(txtsql, msgTxt)
'同上

        If mrc.EOF Then
            MsgBox "當前沒有該內容", vbOKOnly + vbExclamation, "提示"
            Exit Sub
        Else
            GoTo case1
        End If
    End If

'   (3)查詢資訊的展現(這裡是運用了goto語句)
case1:
    With myflexgrid
        .Rows = 1
        .CellAlignment = 4
        .TextMatrix(0, 0) = "卡號"
        .TextMatrix(0, 1) = "姓名"
        .TextMatrix(0, 2) = "學號"
        .TextMatrix(0, 3) = "餘額"
        .TextMatrix(0, 4) = "系別"
        .TextMatrix(0, 5) = "年級"
        .TextMatrix(0, 6) = "班級"
        .TextMatrix(0, 7) = "性別"
        .TextMatrix(0, 8) = "狀態"
        .TextMatrix(0, 9) = "備註"
        .TextMatrix(0, 10) = "型別"
        .TextMatrix(0, 11) = "日期"
        .TextMatrix(0, 12) = "時間"
        Do While mrc.EOF = False
            .Rows = .Rows + 1
            .CellAlignment = 4
            .TextMatrix(.Rows - 1, 0) = mrc.Fields(1)
            .TextMatrix(.Rows - 1, 1) = mrc.Fields(2)
            .TextMatrix(.Rows - 1, 2) = mrc.Fields(0)
            .TextMatrix(.Rows - 1, 3) = mrc.Fields(7)
            .TextMatrix(.Rows - 1, 4) = mrc.Fields(4)
            .TextMatrix(.Rows - 1, 5) = mrc.Fields(5)
            .TextMatrix(.Rows - 1, 6) = mrc.Fields(6)
            .TextMatrix(.Rows - 1, 7) = mrc.Fields(3)
            .TextMatrix(.Rows - 1, 8) = mrc.Fields(10)
            .TextMatrix(.Rows - 1, 9) = mrc.Fields(8)
            .TextMatrix(.Rows - 1, 10) = mrc.Fields(14)
            .TextMatrix(.Rows - 1, 11) = mrc.Fields(12)
            .TextMatrix(.Rows - 1, 12) = mrc.Fields(13)
            mrc.MoveNext
        Loop
    End With
End Sub

當我剛開始的時候想到組合查詢感覺是很複雜的,但是當理清楚其中的思路之
後就感覺簡單了很多。希望大家能夠從此得到一些收穫。