【機房收費系統】——結賬
結賬,結的都是哪些賬,給誰結賬,結賬需要涉及到哪些表?這些都是開始設計程式碼之前首先要想的。
看到這個介面,你會怎麼想?你也許會想,這是給誰結賬,怎麼查的是操作員啊?不該給一般使用者結賬嗎?一個操作員每天給一般使用者進行註冊,充值,退卡等,這些工作是由操作員完成的,管理員要做的就是將操作員的工作進行彙總,然後結賬,所以我認為是給操作員結賬,結的當然是每天沒結的賬了。
首先我們來看需要哪些表來查詢相關資訊。
user_info表:查詢相關操作員,在這裡注意,管理員也可以是操作員,優化的時候要想到這點,在以下的程式碼中我沒有體現,大家自己想想,很簡單。
student_info表:查詢購卡數及購卡資訊
recharge_info表:查詢充值記錄,充值金額
cancelcard_info表:查詢退卡記錄,退卡數,退卡金額
checkday_info表:將以上查到的資訊更新到日結賬表
checkweek_info表:將以上查到的資訊更新到周結賬表
明白了這些,我們就來看看具體怎麼實現。
一、首先,查詢操作員及他的真實姓名,Tab表裡顯示的都是該操作員進行過的工作,要一致。
先將已經新增的操作員使用者名稱載入到combouserid框中,
然後,單擊使用者名稱,即出現相應的真名。Private Sub Form_Load() '從user中查詢操作員使用者名稱 txtSQL = "select * from user_info where level='操作員'" Set umrc = ExecuteSQL(txtSQL, MsgText) While (umrc.EOF = False) comboUserId.AddItem umrc.Fields(0) '載入使用者名稱 umrc.MoveNext '移動到下一條記錄 Wend '從user中查詢操作員真實名 txtSQL = "select * from user_info where level='操作員'" Set mrcc = ExecuteSQL(txtSQL, MsgText) While (mrcc.EOF = False) comboUserName.AddItem mrcc.Fields(3) '載入真名 mrcc.MoveNext '移動到下一條記錄 Wend End Sub
二、在選中要結賬的操作員後查詢出相應的資訊,這裡以充值為例:Private Sub comboUserId_Click() '單擊combouserid,查詢使用者名稱,真實名 '從user表中查 txtSQL = "select username from user_info where userid='" & Trim(comboUserId.Text) & "'" Set mrcc = ExecuteSQL(txtSQL, MsgText) '賦值,真名顯示在combousername comboUserName.Text = mrcc.Fields(0) '關閉資料集物件 mrcc.Close End Sub
'查詢充值表語句
txtSQL = "select * from recharge_info where userid= '" & Trim(comboUserId.Text) & "'and status='未結賬'and date='" & Format(Date, "yyyy-mm-dd") & "'"
'執行查詢語句
Set remrc = ExecuteSQL(txtSQL, MsgText)
'將查到的資訊顯示到mycharge(1)控制元件中
'如果沒有記錄,則顯示名稱就可以
If (remrc.EOF Or remrc.BOF) Then
With myCharge(1)
.Rows = 1 '第一行
.CellAlignment = 4
.TextMatrix(0, 0) = "學號"
.TextMatrix(0, 1) = "卡號"
.TextMatrix(0, 2) = "充值金額"
.TextMatrix(0, 3) = "日期"
.TextMatrix(0, 4) = "時間"
End With
Exit Sub
Else
'否則顯示全部查詢到的資訊
With myCharge(1)
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "學號"
.TextMatrix(0, 1) = "卡號"
.TextMatrix(0, 2) = "充值金額"
.TextMatrix(0, 3) = "日期"
.TextMatrix(0, 4) = "時間"
Do While Not remrc.EOF '若有記錄,加進去
.Rows = .Rows + 1 '防止空行的出現
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(remrc.Fields(1))
.TextMatrix(.Rows - 1, 1) = Trim(remrc.Fields(2))
.TextMatrix(.Rows - 1, 2) = Trim(remrc.Fields(3))
.TextMatrix(.Rows - 1, 3) = Trim(remrc.Fields(4))
.TextMatrix(.Rows - 1, 4) = Trim(remrc.Fields(5))
.ColWidth(3) = 1600
remrc.MoveNext '移動到下一條記錄
Loop
remrc.Close '關閉資料集物件
End With
End If
其他幾個,購卡、退卡、臨時使用者與充值雷同,在這裡就不再多寫了。
三、彙總,結賬
彙總,彙總,無非就是把查到的所有記錄加和,顯示在文字框中,主要是計算,結賬的時候我是結的當天的賬,一天一結賬,這樣就不會出現結賬重複的情況。
'彙總,結賬
Dim N As Integer '定義卡數
Dim TmpRate As Single '定義金額
Dim cancelCash As Single '定義退卡金額
'查學生表中的臨時使用者,計算臨時使用者收費
txtSQL = "select * from student_info where userid='" & Trim(comboUserId.Text) & "'and type='臨時使用者'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
TmpRate = 0
'計算臨時使用者收費
While (mrc.EOF = False)
TmpRate = TmpRate + mrc.Fields(7)
mrc.Fields(11) = Trim("結賬") '更新資料庫
mrc.MoveNext '移動到下一條記錄
Wend
txtRegister = TmpRate '將臨時收費賦值給txtregister
mrc.Close '關閉資料庫物件
'查使用者名稱,獲取總卡數
txtSQL = "select * from student_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
N = 0
TmpRate = 0
'迴圈計算總卡數
While (mrc.EOF = False)
N = N + 1
mrc.Fields(11) = Trim("結賬") '更新資料庫結賬
mrc.MoveNext '移動到下一條記錄
Wend
txtnum = N '購卡數
mrc.Close '關閉資料集物件
'查退卡表,獲取退卡數和退卡金額
txtSQL = "select * from cancelcard_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrccan = ExecuteSQL(txtSQL, MsgText)
N = 0
cancelCash = 0
'計算退卡金額
While (mrccan.EOF = False)
N = N + 1
cancelCash = cancelCash + mrccan.Fields(2)
mrccan.Fields(6) = Trim("結賬") '更新資料庫
mrccan.MoveNext
Wend
txtbackcard = N
txtbackmoney = cancelCash '將退卡金額賦值給txtbackmoney
mrccan.Close '關閉資料集物件
'查充值表,獲取充值金額
txtSQL = "select * from recharge_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set remrc = ExecuteSQL(txtSQL, MsgText)
TmpRate = 0
'計算充值金額
While (remrc.EOF = False)
TmpRate = TmpRate + remrc.Fields(3)
remrc.Fields(7) = Trim("結賬") '更新資料庫
remrc.MoveNext '移動到下一條記錄
Wend
txtrecharge = TmpRate '將充值金額賦值給txtrecharge
'計算購卡數
txtBuycard.Text = Val(txtnum) + Val(txtbackcard)
'計算應收金額
txtcash.Text = Val(txtrecharge) + Val(txtRegister) - Val(txtbackmoney)
'關閉資料集物件
remrc.Close
最後把結賬資訊更新到日結賬表和周結賬表中。
'填寫日結賬表的內容
'本期餘額
txtSQL = "select * from student_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'and type='固定使用者'"
' txtSQL = "select * from student_info where datediff(dd,offtime,getdate())=1"
Set mrc = ExecuteSQL(txtSQL, MsgText)
Do While Not mrc.EOF
allcash = allcash + mrc.Fields(7) '本期餘額
mrc.MoveNext
Loop
'當日消費餘額
txtSQL = "select * from line_info where offdate='" & Format(Date, "yyyy-mm-dd") & "'"
Set lmrc = ExecuteSQL(txtSQL, MsgText)
Do While Not lmrc.EOF
consumecash = consumecash + lmrc.Fields(11)
lmrc.MoveNext
Loop
'當日充值金額
txtSQL = "select * from recharge_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set remrc = ExecuteSQL(txtSQL, MsgText)
Do While remrc.EOF = False
Rechargemoney = Rechargemoney + remrc.Fields(3)
remrc.MoveNext
Loop
'當日退還金額
txtSQL = "select * from cancelcard_info where userid='" & Trim(comboUserId.Text) & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrccan = ExecuteSQL(txtSQL, MsgText)
Do While mrccan.EOF = False
cancelCash = cancelCash + mrccan.Fields(2)
mrccan.MoveNext
Loop
remaincash = allcash - Rechargemoney + consumecash + cancelCash
'關閉資料集物件
mrc.Close
lmrc.Close
remrc.Close
mrccan.Close
'查詢日結賬表
txtSQL = "select * from checkday_info "
Set dmrc = ExecuteSQL(txtSQL, MsgText)
'更新日結賬表內容
With dmrc
.AddNew
.Fields(0) = remaincash
.Fields(1) = Rechargemoney
.Fields(2) = consumecash
.Fields(3) = cancelCash
.Fields(4) = allcash
.Fields(5) = Format(Date, "yyyy-mm-dd")
.Update
MsgBox "結賬成功!" '提示結賬成功
End With
'更新周結賬單
txtSQL = "select * from checkweek_info"
Set wmrc = ExecuteSQL(txtSQL, MsgText)
'更新到周結表中
With wmrc
.AddNew
.Fields(0) = dmrc.Fields(0)
.Fields(1) = dmrc.Fields(1)
.Fields(2) = dmrc.Fields(2)
.Fields(3) = dmrc.Fields(3)
.Fields(4) = dmrc.Fields(4)
.Fields(5) = dmrc.Fields(5)
.Update '更新資料集物件
wmrc.MoveNext '移動到下一條記錄
End With
wmrc.Close '關閉資料集物件
這就是整個結賬的過程。
結賬這部分花了很長時間弄好的,但是我相信時間是檢驗真理的標準,也是磨練我們意志的最硬的基石。奉勸大家一句,剛看到結賬不要急著做,要先搞清思路,搞清算賬的過程,根據自己想的試著去做,相信只要思路正確很快就可以做出來的,這也是我做結賬的感受,如果以上有不合理的,歡迎大家來指正!