相对于上机来说,小编觉得下机还是有点儿难度的,在进行下机时,也是耗费了很长的时间。
在机房收费系统中,涉及到下机的,有三部分:首先是主界面上的下机,其次是操作员的所有学生下机和部分学生下机。这些部分的主要功能就是,实现上机用户的下机。总体来说,实现主体功能的思路是一样的。小编做的流程图如下:
实现下机功能的总体流程,有三大部分:
其一:对上机卡号的判定。
其二:计算消费
其三:更新相应的表
在这部分中,计算用户的消费是重难点。在给定的数据库中,对它给出的各个字段的含义自己要有一个明确方向。小编最初就处于一个稀里糊涂的状态,到算钱的时候才去想这些字段到底有什么用(当没有明确规定的时候,每个人的理解可能存在偏差)。实现这部分的部分代码如下;
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
当时做这部分的时候,真是一头雾水,花费了很长时间,完成之后再回顾的时候,才发现其实并没有很多难理解的内容。弄明白一部分的下机,其他的都是大同小异的。