第一次机房收费系统——上下机
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
相关文章推荐
- 第一次机房收费系统--逻辑(一)
- 第一次机房收费系统-登录窗体(一)
- 第一次机房收费系统--结账
- 第一次机房收费系统-注册控件
- 机房收费系统之上下机
- UML五类十图(一) (第一次机房收费系统)
- 第一次机房收费系统——结账
- 【第一次机房收费系统】BOF和EOF
- 第一次机房收费系统--下机
- 【机房收费系统】——上下机
- 第一次机房收费系统——其它基本窗体
- 第一次机房收费系统总结
- 机房收费系统之上下机
- 机房收费系统的上下机
- [第一次机房收费系统]组合查询
- 第一次机房收费系统—Excel导出数据
- UML五类十图(二) (第一次机房收费系统)
- 第一次机房收费系统—优化
- 第一次机房收费系统—信息的输入与输出
- 机房收费系统——上下机