機房系統(九)——【組合查詢】
阿新 • • 發佈:2018-12-02
機房收費系統首次讓小編接觸到了“組合查詢”。到現在為止,“組合查詢”的型別,大概接觸到了兩種方式,一是單一表多個欄位連線的查詢;二是多個表的連線查詢。機房收費系統中,組合查詢佔了很大的比重,在做這部分的內容時,也是遇到了不少的問題。
一、組合框列表中欄位都是資料庫中相應欄位的中文名字,直接載入,資料庫能查詢到相應資料嗎?
答案是否定的。那麼,如何才能讓資料庫認識這些中文欄位呢?這就需要一個轉化的過程了。如下:
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