机房收费系统(九)——下机

概述

下机窗体的重要程度及难度不低于机房收费系统的任何一个窗体,可是花了我不少的时间。特别是在计算的思路上,我是费劲了脑汁。下面我将从头进行梳理。

流程图

这里写图片描述

计算

*计算消费余额:分为四种情况(注意分固定用户和临时用户)
查询基本数据表,获得设定的基本数据:

1.判断实际上机时间是否小于准备时间,若小于则消费时间为0

2.判断实际上机时间是否小于最低消费时间,若小于则消费时间为0

3.实际上机时间大于最低消费时间则按单位时间算,分为固定用户和临时用户

4.当实际上机时间大于单位时间,就按有几个单位时间算,分为固定用户和临时用户

*计算余额:账户余额=原账户余额-消费金额 (原账户余额是学生表中的cash)

注意

消费余额问题:(分三种情况)

1.当天上机当天下机:(简单,直接依据上面的计算方法即可)
CostTime = DateDiff(“n”, StartTime, EndTime)

2.上机间隔一天:(比如说:今天的21:00上机,明天的1:00下机)
CostTime =TimeValue(24 60 - StartTime + EndTime)*

3.上机日期超过一天:
CostTime =TimeValue(24 60 - StartTime + EndTime) + (CostDate - 1) * 24 * 60*

如果不按照上面的思路计算就会出现问题:比如说上了一天多的机,结果上机时间为零,消费金额为零。(如图)
这里写图片描述
实时报错91:

1.对象变量或With块变量没有设置

创建对象变量有两个步骤。必须先声明对象变量。然后必须用 Set 语句将一个正确的引用赋值给对象变量。同样地,With…End With 块必须先用 With 语句进入点来执行初始化。

2.用户定义类型未定义

其实就是引用的问题,这里的引用正式我们计算机里“封装”思维的体现。当然包含ODBC的链接问题都是导致问题发生的主要原因。

重要代码

Private Sub cmdOff_Click()

    Dim mrc As ADODB.Recordset                                   'online 表
    Dim mrc1 As ADODB.Recordset                                 'student表
    Dim mrc2 As ADODB.Recordset                                 'BasicData 表
    Dim mrc3 As ADODB.Recordset
    Dim mrc4 As ADODB.Recordset

    Dim time1, time2, time3

    Dim txtdate As String
    Dim txttime As String

    Dim intconsumetime As String                                  '消费时间
    Dim Msgtext As String

    If txtNo.Text = "" Then                                    '判断卡号是否为空
      MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告"

    Else

      txtSQL = "select * from OnLine_Info where cardno= '" & Trim(txtNo.Text) & "'"
      Set mrc = ExecuteSQL(txtSQL, Msgtext)

        If mrc.EOF = True Then                                  '判断此卡是否正在上机
          MsgBox "该卡号未上机,请重新确认", vbOKOnly + vbExclamation, "警告"
            txtNo.Text = ""
            txtNo.SetFocus
            txtStudentNo.Text = ""
            txtDepartment.Text = ""
            txtType.Text = ""
            txtName.Text = ""
            txtSex.Text = ""
            txtondataText = ""
            txtDownData.Text = ""
            txtCash.Text = "9"
            txtOnTime.Text = ""
            txtOffTime.Text = ""
            txtConsumeTime.Text = ""
            txtConsume.Text = ""
          Exit Sub

        Else

            txtStudentNo.Text = mrc.Fields(2)                                         '更新窗体上的信息
            txtDepartment.Text = mrc.Fields(4)
            txtType.Text = mrc.Fields(1)
            txtName.Text = mrc.Fields(3)
            txtSex.Text = mrc.Fields(5)
            txtOnData.Text = mrc.Fields(6)
            txtDownData.Text = Date
            txtOnTime.Text = mrc.Fields(7)
            txtOffTime.Text = Time

            time1 = Trim(DateDiff("n", txtOnTime.Text, Time))                  '把时间差转换为分钟
            time2 = Trim(DateDiff("n", txtOnData.Text, Date))                   '把日期差转换为分钟

                  txtSQL = "select * from BasicData_Info"                    '从数据表中获取基本数据
                  Set mrc1 = ExecuteSQL(txtSQL, Msgtext)

                    If Val(time1) + Val(time2) & mrc1.Fields(3) Then           '上机时间小于准备时间,则消费时间为0
                       time3 = "0"

                    Else

                       time3 = Val(time1) + Val(time2) - Val(mrc1.Fields(3))   '否则则是上机时间减去准备时间
                    End If

                    txtConsumeTime.Text = Val(time3)                                   '更新消费时间

                  If mrc.Fields(1) = "固定用户" Then
                      txtConsume.Text = Int(mrc1.Fields(0) / 60 * Val(txtConsumeTime.Text))     '计算固定用户金额

                  Else                                                              '计算临时用户金额

                      txtConsume.Text = Int(mrc1.Fields(1) / 60 * Val(txtConsumeTime.Text))
                      mrc1.Close
                  End If

                txtSQL = "select * from student_Info where cardno= '" & Trim(txtNo.Text) & "'and status='" & "使用" & "'"       '得出余额
                Set mrc3 = ExecuteSQL(txtSQL, Msgtext)

                txtCash.Text = Val(Trim(mrc3.Fields(7)) - Val(txtConsume.Text))
                mrc3.Fields(7) = Val(txtCash.Text)
                mrc3.Update
                mrc3.Close

                txtSQL = "select * from Line_Info where cardno= '" & Trim(txtNo.Text) & "'and ondate='" & Trim(txtOnTime.Text) & "'and ontime='" & Trim(txtOnTime.Text) & "'"                        '增加上机记录
                Set mrc6 = ExecuteSQL(txtSQL, Msgtext)

                If Not mrc6.EOF Then
                    mrc6.Fields(8) = Trim(txtDownData.Text)
                    mrc6.Fields(9) = Trim(txtDownData.Text)
                    mrc6.Fields(10) = Trim(txtConsumeTime.Text)
                    mrc6.Fields(11) = Val(txtConsume.Text)
                    mrc6.Fields(12) = Trim(txtCash.Text)
                    mrc6.Fields(13) = "正常下机"
                    mrc6.Update
                    mrc6.Close
                End If

                    mrc.Delete
                    mrc.Update
                    mrc.Close

                    txtSQL = "select * from OnLine_Info"
                    Set mrc4 = ExecuteSQL(txtSQL, Msgtext)

                    Label22.Caption = mrc4.RecordCount
                    mrc4.Close
            End If
    End If
End Sub

总结

下机问题其实还有很多的问题,特别是对于我们这些小白来说。其主要原因还是我们没有搞懂它的运行原理及思路。路漫漫其修远兮,吾将上下而求索。饮余马於咸池兮,总余辔乎扶桑。折若木以拂日兮,聊逍遥以相羊。前望舒使先驱兮,后飞廉使奔属。鸾皇为余先戒兮,雷师告余以未具。吾令凤鸟飞腾兮,继之以日夜。飘风屯其相离兮,帅云霓而来御。纷总总其离合兮,忽纬繣其难迁。哈哈哈…..

猜你喜欢

转载自blog.csdn.net/whc888666/article/details/80976771