机房收费系统之上下机

来源:互联网 发布:淘宝店铺密码忘了 编辑:程序博客网 时间:2024/05/21 10:42

      【前言】上下机部分涉及到的表较多,逻辑性也比较强,如果不先理清逻辑关系就上手写代码肯定会出现好多问题。我的上下机从开始的一头雾水到后来的逐渐清晰到现在的soeasy,经历了一个不断学习和摸索的过程。其实所有的学习都会经历这个过程,如果我们没有之前的探索就不会有后来的熟练掌握。

       一、上机逻辑

       我们在动手之前一定要有一个清晰地逻辑,画出流程图认真思考还有没有落下的地方,再补充流程图,按着步骤写代码,上下机就变得很简单了。

上机其实没有什么难得就是把所有的要验证的条件想全面了就好了,什么情况下允许上机,什么情况下需要用户做出修改才能上机,这些都是要提前考虑清楚的,然后就是在Online和Line表里添加上机信息数据,再显示在桌面就行啦!

    下面是我画的上机流程图:

  

        我的代码展示:

 '判断卡号是否为空    If Not Testtxt(txtCardNo.Text) Then        MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "提示"        txtCardNo.SetFocus        Exit Sub    End If    '判断是否为数字    If Not IsNumeric(txtCardNo.Text) Then        MsgBox "卡号为数字,请输入数字!", vbOKOnly + vbExclamation, "提示"        txtCardNo.Text = ""        txtCardNo.SetFocus        Exit Sub    End If    '判断是否注册    txtSQLStu = "select * from student_Info where cardno='" & Trim(txtCardNo.Text) & "'" & "and status='使用" & "'"    Set mrcStu = ExecuteSQL(txtSQLStu, MsgText)        If mrcStu.EOF = True Then        MsgBox "该卡未注册或已经退卡,请输入有效卡号!", vbOKOnly + vbExclamation, "提示"        txtCardNo.Text = ""        txtCardNo.SetFocus        Exit Sub    Else        txtSQLon = "select * from Online_Info where cardno='" & Trim(txtCardNo.Text) & "'"        Set mrcon = ExecuteSQL(txtSQLon, MsgText)        '判断是否在上机        If mrcon.EOF = False Then            MsgBox "该卡正在上机,请选择其他卡号上机!", vbOKOnly + vbExclamation, "提示"            txtCardNo.Text = ""            txtCardNo.SetFocus            Exit Sub        Else            txtSQLBas = "select * from BasicData_Info"            Set mrcBas = ExecuteSQL(txtSQLBas, MsgText)                        If mrcStu.Fields(7) < mrcBas.Fields(0) Then                MsgBox "卡内余额不足,请充值后再上机!", vbOKOnly + vbExclamation, "提示"                txtCardNo.Text = ""                frmOpeRecharge.Show                Exit Sub            Else                '更新桌面显示的内容                txtSID.Text = Trim(mrcStu.Fields(1))                txtDepart.Text = Trim(mrcStu.Fields(4))                txtType.Text = Trim(mrcStu.Fields(14))                txtName.Text = Trim(mrcStu.Fields(2))                txtSex.Text = Trim(mrcStu.Fields(3))                txtOnlineDate.Text = Trim(Date)                txtOnlineTime.Text = Trim(Time)                txtDownLineDate.Text = ""                txtDownLineTime.Text = ""                txtBalance.Text = Trim(mrcStu.Fields(7))                txtConsumeTime.Text = ""                txtConsumeMoney.Text = ""                '将内容添加到online表                mrcon.AddNew                mrcon.Fields(0) = Trim(txtCardNo.Text)                mrcon.Fields(1) = Trim(txtType.Text)                mrcon.Fields(2) = Trim(txtSID.Text)                mrcon.Fields(3) = Trim(txtName.Text)                mrcon.Fields(4) = Trim(txtDepart.Text)                mrcon.Fields(5) = Trim(txtSex.Text)                mrcon.Fields(6) = Trim(Date)                mrcon.Fields(7) = Trim(Time)                mrcon.Fields(8) = VBA.Environ("computername")                mrcon.Fields(9) = Trim(Now)                mrcon.Fields(10) = Trim(Val(0))                mrcon.Update                '将信息更新到Line表                txtSQLline = "select * from Line_Info where cardno='" & txtCardNo.Text & "'"                Set mrcline = ExecuteSQL(txtSQLline, MsgText)                mrcline.AddNew                mrcline.Fields(1) = Trim(txtCardNo.Text)                mrcline.Fields(2) = Trim(txtSID.Text)                mrcline.Fields(3) = Trim(txtName.Text)                mrcline.Fields(4) = Trim(txtDepart.Text)                mrcline.Fields(5) = Trim(txtSex.Text)                mrcline.Fields(6) = Trim(Date)                mrcline.Fields(7) = Trim(Time)                mrcline.Fields(13) = Trim("正常上机")                mrcline.Fields(14) = Trim(VBA.Environ("computername"))                mrcline.Update                mrcStu.Close                mrcon.Close                mrcline.Close            End If        End If    End If


        二、下机逻辑

       下机的主要逻辑其实和上机的逻辑大同小异,比较复杂的就是计算消费金额。这里有一个问题就是如果上机用户改变系统时间我们算的钱不会出错,所以要么我们读取的不能是系统时间,要么我们就不能使用上机时间减去下机时间的方法来计算消费时间。

       我采用的方法是加了一个timer控件,每分钟执行一次,数据库中的消费时间就会+1,这样就算用户改了系统时间也不会影响他的消费时间。

       之前我把扣费也加到这个timer事件里了,每隔一个单位递增时间就会扣一次钱,但是第一个人上机时正常扣费的,第二个人上机就会有一段时间不收钱,直到第一个用户下一次收费,第二个用户才能进行第一次扣费,这就导致之后上机的用户都会有一段时间是不收钱的,这样赔本的买卖,客户怎么会接受这样的系统呢。如果我们想要实现这个功能,就需要在数据库里做下修改,加一个i,让每一个用户上线i都是为1的,这样就不会出现上述的问题。这样在用户余额不足的时候就会让他强制下机的。

    下机流程图:

   之前的收费代码(有漏洞):

Private Sub Timer2_Timer()    Dim unitTime As String    Dim leastTime As String    txtSQLBas = "select * from BasicData_Info"    Set mrcBas = ExecuteSQL(txtSQLBas, MsgText)    unitTime = mrcBas.Fields(2)    leastTime = mrcBas.Fields(3)    txtSQLon = "select * from Online_Info"    Set mrcon = ExecuteSQL(txtSQLon, MsgText)        '当online表没有数据时直接跳出此过程    If mrcon.EOF = True Then        Exit Sub    End If    '到单位递增时间扣一次钱,在准备时间不扣钱    Do While (mrcon.EOF = False)        mrcon.Fields(10) = Val(mrcon.Fields(10)) + 1        mrcon.Update        If i = Val(leastTime) + 1 Then                If Val(Trim(mrcon.Fields(11))) < Val(Trim(mrcBas.Fields(1))) Then                    MsgBox "余额不足,即将强制下机!", vbOKOnly + vbExclamation, "警告"                    txtCardNo.Text = mrcon.Fields(0)                    Call CmdDownLine_Click                    Exit Sub                End If                Else                    If Trim(mrcon.Fields(1)) = Trim("固定用户") Then                        mrcon.Fields(11) = Val(Trim(mrcon.Fields(11))) - Val(Trim(mrcBas.Fields(0)))                       mrcon.Update                    End If                    If Trim(mrcon.Fields(1)) = Trim("临时用户") Then                        mrcon.Fields(11) = Val(Trim(mrcon.Fields(11))) - Val(Trim(mrcBas.Fields(1)))                        mrcon.Update                    End If                    i = i + 1                End If        Else             If i >= (Val(unitTime)) Then                i = 1             Else                i = i + 1             End If        End If            mrcon.MoveNext    Loop  End Sub

   计算消费时间代码:

Private Sub Timer2_Timer()    txtSQLon = "select * from Online_Info"    Set mrcon = ExecuteSQL(txtSQLon, MsgText)        '当online表没有数据时直接跳出此过程    If mrcon.EOF = True Then        Exit Sub    End If    '执行一次,消费时间+1    Do While (mrcon.EOF = False)        mrcon.Fields(10) = Val(mrcon.Fields(10)) + 1        mrcon.Update        mrcon.MoveNext    LoopEnd Sub

   下机代码:

 '判断卡号是否为空    If Not Testtxt(txtCardNo.Text) Then        MsgBox "请输入要下机的卡号!", vbOKOnly + vbInformation, "提示"        txtCardNo.SetFocus        Exit Sub    End If    '判断输入的是否为数字    If Not IsNumeric(txtCardNo.Text) Then        MsgBox "卡号请输入数字!", vbOKOnly + vbExclamation, "警告"        txtCardNo.Text = ""        txtCardNo.SetFocus        Exit Sub    End If    '判断是否注册或使用    txtSQLStu = "select * from student_Info where cardno='" & Trim(txtCardNo.Text) & "'" & "and status='使用" & "'"    Set mrcStu = ExecuteSQL(txtSQLStu, MsgText)        If mrcStu.EOF = True Then        MsgBox "该卡未注册或已经退卡,请输入有效卡号!", vbOKOnly + vbExclamation, "提示"        txtCardNo.Text = ""        txtCardNo.SetFocus        Exit Sub    Else        txtSQLon = "select * from Online_Info where cardno='" & Trim(txtCardNo.Text) & "'"        Set mrcon = ExecuteSQL(txtSQLon, MsgText)        '判断是否在上机        If mrcon.EOF = True Then            MsgBox "该卡没有上机,请输入正确的卡号!", vbOKOnly + vbExclamation, "提示"            txtCardNo.Text = ""            txtCardNo.SetFocus            Exit Sub        Else            txtSQLline = "select * from Line_Info where cardno='" & Trim(txtCardNo.Text) & "'and status='正常上机'"            Set mrcline = ExecuteSQL(txtSQLline, MsgText)            '计算消费金额            comsumeTime = mrcon.Fields(10)            '如果消费时间小于准备时间则不收钱,如果大于准备时间小于最短上机时间则半价,如果大于最短上机时间则正常收费            If Val(comsumeTime) <= Val(prepareTime) Then                mrcline.Fields(11) = "0"            Else                If Val(comsumeTime) < Val(leastTime) Then                    If Trim(mrcon.Fields(1)) = Trim("固定用户") Then                        mrcline.Fields(11) = 0.5 * mrcBas.Fields(0)                    Else                        mrcline.Fields(11) = 0.5 * mrcBas.Fields(1)                    End If                Else                    If Val(comsumeTime) Mod Val(unitTime) = 0 Then                        t = Int(comsumeTime / unitTime)                    Else                        t = Int(comsumeTime / unitTime) + 1                    End If                    If Trim(mrcon.Fields(1)) = Trim("固定用户") Then                        mrcline.Fields(11) = t * mrcBas.Fields(0)                    Else                        mrcline.Fields(11) = t * mrcBas.Fields(1)                    End If               End If            End If                        '将所有数据更新到line表里            mrcline.Fields(8) = Trim(Date)            mrcline.Fields(9) = Trim(Time)            mrcline.Fields(10) = Trim(mrcon.Fields(10))            mrcline.Fields(12) = Trim(mrcStu.Fields(7) - mrcline.Fields(11))            mrcline.Fields(13) = "正常下机"            mrcline.Fields(14) = Trim(VBA.Environ("computername"))            mrcline.Update            mrcStu.Fields(7) = Trim(mrcline.Fields(11))            mrcStu.Update            '更新桌面的内容            txtType.Text = Trim(mrcon.Fields(1))            txtSID.Text = Trim(mrcon.Fields(2))            txtName.Text = Trim(mrcon.Fields(3))            txtDepart.Text = Trim(mrcon.Fields(4))            txtSex.Text = Trim(mrcon.Fields(5))            txtOnlineDate.Text = Trim(mrcon.Fields(6))            txtOnlineTime.Text = Trim(mrcon.Fields(7))            txtDownLineDate.Text = Trim(Date)            txtDownLineTime.Text = Trim(Time)            txtConsumeTime.Text = Trim(mrcline.Fields(10))            txtConsumeMoney.Text = Trim(mrcline.Fields(11))            txtBalance.Text = Trim(mrcline.Fields(12))            mrcon.Delete            mrcon.Close            mrcStu.Close            mrcline.Close            MsgBox "下机成功!", vbOKOnly, "恭喜"            txtCardNo.Text = ""            txtSID.Text = ""            txtDepart.Text = ""            txtType.Text = ""            txtName.Text = ""            txtSex.Text = ""            txtOnlineDate.Text = ""            txtOnlineTime.Text = ""            txtDownLineDate.Text = ""            txtDownLineTime.Text = ""            txtBalance.Text = ""            txtConsumeTime.Text = ""            txtConsumeMoney.Text = ""        End If    End If

   【总结】接触一个新事物的时候首先要做的就是打败自己的畏难心理,静下心来慢慢分析不可急躁,否则一开始心烦就无法冷静思考了。其实只要认真分析没有什么难的,要把自己的想法尽可能实现出来,如果觉得不合理就可以改正它,相信随着我们的不断成长我们做出的系统肯定会越来越完善的。

1 0
原创粉丝点击