機房收費系統——上下機操作
按照順序來講到網咖的顧客,分為兩種一是辦卡充錢的會員,一種是交錢上網的臨時使用者。充完錢之後,一般使用者(網管)就需要對顧客進行上機來記錄時間,下機時進行收費。
上機:上機過程比較簡單,涉及資料庫中的三張表:online_info 、student_info、basicdata_info
上機的判斷過程如下:1.從student表中判斷卡號是否存在、此卡狀態是否使用
2.判斷卡內或者臨時使用者的金額是否充足(>0??)
3.從online表判斷此卡是否正在上機
4.將資訊顯示到上級介面中,更新
下機:下機過程涉及到收費的錢數計算,所以相對複雜,涉及資料庫中的四張表:online_info、student_info、basicdata_info、line_info
下機的判斷過程如下:1.從student表中判斷卡號是否存在、此卡狀態是否使用
2.從online表判斷此卡是否正在上機
3.更新line表和student表中的金額
計算消費時間是一個難點,用datediff函式計算間隔時間,但是使用者除了一天的上機時間,有時出現包宿或者兩天連續上網,就需要考慮進來。共分出三種情況:(1)、24小時內的消費時間(2)、沒有超過24小時但是經過了24:00:00時刻(3
程式碼如下:'datediff函式的格式:DATEDIFF(datepart,startdate,enddate),計算結果是後者減去前者
diffmtime = Val(DateDiff("n", Time, mrcE.Fields(7))) '時間差以分表示 diffhtime = Val(DateDiff("h", mrcE.Fields(7), Time)) '時間差以小時表示 diffdtime = Val(DateDiff("d", mrcE.Fields(6), Date)) '時間差以天表示 If diffhtime >= 0 And diffdtime = 0 Then '24小時以內的時間計算 diffmtime = Val(DateDiff("n", mrcE.Fields(7), Time)) ElseIf diffhtime < 0 And diffdtime > 0 Then '過了24:00:00但是沒有超過24小時 diffmtime = 24 * 60 + diffmtime Else diffmtime = (diffdtime * 24 + diffhtime) * 60 '超過24小時 End If txtsql = "select * from basicdata_info" Set mrcF = ExecuteSQL(txtsql, msgtext) '第一種情況:上機時間《準備時間 If Abs(Val(diffmtime)) < Val(mrcF.Fields(4)) Then txtoffdate = Date txtofftime = Time txtconsumetime.Text = Abs(diffmtime) txtconsume.Text = 0 MsgBox "下機成功!", vbOKOnly + vbExclamation, "恭喜" '第二種情況:準備時間《上機時間《至少上機時間 ElseIf Abs(Val(diffmtime)) <= Val(mrcF.Fields(3)) Then txtoffdate.Text = Date txtofftime.Text = Time txtconsumetime.Text = Abs(diffmtime) If txttype.Text = "固定使用者" Then txtconsume.Text = Round((mrcF.Fields(3) / 60) * mrcF.Fields(0)) Else txtconsume.Text = Round((mrcF.Fields(3) / 60) * mrcF.Fields(1)) End If txtcash.Text = mrcD.Fields(7) - txtconsume.Text MsgBox "下機成功!", vbOKOnly + vbExclamation, "恭喜" Exit Sub '把固定使用者、臨時使用者單位時間的費用分別賦給費用 '第三種情況:上機時間》至少上機時間 ElseIf Abs(Val(diffmtime)) > Val(mrcF.Fields(3)) Then txtconsumetime.Text = Abs(diffmtime) txtoffdate.Text = Date txtofftime.Text = Time If txttype.Text = "固定使用者" Then txtconsume = Format(Round(diffmtime / 60 * mrcF.Fields(0), 2), "0.0") Else txtconsume = Format(Round(Abs(diffmtime) / 60 * mrcF.Fields(1), 2), "0.0") End If
ROUND(number, num_digits)引數number必需。要四捨五入的數字。num_digits必需。位數,按此位數對 number 引數進行四捨五入。
round函式不是一般意義上的四捨五入,這改變了我以前的理解
四捨六入五單雙(舉例:1.24=1.2 1.26=1.3)
五後非零應進一(舉例:1.251=1.3)
五後皆零視奇偶
五前為偶應捨去(舉例:1.25=1.2)
五前為奇則進一(舉例:1.35=1.4)
Format格式轉換函式用來保留小數點前的零:VB 中獨特的處理數字的格式使得小數在text中顯示時小數點前的零被省略,所以需要用到format函式。
舉例:小數點前全省略format(0.05,”##.##“)=.05 小數點前以0補齊 format(0.05,“00.00”)=00.005 正確格式:format(0.05,“0.00”)=0.005
附加功能:考慮到理論和實際情況的聯絡,我們增加了實時動態更新上機費用,防止使用者剩餘金額出現零元或者負值的情況。
功能實現:新增timer控制元件,編寫它的timer事件。動態下機和下機的程式碼基本一致,只是通過一個整體的DO while…………loop語句實現對每一個上機使用者的迴圈檢查,每一秒鐘迴圈檢查一次,一旦使用者餘額為“0”,立即強制下機,更新line表和student表。
在上機和下機的過程中涉及到了一個統計上機人數的問題,按照我自己的固有思路就是在上機和下機的程式碼中增加上機人數的更新,每次上機增加1每次下機減少1,利用mrc.recordcount統計總上機人數,因此在上機和下機中都要新增sql查詢語句,這種方法在思路和應用中沒有問題,只是增加了程式碼量並且摻雜在本來就很大程式碼量的上下機中會增加我們出錯的概率,參考師哥師姐部落格發現可以用到timer控制元件,編寫它的timer時間,每次上機或者下機的下一秒都會觸發timer事件,及時計算上機人數,程式碼如下:
Private Sub Timer_Timer() '利用timer控制元件實時更新上機人數
Dim txtsql As String
Dim msgtext As String
Dim mrc As ADODB.Recordset
txtsql = "select * from Online_Info "
Set mrc = ExecuteSQL(txtsql, msgtext)
Label16.Caption = mrcD.RecordCount
mrcD.Close
End Sub
這就是我認識的上下機,本來一籌莫展的問題,只要有了方向和思路就很容易解決了。