机房收费系统——自动结算,强制下机(timer事件一件搞定)

本文详细介绍了在机房收费系统中实现自动下机功能的过程。从最初的设计误区到最终解决问题,通过定义卡号数组并结合定时器事件,实现了每分钟自动更新余额并判断是否需要自动下机的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

这个部分确实让我花费了不少心血呢,当然收获也真是不少。知道有自动下机这么回事是在第一次验收机房收费系统的时候,浩东问我弄没弄自动下机那一块儿,这我才知道还有这么一个模块儿,顿时……好尴尬,又有好玩儿的了,哈哈

因为我之前也有对于余额不足的限制,只不过是在退卡时加了限制,我实现的是,退卡时查看,若余额不足,无法退卡,但师父说,那我就不退卡了,不行么?我就直接走人,我说,好,师父,你够任性。

那我还是乖乖做自动下机好啦

 

过程:

那我就开始画流程图

(这不,这是我的手稿,感觉思路还是挺清楚的,我就开始写代码,但我的代码经过断点调试,没有实现每个卡号都查,原因是我的误区是误以为有了timer事件就可以高枕无忧了,我没有计算时间,而是直接按照一分钟算钱,这样的错误,使得我无法正常的让每个卡号都自动更新余额)

这之中为了解决这个问题,请教了多位长老,也和牛哥聊了很久,在代码,思维上,有了新的认识,在这里感谢各位大牛的指点。

这是正确的代码:

'先判断是否有卡号上机,查询上机表

    txtSQL = "select * from online_info"
    Set mrc = ExecuteSQL(txtSQL, msgtext)

    '判断是否有卡号正在上机
    If mrc.EOF = True Then
        Timer2.Enabled = False
        Exit Sub
    Else
        mrc.MoveFirst
    End If
	  

 '重中之重的关键是“定义卡号的数组”

    '将所有上机卡号定义为一个数组
    ReDim a(mrc.RecordCount) As String
        For i = 0 To mrc.RecordCount - 1
            a(i) = Trim(mrc!cardno)
            cardno = a(i)

            txtSQL = "select * from online_Info where cardno='" & Trim(cardno) & "'"
            Set mrc1 = ExecuteSQL(txtSQL, msgtext)

            txtSQL = "select * from student_Info where cardno='" & Trim(cardno) & "'"
            Set mrc2 = ExecuteSQL(txtSQL, msgtext)

            txtSQL = "select * from line_Info where status='" & "正常上机" & "' and cardno='" & Trim(cardno) & "'"
            Set mrc3 = ExecuteSQL(txtSQL, msgtext)

'然后就是开始算钱了

    '记录上机日期
    ondate = Trim(mrc1.Fields(6))
    ontime = Trim(mrc1.Fields(7))

    '计算上机时间
    valueDate = DateDiff("n", ondate, Date)      '到目前的上机日期
    valueTime = DateDiff("n", ontime, Time)      '到目前的上机时间
    valueTime = valueDate + valueTime

    txtSQL = "select * from basicdata_info"
    Set mrc4 = ExecuteSQL(txtSQL, msgtext)

    '计算单位金额
    If mrc2.Fields(14) = "固定用户" Then
        pay = Format(mrc4.Fields(0) / 60, "0.0")
    Else
        pay = Format(mrc4.Fields(1) / 60, "0.0")
    End If

    '判断上机时间是否大于准备时间,计算消费金额
    If valueTime >= 2 Then
        valuetime1 = valueTime - (valueTime - 1)
        pay = Format(pay * valuetime1, "0.0")
    Else
        pay = Format(pay * valueTime, "0.0")
    End If

    '更新student表的cash
    mrc2.Fields(7) = mrc2.Fields(7) - pay
    mrc2.Update
    lblcash.Caption = mrc2.Fields(7)

    '余额不足20元提示
    If Val(mrc2.Fields(7)) > 0 And Val(mrc2.Fields(7)) < Val(mrc4.Fields(5)) Then
         MsgBox a(i) & ",您卡内金额已不足" & Val(mrc4.Fields(5)) & "元,请尽快充值!", 48, "温馨提示"
'         Exit Sub
    End If

   '判断是否余额为0,更新student,online表
    If Val(mrc2.Fields(7)) <= 0 Then
        mrc2.Fields(7) = 0
        mrc2.Update
        mrc1.Delete
        mrc1.Update
        MsgBox "卡号:" & a(i) & ",余额不足,即将下机!", 48, "警告"

        '更新line表
        mrc3.Fields(8) = Date
        mrc3.Fields(9) = Time
        mrc3.Fields(12) = mrc2.Fields(7)
        mrc3.Fields(10) = valueTime
        mrc3.Fields(11) = pay
        mrc3.Update
    End If
    mrc.MoveNext
    Next i

 以上这一大步走的就是下机的一套流程,只是这套流程,放在了timer事件里,timer的interval 设置成60000,这样就是每一分钟记一次费,动态地完成了自动查询余额。

后记:

困难不可怕,迎难而上;逃避最可怕,勇敢面对

每次遇到问题都是逃避,等真正的大问题来了,解决起来就难上加难了,还是那句话,欠下的,迟早都要还,我想早点儿还,哈哈

 

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值