機房收費系統-動態計費與強制下機
前言:之前以為自己機房收費系統馬上就要收官了,結果最近自己發現還少點功能:那就是動態計費功能與強制下機功能。本次部落格分為兩個模組:第一模組為主介面的動態計費及強制下機,第二模組為學生上機狀態查詢的選中下機模組。
兩個難點的功能分別參考了十五期張鐸和十四期李光師哥的部落格,在此向兩位巨人表示感謝。
動態計費:**針對來上機的學生的功能。**我們在去網咖的時候想必都查過自己的餘額,因為有時候玩得昏天黑地的也不知道自己還剩幾個錢了,總不能在玩得最激烈的時候被系統提醒沒錢,還要離開機位去充錢吧,萬一你掛機的這會時間就被翻盤了怎麼辦(霧)。所以這個動態計費就是給使用者最直觀地提供當前的消費情況,便於使用者之後做下一步決定,是去充錢還是消費完後離開。
選擇下機:**針對操作員的功能。**當上機人數很多,而要離開的學生也很多但又不是所有學生離開的情況下,我們肯定不能一個個地給學生下機,所以這時候我們就需要批量操作:下機具體的多名學生並結帳。
一、動態計費: 動態計費的流程圖: 動態計費中的程式碼:
Private Sub Timer2_Timer() Dim mrcol As ADODB.Recordset Dim mrcs As ADODB.Recordset Dim mrcl As ADODB.Recordset Dim mrcoloff As ADODB.Recordset Dim mrcbd As ADODB.RecordsetDim alltime As Integer Dim unitTime As Integer Dim costmoney As Integer Dim balance As Integer Dim unitmoney As Integer Dim i As IntegerDim cardno As String txtSQL = "select cash from student_info,online_info where student_info.cardno=online_info.cardno" Set mrcs = ExecuteSQL(txtSQL, MsgText) txtSQL = "select * from online_info" Set mrcol = ExecuteSQL(txtSQL, MsgText) '判斷是否有卡號上機 If mrcol.EOF Then Timer2.Enabled = False Exit Sub Else mrcol.MoveFirst End If '將上機卡號定義為一個數組 ReDim a(mrcol.RecordCount) As String For i = 0 To mrcol.RecordCount - 1 a(i) = Trim(mrcol!cardno) cardno = a(i) '查詢表 txtSQL = "select * from online_info where cardno='" & Trim(cardno) & "'" Set mrcl = ExecuteSQL(txtSQL, MsgText) txtSQL = "select * from basicdata_info" Set mrcbd = ExecuteSQL(txtSQL, MsgText) '計算上機時長 alltime = (Date - DateValue(mrcol!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrcol!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrcol!OnTime))) '根據使用者型別計算每分鐘收費,用於後面的動態餘額計算 If Trim(mrcol!cardtype) = "固定使用者" Then unitmoney = Format(1 / 60 * mrcbd!Rate, "0.0") Else unitmoney = Format(1 / 60 * mrcbd!tmprate, "0.0") End If '判斷使用者型別從而計費'''''''''''''''''''''''''''''''''''''''''' If Trim(mrcol!cardtype) = "固定使用者" Then costmoney = Format(alltime / 60 * mrcbd!Rate, "0.0") Else costmoney = Format(alltime / 60 * mrcbd!tmprate, "0.0") End If '判斷是否超過準備時間 If alltime < mrcbd!leastTime Then txtCostMoney = 0 End If '動態計算餘額''''''''''''''''''''''''''''''''''''''''''''''''''' balance = Format(mrcs!cash - unitmoney, "0.0") txtBalance.Text = Format(balance, "0.0") '動態顯示桌面的餘額 txtCostMoney.Text = Format(costmoney, "0.0") '動態顯示桌面的計費 mrcs!cash = Format(mrcs!cash - unitmoney, "0.0") '向資料庫內寫入資料 mrcs.Update '判斷餘額是否低於最低充值要求'''''''''''''''''''''''''''''''''''''''''''''''''''' If Val(mrcs!cash) > 0 And Val(mrcs!cash) <= Val(mrcbd!limitcash) Then MsgBox a(i) & ",您的卡內餘額已經不足" & Val(mrcbd!limitcash) & "元,請儘快充值!", 0 + 48, "提示" End If '判斷使用者餘額是否已經用光,更新學生和下機表 If Val(mrcs!cash) <= 0 Then MsgBox "卡號:" & a(i) & ",餘額不足,即將下機!", 0 + 48, "提示" txtCardID.Text = mrcol!cardno frmMain.cmdOffline = True End If mrcol.MoveNext mrcs.MoveNext Next End Sub
動態計費中的難點:
1.定義變數。在之前的程式碼中,我只有在一些陣列上會定義變數,但是在本模組中因為我不經常定義變數的習慣吃了大虧:我平常更習慣於用某一控制元件直接承載某個值,這樣就會導致很大程度的混亂。所以,在這裡我以balance和costmoney分別承載餘額和消費金額,而不是用txt控制元件直接承載餘額和消費餘額。
2.對餘額計算的理解。 在程式碼balance = Format(mrcs!cash - unitmoney, “0.0”)中,很明確地表示了計算餘額的方法:用學生表中的金額減去單位時間所走的金額,但在這段程式碼被我意識到之前,我卻遇到了bug:餘額控制元件中的計算和下機時的餘額計算結果完全不一樣,而且中間上機時間越長,差距越大。後來我發現了問題所在並加入了這行程式碼:
'根據使用者型別計算每分鐘收費,用於後面的動態餘額計算
If Trim(mrcol!cardtype) = "固定使用者" Then
unitmoney = Format(1 / 60 * mrcbd!Rate, "0.0")
Else
unitmoney = Format(1 / 60 * mrcbd!tmprate, "0.0")
End If
這行程式碼的意思就是每分鐘所花費的金額。在動態計費中,timer控制元件是每分鐘迴圈一次,所以公式減法理應是每單位時間減去固定的值。而在我之前的程式碼中,因為參照之前下機程式碼中的總計費時間來當作減數的,而這個減數值在timer迴圈裡是會不斷增大的,所以就導致了以上的錯誤。
3.陣列概念 自己之前對陣列的定義瞭解不足,所以在看其他人部落格的時候很是迷惑,所以為了瞭解它自己又花了一段時間去解讀。
二、選擇下機 選擇下機主要流程不難,主要難點是對MSHFlexGrid控制元件的一些知識點和定義變數、陣列的理解。(李光師哥的部落格)
Private Sub mnuDown_Click()
Dim sz(9999) As String
Dim xh(9999) As String
Dim txtCash As String
Dim consumetime As String
Dim costmoney As String
Dim alltime As Integer
Dim z As Integer
Dim i As Integer
Dim s As Integer
Dim j As IntegerDim balance As Integer With MyFlexGrid
'記錄選中下機使用者
i = 0
For j = 1 To .Rows - 1
If .TextMatrix(j, 5) = "√" Then
sz(i) = .TextMatrix(j, 0)
xh(i) = Val(j)
i = i + 1
End If
Next j
For z = 0 To i - 1
'更新表
txtSQL = "select * from basicdata_info"
Set mrcbd = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from student_info where cardno='" & sz(z) & "'"
Set mrcs = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from online_info where cardno='" & sz(z) & "'"
Set mrol = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from line_info where cardno='" & sz(z) & "'"
Set mrl = ExecuteSQL(txtSQL, MsgText)
'計算消費時間
alltime = (Date - DateValue(mrol!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrol!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrol!OnTime)))
'判斷是什麼型別使用者,從而進行計費
If Trim(mrol!cardtype) = "固定使用者" Then
costmoney = Val(alltime / 60 * mrcbd!Rate)
Else
costmoney = Val(alltime / 60 * mrcbd!tmprate)
End If
'判斷是否超過準備時間
If alltime < mrcbd!leastTime Then
costmoney = 0
End If
'計算餘額
balance = Val(mrcs!cash) - Val(costmoney)
'更新學生表中的資金
txtSQL = "update student_info set cash=" & balance & " where cardno='" & sz(z) & "'"
Set mrcsu = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from line_info where cardno='" & mrol!cardno & "'"
Set mrl = ExecuteSQL(txtSQL, MsgText)
mrl.AddNew
mrl!cardno = mrol!cardno
mrl!studentno = mrol!studentno
mrl!studentname = mrol!studentname
mrl!department = mrol!department
mrl!sex = mrol!sex
mrl!ondate = mrol!ondate
mrl!OnTime = mrol!OnTime
mrl!offdate = Date
mrl!offtime = Time
mrl!consumetime = alltime
mrl!consume = costmoney
mrl!cash = Trim(mrcs!cash) - costmoney
mrl!Status = "未結賬"
mrl!computer = Trim(VBA.Environ("computername"))
mrl.Update
'清空online表中的上機資料
txtSQL = "delete from online_info where cardno='" & sz(z) & "'"
Set mrad = ExecuteSQL(txtSQL, MsgText)
Next z
'更新Myflexgrid的介面
For s = 0 To i - 1
.RemoveItem xh(s)
Next s
End With
End Sub
總結:機房收費系統的下機和動態計費之間雖然有一些邏輯聯絡,但儘量程式碼不要無腦粘過來,需要自己好好準備才能完成動態計費的完整功能;選中下機則需要自己研究變數、陣列的概念。