机房系统(六)——【下机】


    相对于上机来说,小编觉得下机还是有点儿难度的,在进行下机时,也是耗费了很长的时间。
    在机房收费系统中,涉及到下机的,有三部分:首先是主界面上的下机,其次是操作员的所有学生下机和部分学生下机。这些部分的主要功能就是,实现上机用户的下机。总体来说,实现主体功能的思路是一样的。小编做的流程图如下:

在这里插入图片描述


    实现下机功能的总体流程,有三大部分:
    其一:对上机卡号的判定。
    其二:计算消费
    其三:更新相应的表
    在这部分中,计算用户的消费是重难点。在给定的数据库中,对它给出的各个字段的含义自己要有一个明确方向。小编最初就处于一个稀里糊涂的状态,到算钱的时候才去想这些字段到底有什么用(当没有明确规定的时候,每个人的理解可能存在偏差)。实现这部分的部分代码如下;
    Rem 定义变量,存储数据
    Dim intLineTime As Integer '定义实际上机时间
    Dim IntConSume As Single   '定义消费金额
    Dim curConsume As Single   '定义真正消费的单位时间个数
    Dim curBalance As Single   '定义余额
    Dim t As String           '定义用户类型
    
    Dim FixEdunit As Single    '定义固定用户单位时间费用(分钟)
    Dim TeMunit As Single      '定义临时用户单位费用
    Dim a As Single
    Dim RemainCash As Single   '定义余额
    
    Rem 获取BasicData表数据,把基础数据赋值给变量
    txtSQLBD = "select * from BasicData_Info"
    Set mrcBD = ExecuteSQL(txtSQLBD, MsgTextBD)
    
    
    Rem 在线时长计算,时间单位为分钟
    txtSQLOL = "select * from OnLine_Info where cardno='" & Trim(txtCardNo.Text) & "'"
    Set mrcOL = ExecuteSQL(txtSQLOL, MsgTextOL)

    intLineTime = (Date - DateValue(mrcOL!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrcOL!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrcOL!OnTime)))
    
    Rem 判断消费时间是否小于准备时间,若小于,消费时间为0,消费金额为0
    If intLineTime < Val(Trim(mrcBD.Fields(4))) Then
        txtConsumeTime.Text = "0"
        txtConsume.Text = "0"
    Else
        Rem 判断消费时间是否小于最低消费时间,若小于,则消费金额为最低消费金额
        If intLineTime < Val(Trim(mrcBD.Fields(3))) Then
            txtConsumeTime.Text = intLineTime
            txtConsume.Text = Trim(mrcBD.Fields(5))
        Else
                
            a = Int(intLineTime / Val(Trim(mrcBD!unitTime))) '单位时间个数,实际上机时间大于最低消费时间,则按单位时间个数计算,不足一个数,向上加1
            If (intLineTime Mod Trim(mrcBD!unitTime)) = 0 Then
                curConsume = a
            Else
                curConsume = a + 1
            End If
        End If
    End If
    
    Rem 判断用户类型 计算金额
    txtSQLOL = "select * from OnLine_Info where cardno='" & Trim(txtCardNo.Text) & "'"
    Set mrcOL = ExecuteSQL(txtSQLOL, MsgTextOL)
    If Trim(mrcOL.Fields(1)) = "固定用户" Then
        txtConsume.Text = Val(curConsume) * Trim(mrcBD.Fields(0)) / 30 '递增时间的个数 * 一个递增时间内的钱
    Else
        txtConsume.Text = Val(curConsume) * Trim(mrcBD.Fields(1)) / 30
    End If
    
    Rem 计算余额
    txtSQLStu = "select * from student_Info where cardno='" & Trim(txtCardNo.Text) & "'"
    Set mrcStu = ExecuteSQL(txtSQLStu, MsgTextStu)
    
    RemainCash = mrcStu!Cash - Val(txtConsume.Text)

    对于操作员的选择或使全部学生下机的功能来说,与主界面上下机不同的是,增加了对需要下机同学的选择与判断。
    全部下机使用Do While...Loop 循环实现的,【DoWhile...Loop:先判断条件是否满足,若满足,则进入循环;Do...Loop While:先进入循环执行,然后判断条件是否满足,若满足,则进入下一次的循环】。选择下机使用For...Next 循环 和定义数组实现的。
    选择下机时,给需要下机的学生做标志,将已选择的学生信息放在一个容器里面,用以区分需下机和非下机的信息。
    1、Rem 记录选中下机做标记的卡号,所有卡号信息存放到数组里
    With MSFlexGrid1
        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
    2、Rem 然后使用for...next循环体
    
    3、Rem 更新表格记录
            Rem 更新界面
        For s = 0 To i - 1
            .RemoveItem xh(s)
        Next s


    当时做这部分的时候,真是一头雾水,花费了很长时间,完成之后再回顾的时候,才发现其实并没有很多难理解的内容。弄明白一部分的下机,其他的都是大同小异的。

猜你喜欢

转载自blog.csdn.net/LZ15932161597/article/details/84666842