您的位置:首页 > 其它

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

2018-03-09 19:24 323 查看

前言

对于上下机,刚开始敲的时候是恐惧的,需要考虑的表太多,尤其是下机,还涉及到了金钱的计算。不得不说我已经踩过无数同期小伙伴的肩膀了,通过对大家优秀博客的学习,自己又理了理逻辑思路,感觉还是可以的吧!

对于基本上下机,只要思路清晰就可以敲出来了,但对与选择上下机,还真是要喷一口老血啊!!!这里面涉及到的不仅是逻辑性问题,还有技术方面的,咱这里强烈推荐:李光同学的选择上下机博客 ,看了光哥的博客才知道,原来我之前学得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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: