机房收费系统的上下机

        机房收费系统的上下机,涉及到对多张表的操作,但是还是从数据库中取数据,读出来,处理,然后放回去。其中,如何上下机的逻辑感觉很重要

     一,上机

机房收费系统的上下机


      在上机时,首先(非空判断什么的不再提)用户是否是一个合法用户,这里的合法性,要求用户不仅要存在与这张表,而且用户不能是已经退卡的用户。

        当合法性验证完后,还要看看用户是否是已经在上机了,如果用户没有上机,还要验证用户卡里的钱是否大于运行上机的最小金额,当用户通过了这几层的检验后,才能正式向用户上机表里面写入用户上机的日期,时间等基本数据。

'上机之前有些文本框要清空
    txtXiaJiDate.Text = ""
    txtXiaJiTime.Text = ""
    txtSpendTime.Text = ""
    txtCostRMB.Text = ""

    Dim CardNum As Integer   '定义卡号,用来保存上机学生的卡号
    Dim Balance As Double   '定义查询到的余额
    Dim PcName As String     '定义上机的电脑
    Dim StartDateTime As String       '定义开始的日期和时间
    Dim StartDate As String    '定义开始时的日期
    Dim StartTime As String   '定义开始的时间

    '非空判断,只判断卡号是否为空,因为查询主要靠查询主键
    If Trim(txtCardNum.Text) = "" Then
        MsgBox "卡号不能为空!", vbOKOnly + vbExclamation, "警告"
        Exit Sub
    End If
    

'上机前,先检查这个卡号有没有注册过,(还要查询此卡是否已经被退卡,不再使用)再检测这个卡内的余额
    SQL = "select * from stubaseinfo where 卡号='" & Trim(txtCardNum.Text) & "' and " & "状态='使用'"    '先从学生基本信息中读取信息判断是否有这个学生
    Set Rst = ExecuteSQL(SQL, strMsg)      '查询
    
    '判断是否有这个卡
    If (Rst.BOF And Rst.EOF) Or Rst.EOF Then   '如果没有这个卡
        MsgBox "此卡尚未注册!", vbOKOnly + vbExclamation, "警告"
        
        '清空文本框
        txtCardNum.Text = ""
        Exit Sub
        
    Else  '如果查询到此卡,则允许上机,上机分为三个阶段(准备时间+至少上机时间+单位递增时间)
        
         Balance = Trim(Rst.Fields(9))   '卡内余额
         
         '文本框中基本信息
         txtStuId.Text = Trim(Rst!学号)
         txtName.Text = Trim(Rst!姓名)
         txtDepartment.Text = Trim(Rst!系别)
         txtSex.Text = Trim(Rst!性别)
         txtBalance.Text = Format(Trim(Rst!金额), "Fixed")
         txtType.Text = "固定用户"           '用户类型,都是固定用户
         
        '记下开始的日期时间
        CardNum = Trim(txtCardNum.Text) '记下此时的卡号
        StartDateTime = Format(GetSqlTime, "yyyy-mm-dd hh:mm:ss") '开始日期和时间
        StartDate = Format(GetSqlTime, "yyyy-mm-dd")
        StartTime = Format(GetSqlTime, "hh:mm:ss")
        
        '获取电脑的电脑名称
        PcName = VBA.Environ("computername")  '获取电脑名称
        
        '查看用户是否在线
        SQL = "select * from stuonline where 卡号='" & CardNum & "'"
        Set Rst = ExecuteSQL(SQL, strMsg)
         
        If (Rst.BOF And Rst.EOF) Or Rst.EOF Then   '如果用户没有上机
        
        
                '判断卡内的余额是否可以支付(至少上机时间)所需要的费用
                If Balance >= LestRMB Then  '如果卡内的余额可以支付至少上机时间所需要的费用,则允许上机,并将上机记录写入,同时扣除卡内最少上机时间所对应的钱
                    '先写入学生上机表
                    SQL = "insert into stuonline (卡号,日期,时间,机房号) values('" & CardNum & "','" & StartDate & "','" & StartTime & "','" & PcName & "')"
                    Call ExecuteSQL(SQL, strMsg)   '执行SQL语句
 
                    txtShangJiDate.Text = StartDate  '显示上机日期
                    txtShangJiTime.Text = StartTime '上机时间
                    
  
                    '然后写入上机信息表,这里写入的缺少下机时间和日期,至于下机时间和日期,在下机时候再写入
                    SQL = "insert into stushangji(卡号,上机日期,上机时间,机房号,上机日期时间) values('" & CardNum & "','" & StartDate & "','" & StartTime & "','" & PcName & "','" & StartDateTime & "')"
                    Call ExecuteSQL(SQL, strMsg)
                    
                    '显示在文本框里面
                    lblFlag.Caption = "欢迎光临!亲~"   '中间的标识
                    
    
                Else    '如果卡内余额不足以支付(至少上机时间)所需要的钱,那么,就拒绝上机
                    MsgBox "此卡余额不足,请保证卡内至少有" & LestRMB & "元,才能正常上机", vbOKOnly + vbExclamation, "警告"
                    Exit Sub
                End If
        Else  '如果该卡号正在上机
            MsgBox "该卡号正在上机!", vbOKOnly + vbExclamation, "警告"
        End If
 End If

二,下机

机房收费系统的上下机

        在学生下机时,先查看学生是否在线,如果在线,在学生在线的表里,删除此学生,然后再上机记录表里面写入他此次下机的信息。在写下机信息时,可能计算上机时花的钱有点麻烦,但还好,初中的数学可以帮到我们的忙。下机信息表写完后,还要及时更新学生基本信息表里学生的余额,然后,这才算是下机成功。


If Testtxt(Trim(txtCardNum.Text)) = False Then '如果卡号为空
        MsgBox "卡号不能为空!请输入卡号!", vbOKOnly + vbExclamation, "警告"
        Exit Sub
 Else    '如果不为空
        '给下机时间和日期赋值
        EndDate = Format(GetSqlTime, "yyyy-mm-dd")
        EndTime = Format(GetSqlTime, "hh:mm:ss")
        EndDateTime = Format(GetSqlTime, "yyyy-mm-dd hh:mm:ss")
        
        '根据卡号选择下机的学生
        CardNum = Trim(txtCardNum.Text) '记下此时的卡号
        
        '查询学生上机表中的学生
        SQL = "select * from stuonline where 卡号='" & CardNum & "'"   '按卡号查询学生上机表
        Set Rst = ExecuteSQL(SQL, strMsg)
        
            If (Rst.EOF And Rst.BOF) Or Rst.EOF Then '如果没有查询到
                MsgBox "该卡号还没有上机!", vbOKOnly + vbInformation, "提示" '提示该卡未上机
                txtCardNum.Text = ""
                Exit Sub
                
            Else    '如果该卡上机了,在学生正在上机表中删除该学生,在学生上机记录中写入该学生的下机日期和时间
                SQL = "delete from stuonline where 卡号='" & CardNum & "'"  '从学生在线的表里面删除该学生
                Call ExecuteSQL(SQL, strMsg)
                
                '然后找到学生上机信息表中,上机时填入的那一行,因为可能有很多行,所以,我们用序列号和卡号来寻找
                SQL = "select MAX(序列号) from stushangji where 卡号='" & CardNum & "'"
                Set Rst = ExecuteSQL(SQL, strMsg)
                Index = Rst.Fields(0)
                
            
                '再向学生上机信息表里面,填入下机日期,下机时间
                SQL = "update stushangji set 下机日期='" & EndDate & "',下机时间='" & EndTime & "',下机日期时间='" & EndDateTime & "' where 卡号='" & CardNum & "' and 序列号='" & Index & "'"
                Set Rst = ExecuteSQL(SQL, strMsg) '执行插入
                
               
                '计算上机时间,然后根据上机时间,计算出花费的金额,并在学生基本信息表里面,扣除相应的金额
                SQL = "select * from stushangji where 卡号='" & CardNum & "'and 序列号='" & Index & "'"                         '根据卡号和序列号提取上机日期时间
                Set Rst = ExecuteSQL(SQL, strMsg) '查询
                
                StartDateTime = Rst.Fields(6) '上机日期时间
                JianGeTime = DateDiff("n", StartDateTime, EndDateTime) '计算时间间隔
                
                '将上机时间显示在文本框里面
                txtXiaJiDate.Text = EndDate   '下机日期
                txtXiaJiTime.Text = EndTime   '下机时间
                
                
                
                '判断用户下机时,处于哪个时间段里面
                If JianGeTime >= ReadyTime + MinTime Then '如果时间大于(准备时间+至少上机时间)
                    CostRMB = (StaticUserRMB / 30) * (JianGeTime - ReadyTime) + LestRMB '计算花费了多少钱
                ElseIf JianGeTime > ReadyTime Then '如果间隔时间在准备时间和至少上机时间之间
                    CostRMB = LestRMB '只减去至少上机时间花费的钱
                Else   '还没过准备时间就下机的情况
                    CostRMB = 0   '不扣钱
                End If                
                '将学生花费的钱填入学生上机表
                SQL = "update stushangji set 消费金额='" & CostRMB & "' where 序列号='" & Index & "'"
                      Call ExecuteSQL(SQL, strMsg)
                
                
                txtCostRMB.Text = Format(CostRMB, "Fixed") '显示花的钱
                
                '显示上机时间
                txtSpendTime.Text = JianGeTime
                
            
                '先从表中取出余额
                SQL = "select * from stubaseinfo where 卡号='" & CardNum & "'"
                Set Rst = ExecuteSQL(SQL, strMsg)
                
                Balance = Rst.Fields(9) '取出余额
                
                '然后将减去花费,设置花费大于0时才更新,这样可以去掉基本数据设置混乱时出现的花费为负值的情况
                If CostRMB >= 0 Then
                    Balance = Balance - CostRMB
                    
                    '然后更余额
                    SQL = "update stubaseinfo set 金额=" & Balance & " where 卡号='" & CardNum & "'"
                    Call ExecuteSQL(SQL, strMsg)
                    
                    txtBalance = Format(Balance, "Fixed") '显示余额
                    
                End If
                
                lblFlag.Caption = "欢迎再来上机,亲~"
                
         End If
  End If
    

三,时间问题

       在验收的时候,师傅问我用的什么时间,我当时很奇怪,说我用的是Now,然后,,,,,,,咳咳。。。。。。。。。。

       后来,统一改成了数据库的时间,这两者虽然有时候看起来一样,但是如果电脑时间设置混乱,当在两台不同电脑上先后上机下机,就有可能出现“穿越时空的上下机”这种情况,比如,在某天的7:20上机,在6:50下机这种情况。所以,为了避免混乱,要统一为所以使用这个软件的人统一时间。

    后来,在改的时候,在模块里面加了一个GetSqlTime()函数:

Public Function GetSqlTime() As Date  '获取数据库的时间
    Dim RstTime As ADODB.Recordset
    Dim MsgTime As String
    Dim SqlTime As String
    
    SqlTime = "select getdate()"
    Set RstTime = ExecuteSQL(SqlTime, MsgTime)
    
    GetSqlTime = RstTime.Fields(0)
    
End Function
   然后,将我以前用的所有的now都替换成了 GetSqlTime。


四,上机人数问题

       关于上机人数,我最初用的是变量,但是如果在多台电脑上运行的话,上机人数肯定是有问题的。但是,如果一直从学生上机表里面读,还是可以的。只需要在在一个timmer里面,写一个查询count的sql语句,一直查询上机人数就可以了。

    

上一篇:小小Boolean


下一篇:Kotlin——函数