1. 程式人生 > >機房系統(九)——【組合查詢】

機房系統(九)——【組合查詢】


    機房收費系統首次讓小編接觸到了“組合查詢”。到現在為止,“組合查詢”的型別,大概接觸到了兩種方式,一是單一表多個欄位連線的查詢;二是多個表的連線查詢。機房收費系統中,組合查詢佔了很大的比重,在做這部分的內容時,也是遇到了不少的問題。
一、組合框列表中欄位都是資料庫中相應欄位的中文名字,直接載入,資料庫能查詢到相應資料嗎?
答案是否定的。那麼,如何才能讓資料庫認識這些中文欄位呢?這就需要一個轉化的過程了。如下:
Public Function FiledName(a As String) As String
    Select Case
a Case "卡號" FiledName = "cardno" Case "姓名" FiledName = "studentNo" Case "上機日期" FiledName = "ondate" Case "上機時間" FiledName = "ontime" Case "下機日期" FiledName = "offdate" End Select End Function

當我們在查詢下拉列表中的欄位時,在查詢語句中用上述相應的轉化就可以查到我們需要的資料了,這也就是一個等價轉化的過程。

二、這麼多重複的欄位,在敲程式碼時,複製貼上可以嗎?
答案是否定的。雖然能得到想要的效果,但是出現很多同樣的程式碼片段就會造成程式碼冗餘了。我們要在能實現基本功能的時候,考慮到系統的效能。相同內容的新增,我們只要用控制元件組,用迴圈就很好的解決了程式碼冗餘問題。如下:
    For Index = 0 To 2
        With combol(Index)
            .AddItem "卡號"
            .AddItem "姓名"
            .AddItem "上機日期"
            .AddItem "上機時間"
            .AddItem "下機日期"
            .AddItem "下機時間"
            .AddItem "消費金額"
            .AddItem "餘額"
            
        End
With Next i

三、組合查詢窗體中會涉及到時間日期問題,需要使用者自己填寫嗎?
答案是也不是。為什麼這麼說呢。是需要使用者選擇時間日期,有特定的格式;不是需要使用者自己隨心所欲,想用什麼格式就用什麼格式,或者根據提示填寫符合格式要求的時間日期,這都會給使用者增加操作量。所以我們在選擇日期欄位時,如果填寫資訊的文字框變成日期控制元件,讓使用者選擇時間日期,不就會給使用者提供很多方便了嘛?這要怎麼實現呢?如下:
    If combol(i).Text = "上機日期" Or combol(i).Text = "下機日期" Then
        DTPicker1(i).Visible = True
        DTPicker1(i).Format = dtpShortDate
        txt1(i).Text = DTPicker1(i).Value
    End If
    
    If combol(i).Text = "上機時間" Or combol(i).Text = "下機時間" Then
        DTPicker1(i).Visible = True
        DTPicker1(i).Format = dtpTime
        txt1(i).Text = DTPicker1(i).Value
    End If

四、所有欄位的操作符都需要“=”、“<”、“>”、“<>” 這四個嗎?
答案是否定的。在選擇條件判斷時,是否需要這四個操作符同時存在,是和使用者選擇的欄位有關係的。操作符與欄位的匹配要符合實際的邏輯。比如我們的性別選擇,只有是或者不是,不會存在大於或者小於的情況。再比如系別或者姓名,也是存在是與不是兩種情況。而時間日期的選擇,這四個操作符是都需要存在的。所以,當用戶選擇欄位後,後面緊跟著操作符就要符合該欄位的邏輯。在選擇列表框的單擊事件裡,使用下面的判斷便可以實現。
    If combol(Index).Text = "姓名" Then
        Symbol(Index).Clear
        Symbol(Index).AddItem "="
        Symbol(Index).AddItem "<>"
    Else
        Symbol(Index).Clear
        Symbol(Index).AddItem "="
        Symbol(Index).AddItem ">"
        Symbol(Index).AddItem "<"
        Symbol(Index).AddItem "<>"
    
    End If

組合查詢
思路:查詢可以包括一個簡單的查詢(不使用組合關係)、使用一個組合關係、使用兩個組合關係。
重難點:查詢語句的書寫。小編使用的方式是先查詢某一個條件,當滿足這個條件時再進行下一個附加條件的查詢。簡單來說就是,滿足a=i的條件時,再進行a=a & 另一個條件,此時a便得到了最新的結果。
    txtsql = "select * from  Line_Info where"
    
    Rem 沒有組合關係,判斷第一行資訊是否為空值
    If Trim(combol(0).Text = "") Or Trim(Symbol(0).Text = "") Or Trim(txt1(0).Text = "") Then
        MsgBox "請將第一行資訊填寫完整!", 48, "提示"
        Exit Sub
    End If
    '查詢第一行資訊
    txtsql = txtsql & " " & FiledName(combol(0).Text) & " " & Trim(Symbol(0).Text) & "'" & Trim(txt1(0).Text) & "'"
    
    Rem 一個組合關係,判斷第二行資訊是否為空
    If Trim(Symbol(3).Text <> "") Then
        If Trim(combol(1).Text = "") Or Trim(Symbol(1).Text = "") Or Trim(txt1(1).Text = "") Then
            MsgBox "請將第二行資訊填寫完整!", 48, "提示"
            Exit Sub
        Else '查詢第二行資訊
            txtsql = txtsql & "" & CSymbol(Symbol(3).Text) & " " & FiledName(combol(1).Text) & " " & Trim(Symbol(1).Text) & " '" & Trim(txt1(1).Text) & "'"
        End If
    End If
    
    
    Rem 兩個組合關係,判斷輸入框資訊是否為空
    If Trim(Symbol(4).Text <> "") And Trim(Symbol(3).Text <> "") Then
        If Trim(combol(0).Text = "") Or Trim(Symbol(0).Text = "") Or Trim(txt1(0).Text = "") Or _
                Trim(combol(1).Text = "") Or Trim(Symbol(1).Text = "") Or Trim(txt1(1).Text = "") Or _
                Trim(combol(2).Text = "") Or Trim(Symbol(2).Text = "") Or Trim(txt1(2).Text = "") Then
            MsgBox "請將所有輸入框資訊填寫完整!", 48, "提示"
        Else '查詢第三行資訊
            txtsql = txtsql & "" & CSymbol(Symbol(4).Text) & " " & FiledName(combol(2).Text) & " " & Trim(Symbol(2).Text) & " '" & Trim(txt1(2).Text) & "'"
        End If
    End If