【数据库学习】机房收费系统(一)学生上下机

 
  机房收费系统快接近尾声,才把为知笔记里的学习总结拿出来是不是有些迟钝。所以养成时时总结的好习惯很重要,下面就分享一下我在机房收费系统中的小收获。 
 

有关学生上下机这一块,我一开始没有过多的思考,上来就敲,结果就报错。

遇挫之后要想办法解决啊,我的解决方法就是站在巨人的肩膀上,去看看大家的总结博客。

于是乎,看了大神的博客。上下机的思路流程渐渐清晰,对机房上下机逻辑明了的同时,自己也收获了一种新的画图方式,流程图。

   首先:要想上机,你要对卡号进行一些条件的筛选。

是否为空

是否为数字

是否为正在上机的用户

是否是使用用户

是否还有余额上机


然后:通过上面的细致筛选,进入下一环节。

更新表。上机记录Line表,上机表OnLine表。

  最后:上机成功

 



   

<pre name="code" class="html">Private Sub cmdUP_Click() '学生上机实现
    Dim mrc As ADODB.Recordset
    Dim mrcc As ADODB.Recordset
    Dim mrcd As ADODB.Recordset
    Dim mrce As ADODB.Recordset
    Dim txtSQl As String
    Dim MsgText As String
    
    Timer2.Enabled = True
    
    '判断该卡号是否正在上机
    txtSQl = "select * from OnLine_Info where cardno ='" & Trim(txtCID.Text) & "'"
    Set mrc = ExecuteSQL(txtSQl, MsgText)
    If Not mrc.EOF Then
        MsgBox "此卡正在上机", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
        txtCID.Text = ""
        mrc.Close
    End If
    
'    txtSQl = "select * from student_Info where cardno ='" & Trim(txtCID.Text) & "'" '输入卡号,在表中找这个卡号相应的一行信息
'    Set mrcc = ExecuteSQL(txtSQl, MsgText)
    
    '卡号不能为空
    If Not Testtxt(txtCID.Text) Then '卡号不为空
        MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
    End If
    
    '卡号是否为数字
    If Not IsNumeric(txtCID.Text) Then
        MsgBox "请输入数字!", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
        txtCID.Text = ""
    End If
    
    '判断卡号是否是存在的用户
    txtSQl = "select * from student_Info where cardno ='" & Trim(txtCID.Text) & "'" '输入卡号,在表中找这个卡号相应的一行信息
    Set mrcc = ExecuteSQL(txtSQl, MsgText)

    If mrcc.EOF Then
        MsgBox "该用户不存在,请重新输入!", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
        txtCID.Text = ""
        Exit Sub
        mrcc.Close '忘记把记录集关闭
    End If
    '判断卡上是否有余额
    If mrcc.Fields(7) <= 0 Then '上方错误:错误3021
        MsgBox "该卡余额不足,请充值!", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
        txtCID.Text = ""
        mrcc.Close
        Exit Sub
    Else '卡里有余额,可以把student表中值赋给框框们
        txtSID.Text = mrcc.Fields(1)
        txtStudentName.Text = mrcc.Fields(2)
        txtSex.Text = mrcc.Fields(3)
        txtDepartment.Text = mrcc.Fields(4)
        txtType.Text = mrcc.Fields(14)
'        txtOnDate.Text = mrcc.Fields(12)
'        txtOnTime.Text = mrcc.Fields(13)
        txtOnDate.Text = Format(Date, "yyyy-mm-dd") '日期和时间的格式
        txtOnTime.Text = Format(Time, "hh:mm")
        txtBalance.Text = mrcc.Fields(7)
        txtOffTime.Text = ""
        txtOffDate.Text = ""
        txtCost.Text = ""
        txtCostTime.Text = ""
        mrcc.Close
    End If
    
    
    '更新上机记录表的数据
    txtSQl = "select * from Line_Info" '多了一个点
    Set mrcd = ExecuteSQL(txtSQl, MsgText)
    
    mrcd.AddNew '出错,未定义
    mrcd.Fields(1) = Trim(txtCID.Text)
    mrcd.Fields(2) = Trim(txtSID.Text)
    mrcd.Fields(3) = Trim(txtStudentName.Text)
    mrcd.Fields(4) = Trim(txtSex.Text)
    mrcd.Fields(5) = Trim(txtDepartment.Text)
    mrcd.Fields(6) = txtOnDate.Text
    mrcd.Fields(7) = txtOnTime.Text
    mrcd.Fields(8) = Null
    mrcd.Fields(9) = Null
    mrcd.Fields(10) = Null
    mrcd.Fields(11) = ("0.0")
    mrcd.Fields(12) = Trim(txtBalance.Text)
    mrcd.Fields(13) = Trim("正常上机")
    mrcd.Fields(14) = Trim(VBA.Environ("computername")) '获取计算机名
    mrcd.Update
    
    '更新正在上机表的数据
    
    txtSQl = "select * from OnLine_Info"
    Set mrce = ExecuteSQL(txtSQl, MsgText) 'execute拼错了
    
    mrce.AddNew
    mrce.Fields(0) = Trim(txtCID.Text)
    mrce.Fields(1) = Trim(txtType.Text)
    mrce.Fields(2) = Trim(txtSID.Text)
    mrce.Fields(3) = Trim(txtStudentName.Text)
    mrce.Fields(4) = Trim(txtDepartment.Text)
    mrce.Fields(5) = Trim(txtSex.Text)
    mrce.Fields(6) = Trim(txtOnDate.Text)
    mrce.Fields(7) = Trim(txtOnTime.Text)
    mrce.Fields(8) = Trim(VBA.Environ("computername"))
    mrce.Fields(9) = Date
    mrce.Update
    mrce.Close
    mrcd.Close
    MsgBox "恭喜你上机成功!", vbOKOnly + vbExclamation, "警告"
    onliner = onliner + 1 '上机人数的统计
    lblOnlineNumber.Caption = onliner
    lblTime.Caption = Time
    
End Sub


 
 


  下面我们再来看看学生下机的实现。

   首先:想要下机。对卡号进行条件筛选。


是否为空

是否为数字

是否为可用卡

是否上机


可以更新上机记录表


然后:要计算上机时间。 S:上机时间 Z:准备时间  X:最少时间
        分三种情况,S<=Z       Z<S<=X   S >X


  计算上机费用,
更新上机记录表中cash数据,这里的cash是消费的金额
更新student表中的cash数据,这里的cash是余额


最后:下机成功 




Private Sub cmdDown_Click() '学生下机实现
    Dim mrc As ADODB.Recordset
    Dim mrcc As ADODB.Recordset
    Dim mrcd As ADODB.Recordset
    Dim mrce As ADODB.Recordset
    Dim txtSQl As String
    Dim MsgText As String
    Dim UseTime, UnitNumber, a, b, c
    
    '判断卡号是否为空
    If Not Testtxt(txtCID.Text) Then
        MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告"
        txtCID.SetFocus
    End If
    
    '判断卡号是否为数字
    If Not IsNumeric(txtCID.Text) Then
        MsgBox "卡号需为数字!", 0 + 48, "提示"
        txtCID.SetFocus
        txtCID.Text = ""
    End If
    
    '判断卡号是否为存在的用户
    txtSQl = "select * from student_Info"
    Set mrc = ExecuteSQL(txtSQl, MsgText)
    
    If mrc.EOF Then '如果最后一条记录里也没有这个卡号
        MsgBox "该用户不存在,请重新输入!", 0 + 48, "提示"
        txtCID.SetFocus
        txtCID.Text = ""
        Exit Sub
    End If
    
    '判断卡号是否正在上机
    txtSQl = "select * from OnLine_Info where cardno='" & Trim(txtCID.Text) & "'"
    Set mrcc = ExecuteSQL(txtSQl, MsgText)
    '如果没有上机
    If mrcc.EOF Then
        MsgBox "该用户没有上机!", 0 + 48, "提示"
        txtCID.SetFocus
        txtCID.Text = ""
'        txtSID.Text = "'"多了一点
        txtSID.Text = ""
        txtType.Text = ""
'        txtStudentName.Text = "'"多了一点
        txtStudentName.Text = ""
        txtSex.Text = ""
        txtDepartment.Text = ""
        txtOnDate.Text = ""
        txtOnTime.Text = ""
        txtOffTime.Text = ""
        txtOffDate.Text = ""
        txtCostTime.Text = ""
        txtCost.Text = ""
        Exit Sub
   Else '如果正在上机
        txtSID.Text = mrcc.Fields(2)
        txtType.Text = mrcc.Fields(1)
        txtStudentName.Text = mrcc.Fields(3)
        txtSex.Text = mrcc.Fields(5)
        txtDepartment.Text = mrcc.Fields(4)
'        txtOnTime.Text = mrcc.Fields(6)
        txtOnDate.Text = mrcc.Fields(6)
        txtOnTime.Text = mrcc.Fields(7)
        c = mrcc.Fields(7) 
        txtOnTime.Text = c
        mrcc.Delete
  End If
  
    '下机并更新上机记录表数据
    
    '正常上机前有 空格txtSQl = "select * from Line_Info where status=' 正常上机' and cardno = '" & Trim(txtCID.Text) & "'" '卡号状态是正常上机的,且等于text框的卡号可以下机。
    txtSQl = "select * from Line_Info where status='正常上机' and cardno = '" & Trim(txtCID.Text) & "'" '卡号状态是正常上机的,且等于text框的卡号可以下机。
    Set mrce = ExecuteSQL(txtSQl, MsgText)
    
    txtOffDate.Text = Format(Date, "yyyy-mm-dd")
    txtOffTime.Text = Format(Time, "hh:mm")
    b = Abs(DateDiff("n", txtOffTime, c)) '计算上机时间的函数
        txtCostTime.Text = b
'    mrce.Update
'    mrce.Fields(1) = Trim(txtCID.Text)
'    mrce.Fields(2) = Trim(txt)
    mrce.Fields(8) = Trim(txtOffDate.Text)  '出现错误。3021更新上机记录表中的下机日期和时间。
    mrce.Fields(9) = Trim(txtOffTime.Text)
    mrce.Fields(10) = Trim(txtCostTime.Text)
    mrce.Fields(13) = Trim("正常下机")
    
    '计算上机时间
    
    '没有写Info  txtSQl = "select * from BasicData" '从基础数据设定表中提取数据
    txtSQl = "select * from BasicData_Info"
    Set mrcd = ExecuteSQL(txtSQl, MsgText)
    '第一种情况,上机时间小于准备时间
    '出错,变量未定义 If Val(txtCostTime) < Val(mrcd.Fields(4)) Then 缺少.text
    If Val(txtCostTime.Text) < Val(mrcd.Fields(4)) Then
        txtCost.Text = 0 '花费为0
        onliner = onliner - 1 '在线人数减1
        lblOnlineNumber.Caption = onliner
        mrce.Fields(11) = Trim(txtCost.Text) '上机记录表中消费 consume的更新
        mrce.Fields(12) = Trim(txtBalance.Text) '上机记录表中余额 cash 的更新
        mrce.Update '上机记录表更新
        Exit Sub
    End If
    
    '第二种情况,准备时间<上机时间<最小上机时间
    If Val(mrcd.Fields(4)) < Val(txtCostTime.Text) <= Val(mrcd.Fields(3)) Then
        txtCost.Text = 1 '花费记录为1
'        txtBalance.Text = mrce.Fields(12) - 1 '余额balance减1
        txtBalance.Text = Val(mrc.Fields(7) - 1) '学生表中的cash数据更新减1
        mrc.Fields(7) = Trim(txtBalance.Text) '把余额框的数据再赋值给学生表中的cash
        mrc.Update '学生表更新数据
        
        mrce.Fields(11) = Trim(txtCost.Text)
        mrce.Fields(12) = Trim(txtBalance.Text)
        mrce.Update '更新上机记录表中数据
        onliner = onliner - 1 '在线人数减1
        lblOnlineNumber.Caption = onliner
        Exit Sub
    End If
    
    '第三种情况,上机时间大于最小上机时间
    If Val(txtCostTime.Text) > Val(mrcd.Fields(3)) Then
        UseTime = Val(txtCostTime.Text) - Val(mrcd.Fields(4)) '实际上机时间不包括准备时间
        UnitNumber = UseTime Mod Val(mrcd.Fields(2)) '单位用时个数等于所用时间整除基本表的单位时间
        '如果上机单位用时个数不足1个
        If UnitNumber = 0 Then
            UnitNumber = Int(UseTime / Val(mrc.Fields(2))) '实际上机用时时间除单位时间,不进行四舍五入
        Else '如果上机单位用时个数大于等于1个
            UnitNumber = Int(UseTime / Val(mrc.Fields(2))) + 1 '当实际上机时间大于单位时间,如 90/60 =1.5 int(1.5) =1,所以要加1
        End If
    End If
    
    '从student表中提取数据,判断用户类型
'    if mrce.Fields
    If mrc.Fields(14) = "固定用户" Then
        
        a = mrcd.Fields(0) '固定用户单位费用,从基础数据设定表里提取数据
    Else
        a = mrcd.Fields(1) '临时用户单位费用
    End If
    
    
    '计算整体的花费
    
    '计算消费金额
    txtCost.Text = Format(UnitNumber * a, "0.0") '单位时间个数*单价
    '计算余额
    txtBalance.Text = Val(mrc.Fields(14)) - Val(txtCost.Text) '学生表中cash数据减消费金额
    mrc.Fields(14) = Trim(txtBalance.Text) '把余额值赋给学生表的cash
    mrc.Update '学生表数据更新
    
    '更新上机记录表数据
    mrce.Fields(11) = Trim(txtCost.Text)
    mrce.Fields(12) = Trim(txtBalance.Text)
    mrce.Update '更新上机记录表中数据
    onliner = onliner - 1 '在线人数减1
    lblOnlineNumber.Caption = onliner
       
End Sub

(onlier在通用里定义为Integer,b和c也在通用里定义过了。其实经过米老师的编码规范课,这样的定义是不明确的,但是在机房收费系统里,还不知道怎样去定义的更好。)

小结:学生上下机理清思路和流程很重要,逻辑放在首位去思考。代码实现如果困难的话,就先把注释打出来,按照注释去实现代码。

机房收费系统也在后续更新中,有错误之处,请大家指出,多多指教。

你可能感兴趣的:(数据库)