下机相对与机房而言,涉及的表更多,涉及到的数据更新也更加的复杂,需要多次访问数据库进行增删改查,所以流程图在这里显得就尤为重要,下机我不是在一天完成的,有了流程图我才很好的接上了之前写代码的思路。
我个人认为下机的难点就是数据多,对应关系很难理清,容易搞混,我自己的解决办法就是,先把所有的信息都显示到页面里,无论是上机的时长还是金额,先统统计算出来,显示到界面上之后再考虑和数据库之间的交互,这样的优点是不容易搞错数据。im mrca As ADODB.Recordset '用来存储OnLine_info 的sql语句
Dim txtSQLa As String '用来接收返回的结果
txtSQLa = "exec proc_OnLine_info @cardno = '" & txtCardName.Text & "'" '连接Online表判断是否已经上机
Set mrca = ExecuteSQL(txtSQLa, MsgText)
If mrca.EOF Then
MsgBox "卡号未上机或不存在", vbOKCancel + vbExclamation, "警告"
Exit Sub
Else
txtCardName.Text = mrca.Fields(0)
txtType.Text = mrca.Fields(1)
txtSID.Text = mrca.Fields(2)
txtName.Text = mrca.Fields(3)
txtDepartment.Text = mrca.Fields(4)
ComboSex.Text = mrca.Fields(5)
txtUpDate.Text = Trim(mrca.Fields(6))
txtUpTime.Text = mrca.Fields(7)
txtComputername.Text = mrca.Fields(8)
txtDownDate.Text = Date '下机日期,也就是现在的当前日期
txtDownTime.Text = Time '下机时间
consumtime = DateDiff("n", mrca.Fields(9), Now) '计算消费时间,这里比较的数据库中的日期和时间在一起
txtConTime.Text = Val(consumtime)
End If
Dim mrcb As ADODB.Recordset '用来存储student_info 的sql语句
Dim txtSQLb As String '用来接收返回的结果
Dim usertype As String '用来记录用户的类型
Dim Cash As String '用来记录余额
txtSQLb = "exec proc_sutdentinfo_select @cardno = '" & txtCardName.Text & "'"
Set mrcb = ExecuteSQL(txtSQLb, MsgText)
usertype = Trim(mrcb.Fields(10)) '将用户类型记录
Cash = Trim(mrcb.Fields(9)) '记录消费前账户余额
Dim mrcc As ADODB.Recordset '用来存储BasicData_Info 的sql语句
Dim txtSQLc As String '用来接收BasicData_Info返回的结果
Dim Rate As String '记录固定用户每小时费用
Dim tmpRate As String '记录临时用户每小时费用
Dim listTime As String '记录最小时间
txtSQLc = "exec proc_BasicData_select"
Set mrcc = ExecuteSQL(txtSQLc, MsgText) '将设定的基本数据赋值给变量
Rate = mrcc.Fields(0)
tmpRate = mrcc.Fields(1)
listTime = mrcc.Fields(3)
mrcc.Close
If txtConTime.Text > listTime Then '如果上机时间大于设置的最小时间
If usertype = "固定用户" Then
txtConMoney.Text = Int((Rate * txtConTime.Text) / 60 + 1)
Else
txtConMoney.Text = Int((tmpRate * txtConTime.Text) / 60 + 1)
End If
txtBalance.Text = Cash - txtConMoney.Text '计算下机后的余额
Else
txtConMoney.Text = 0
txtBalance.Text = Cash
End If
mrcb.Fields(9) = Trim(Cash) '将余额更新到学生表
mrcb.Update
mrcb.Close
Dim mrcd As ADODB.Recordset '用来更新line_info表存储记录
Dim txtSQLd As String '用来接收返回的结果
Dim onlineMsgText As String '接受信息
txtSQLd = "delete OnLine_Info where cardno = '" & txtCardName.Text & "'" '上机成功后将上机表的信息删除
Set mrcd = ExecuteSQL(txtSQLd, onlineMsgText)
Dim mrc2 As ADODB.Recordset '用来更新line_info表存储记录
Dim txtSQL2 As String '用来接收返回的结果
txtSQL2 = "exec proc_deplane @cardno = '" & txtCardName.Text & "'" '使用查询将所需要更新字段进行更新
Set mrc2 = ExecuteSQL(txtSQL2, MsgText)
mrc2.Fields(0) = Date
mrc2.Fields(1) = Time
mrc2.Fields(2) = Trim(txtConTime.Text)
mrc2.Fields(3) = Trim(txtConMoney.Text)
mrc2.Fields(4) = "正常下机"
mrc2.Update
mrc2.Close
MsgBox "下机成功", vbOKCancel + vbExclamation, "提示"
Label9.Caption = Label9.Caption - 1
下机要特别注意的点有:
1:更新上机记录的时候,SQL语句怎么写很重要,不能简单的以学号作为条件,因为一个账号会涉及到多次上机下机记录。2:上机时间和价格的运算。不要搞出来小数,从实际出发,看如何计算。3:使用存储过程的时候注意对应关系,不要搞乱。
标签:Dim,mrc2,String,之下,Text,第一次,mrca,机房,Fields From: https://blog.51cto.com/u_15854472/5915751