1. 程式人生 > >機房收費系統——上下機操作

機房收費系統——上下機操作

按照順序來講到網咖的顧客,分為兩種一是辦卡充錢的會員,一種是交錢上網的臨時使用者。充完錢之後,一般使用者(網管)就需要對顧客進行上機來記錄時間,下機時進行收費。

上機:上機過程比較簡單,涉及資料庫中的三張表:online_info student_infobasicdata_info      

上機的判斷過程如下:1.student表中判斷卡號是否存在、此卡狀態是否使用

                                             2.判斷卡內或者臨時使用者的金額是否充足(>0??

3.online表判斷此卡是否正在上機

4.將資訊顯示到上級介面中,更新

online表資訊

下機:下機過程涉及到收費的錢數計算,所以相對複雜,涉及資料庫中的四張表:online_infostudent_infobasicdata_infoline_info

下機的判斷過程如下:1.student表中判斷卡號是否存在、此卡狀態是否使用

2.online表判斷此卡是否正在上機

3.更新line表和student表中的金額

計算消費時間是一個難點,用datediff函式計算間隔時間,但是使用者除了一天的上機時間,有時出現包宿或者兩天連續上網,就需要考慮進來。共分出三種情況:(1)、24小時內的消費時間2)、沒有超過24小時但是經過了24:00:00時刻3

)、超過了24小時的消費時間

程式碼如下:'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函式。

舉例:小數點前全省略format0.05##.##=.05             小數點前以0補齊 format0.0500.00=00.005   正確格式:format0.050.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
這就是我認識的上下機,本來一籌莫展的問題,只要有了方向和思路就很容易解決了。