第一次机房收费系统——上下机

前言

对于上下机,刚开始敲的时候是恐惧的,需要考虑的表太多,尤其是下机,还涉及到了金钱的计算。不得不说我已经踩过无数同期小伙伴的肩膀了,通过对大家优秀博客的学习,自己又理了理逻辑思路,感觉还是可以的吧!
对于基本上下机,只要思路清晰就可以敲出来了,但对与选择上下机,还真是要喷一口老血啊!!!这里面涉及到的不仅是逻辑性问题,还有技术方面的,咱这里强烈推荐:李光同学的选择上下机博客 ,看了光哥的博客才知道,原来我之前学得VB是那么不踏实,很多循环语句都不怎么会用,看来技术要想学得精,还是要多实践呀!

一、基本上下机思路

上机
这里写图片描述

下机
这里写图片描述

二、所有学生下线

txtsql = "select * from online_info "
Set mrc1 = ExecuteSQL(txtsql, msgtext)
    mrc1.MoveFirst

    If mrc1.EOF = True Then
        MsgBox "没有学生上机!", 0 + 48, "提示"
    End If

        While mrc1.EOF = False

'计算上机时间
        txtsql = "select * from student_info where cardno = '" & mrc1.Fields(0) & "'"
        Set mrc2 = ExecuteSQL(txtsql, msgtext)

        txtsql = "select * from line_info where cardno = '" & mrc1.Fields(0) & "' and  status = '未结账'"
        Set mrc3 = ExecuteSQL(txtsql, msgtext)

        txtsql = "select * from basicdata_info"
        Set mrc4 = ExecuteSQL(txtsql, msgtext)

        'onlinetime = (Date - DateValue(mrc1!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrc1!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrc1!OnTime)))  '时间单位为分钟
        onlinetime = DateDiff("n", Trim(mrc1.Fields(9)), Now) '计算时间第二种方法
'计算消费金额
        If onlinetime < Trim(mrc4!leasttime) Then
            a = MsgBox("有的学生未达到正常收费时间,如果下机,将按照规定的至少上机时间收费", 4 + 48, "提示")
            If a = 6 Then
                onlinecash = Trim(mrc4!limitcash)
            Else
            Exit Sub
            End If
        Else

            If Trim(mrc1!cardType) = "固定用户" Then
                If Val(onlinetime) Mod Val(mrc4!unittime) = 0 Then
                    onlinecash = Int(onlinetime / mrc4!unittime) * Trim(mrc4!Rate)
                Else
                    If Val(onlinetime) Mod Val(mrc4!unittime) >= 30 Then
                        onlinecash = (Int(onlinetime / mrc4!unittime) + 1) * Trim(mrc4!Rate)
                    Else
                        onlinecash = (Int(onlinetime / mrc4!unittime) + 0.5) * Trim(mrc4!Rate)
                    End If

                End If

            Else
                If Val(onlinetime) Mod Val(mrc4!unittime) = 0 Then
                    onlinecash = Int(onlinetime / mrc4!unittime) * Trim(mrc4!Rate)
                Else
                    If Val(onlinetime) Mod Val(mrc4!unittime) >= 30 Then
                        onlinecash = (Int(onlinetime / mrc4!unittime) + 1) * Trim(mrc4!tmprate)
                    Else
                        onlinecash = (Int(onlinetime / mrc4!unittime) + 0.5) * Trim(mrc4!tmprate)
                    End If

                End If

            End If
        End If

        '添加line表
        mrc3.AddNew
        With mrc3
            .Fields(1) = Trim(mrc1!cardno)
            .Fields(2) = Trim(mrc1!studentno)
            .Fields(3) = Trim(mrc1!studentname)
            .Fields(4) = Trim(mrc1!department)
            .Fields(5) = Trim(mrc1!sex)
            .Fields(6) = Trim(mrc1!ondate)
            .Fields(7) = Trim(mrc1!OnTime)
            .Fields(14) = Trim(mrc1!computer)
            .Fields(13) = "未结账"
            .Fields(8) = Format(Date, "yyyy-mm-dd")
            .Fields(9) = Format(Time, "hh:mm:ss")
            .Fields(10) = onlinetime
            .Fields(11) = onlinecash
            .Fields(12) = Trim(mrc2!cash) - onlinecash
            mrc3.Update
        End With

  'student表更新余额
        mrc2!cash = mrc3!cash
        mrc2!ischeck = "未结账"
        mrc2.Update

        mrc1.MoveNext
        Wend
        mrc1.Close
   '删除online表
        txtsql = "delete from online_info"
        Set mrc5 = ExecuteSQL(txtsql, msgtext)

        MsgBox "所有学生下机成功!", 0 + 48, "提示"

        mrc2.Close
        mrc3.Close
        mrc4.Close
        MSHFlexGrid1.Clear

三、选中学生下机

大家应该已经看过光哥的博客了吧,他的基本思想大概就是:在msflexgrid1控件中多添加一列表格,用来记录是否被选中,设计一个循环,从头开始查询表格中是否有行被选中,将被选中的行号放到一个数组当中(数组作为一个容器),再设置一个循环,通过行号查询到该行的卡号,并将这个卡号的信息删除。

那么问题来了,因为代码在实现中,每删除一行是要更新一下msflexgrid1的,那么在第一个循环中记录的被选行的行号,在第二个循环中,查询到的信息是不对的,因为第一个循环是从第一行开始查找的,删除一行之后原来的第二行就变成了第一行,所以第二个循环如果通过行号来删除记录的话,是会删除错误的行的。

询问光哥才知道,他又设置了一个循环,但是以我的脑子估计是转不到哪里去的,于是只能想想懒人的办法了。在我的代码中也设置了一个循环,即设计一个循环,从第一行开始查找,查询控件中被选中的行,在循环中直接将这行的内容在数据库中删除(控件中暂时保留),更新数据库中的记录,在循环结束之后从新导入online表中的内容。 代码如下:

If MSHFlexGrid1.RowSel = 0 Then
        MsgBox "请显示全部选择数据或选择非标题行!", vbOKOnly + vbExclamation, "提示"
    Exit Sub
End If

'记录选中下机的卡号,在最后一行加√,将这些记录的所有卡号信息存到sc中
    i = 1
    For j = 1 To MSHFlexGrid1.Rows - 1
        If MSHFlexGrid1.TextMatrix(j, 5) = "√" Then
            sc(i) = MSHFlexGrid1.TextMatrix(j, 0)    '将卡号存储
            xh(i) = Val(j)               '将行号存储

 '添加line和student表中的信息
            txtsql = "select * from online_info where cardno = '" & sc(i) & "'"
            Set mrconline = ExecuteSQL(txtsql, msgtext)

            txtsql = "select * from student_info where cardno = '" & sc(i) & "'"
            Set mrcstudent = ExecuteSQL(txtsql, msgtext)

            txtsql = "select * from line_info"
            Set mrcline = ExecuteSQL(txtsql, msgtext)

            txtsql = "select * from basicdata_info"
            Set mrcbasicdata = ExecuteSQL(txtsql, msgtext)

  '计算消费时间
            onlinetime = (Date - DateValue(mrconline.Fields(6))) * 1440 + (Hour(Time) - Hour(TimeValue(mrconline.Fields(7)))) * 60 + (Minute(Time) - Minute(TimeValue(mrconline.Fields(7))))  '时间单位为分钟

  '计算消费金额
            If onlinetime < Trim(mrcbasicdata!leasttime) Then
                    onlinecash = Trim(mrcbasicdata!limitcash)

            Else

                If Trim(mrconline!cardType) = "固定用户" Then
                    If Val(onlinetime) Mod Val(mrcbasicdata!unittime) = 0 Then
                        onlinecash = Int(onlinetime / mrcbasicdata!unittime) * Trim(mrcbasicdata!Rate)
                    Else
                        If Val(onlinetime) Mod Val(mrcbasicdata!unittime) >= 30 Then
                            onlinecash = (Int(onlinetime / mrcbasicdata!unittime) + 1) * Trim(mrcbasicdata!Rate)
                        Else
                            onlinecash = (Int(onlinetime / mrcbasicdata!unittime) + 0.5) * Trim(mrcbasicdata!Rate)
                        End If

                    End If

                Else
                    If Val(onlinetime) Mod Val(mrcbasicdata!unittime) = 0 Then
                        onlinecash = Int(onlinetime / mrcbasicdata!unittime) * Trim(mrcbasicdata!Rate)
                    Else
                        If Val(onlinetime) Mod Val(mrcbasicdata!unittime) >= 30 Then
                            onlinecash = (Int(onlinetime / mrcbasicdata!unittime) + 1) * Trim(mrcbasicdata!tmprate)
                        Else
                            onlinecash = (Int(onlinetime / mrcbasicdata!unittime) + 0.5) * Trim(mrcbasicdata!tmprate)
                        End If

                    End If

                End If
            End If


      '添加line表
            mrcline.AddNew
            mrcline!cardno = mrconline!cardno
            mrcline!studentno = mrconline!studentno
            mrcline!studentname = mrconline!studentname
            mrcline!department = mrconline!department
            mrcline!sex = mrconline!sex
            mrcline!ondate = mrconline!ondate
            mrcline!OnTime = mrconline!OnTime
            mrcline!offdate = Format(Date, "yyyy-mm-dd")
            mrcline!offtime = Format(Time, "hh:mm:ss")
            mrcline!consumetime = onlinetime
            mrcline!consume = onlinecash
            mrcline!cash = Trim(mrcstudent!cash) - onlinecash
            mrcline!Status = "未结账"
            mrcline!computer = mrconline!computer
            mrcline.Update

       'student表更新余额
            mrcstudent!cash = mrcline!cash
            mrcstudent.Update

            mrconline.Close

       '删除online表
            txtsql = "select * from online_info where cardno = '" & sc(i) & "'"
            Set mrc5 = ExecuteSQL(txtsql, msgtext)

            mrc5.Delete
            mrc5.Update
            mrcstudent.Close
            mrcline.Close
            mrcbasicdata.Close

            i = i + 1

        End If
        Next j

        MsgBox "选中学生以下机!", 0 + 48, "提示"

       '重新导入正在上机学生记录
        txtsql = "select * from online_info "
        Set mrc6 = ExecuteSQL(txtsql, msgtext)

        With MSHFlexGrid1
       '设置单元格列宽
            .ColWidth(-1) = 2000

       '设置单元格对齐方式
            .ColAlignment(-1) = 4

            .Rows = 1
            .TextMatrix(0, 0) = "卡号"
            .TextMatrix(0, 1) = "姓名"
            .TextMatrix(0, 2) = "上机日期"
            .TextMatrix(0, 3) = "上机时间"
            .TextMatrix(0, 4) = "机房号"
            .TextMatrix(0, 5) = "是否选中"

            If mrc6.EOF = True Then
                MsgBox "没有上机记录!", 0 + 48, "提示"
            Exit Sub
            Else    '存在记录填充表格
                Do While Not mrc6.EOF
                    .Rows = .Rows + 1
                    .CellAlignment = 4
                    .TextMatrix(.Rows - 1, 0) = Trim(mrc6!cardno)
                    .TextMatrix(.Rows - 1, 1) = Trim(mrc6!studentname)
                    .TextMatrix(.Rows - 1, 2) = Trim(mrc6!ondate)
                    .TextMatrix(.Rows - 1, 3) = Trim(mrc6!OnTime)
                    .TextMatrix(.Rows - 1, 4) = Trim(mrc6!computer)

                    mrc6.MoveNext

                Loop

            End If
        End With

猜你喜欢

转载自blog.csdn.net/molihuakai_118/article/details/79501842