第一次机房之下机

下机相对与机房而言,涉及的表更多,涉及到的数据更新也更加的复杂,需要多次访问数据库进行增删改查,所以流程图在这里显得就尤为重要,下机我不是在一天完成的,有了流程图我才很好的接上了之前写代码的思路。

我个人认为下机的难点就是数据多,对应关系很难理清,容易搞混,我自己的解决办法就是,先把所有的信息都显示到页面里,无论是上机的时长还是金额,先统统计算出来,显示到界面上之后再考虑和数据库之间的交互,这样的优点是不容易搞错数据。

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:使用存储过程的时候注意对应关系,不要搞乱。

猜你喜欢

转载自blog.csdn.net/hlzdbk/article/details/113882959
今日推荐