机房收费系统-动态计费与强制下机

前言:之前以为自己机房收费系统马上就要收官了,结果最近自己发现还少点功能:那就是动态计费功能与强制下机功能。本次博客分为两个模块:第一模块为主界面的动态计费及强制下机,第二模块为学生上机状态查询的选中下机模块。

两个难点的功能分别参考了十五期张铎和十四期李光师哥的博客,在此向两位巨人表示感谢。

动态计费:**针对来上机的学生的功能。**我们在去网吧的时候想必都查过自己的余额,因为有时候玩得昏天黑地的也不知道自己还剩几个钱了,总不能在玩得最激烈的时候被系统提醒没钱,还要离开机位去充钱吧,万一你挂机的这会时间就被翻盘了怎么办(雾)。所以这个动态计费就是给用户最直观地提供当前的消费情况,便于用户之后做下一步决定,是去充钱还是消费完后离开。

选择下机:**针对操作员的功能。**当上机人数很多,而要离开的学生也很多但又不是所有学生离开的情况下,我们肯定不能一个个地给学生下机,所以这时候我们就需要批量操作:下机具体的多名学生并结帐。

一、动态计费:
动态计费的流程图:
在这里插入图片描述
动态计费中的代码:

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

总结:机房收费系统的下机和动态计费之间虽然有一些逻辑联系,但尽量代码不要无脑粘过来,需要自己好好准备才能完成动态计费的完整功能;选中下机则需要自己研究变量、数组的概念。

猜你喜欢

转载自blog.csdn.net/Marshallren/article/details/83929921