机房收费系统快接近尾声,才把为知笔记里的学习总结拿出来是不是有些迟钝。所以养成时时总结的好习惯很重要,下面就分享一下我在机房收费系统中的小收获。
有关学生上下机这一块,我一开始没有过多的思考,上来就敲,结果就报错。
遇挫之后要想办法解决啊,我的解决方法就是站在巨人的肩膀上,去看看大家的总结博客。
于是乎,看了大神的博客。上下机的思路流程渐渐清晰,对机房上下机逻辑明了的同时,自己也收获了一种新的画图方式,流程图。
首先:要想上机,你要对卡号进行一些条件的筛选。
是否为空
是否为数字
是否为正在上机的用户
是否是使用用户
是否还有余额上机
然后:通过上面的细致筛选,进入下一环节。
更新表。上机记录Line表,上机表OnLine表。
最后:上机成功
<pre name="code" class="html">Private Sub cmdUP_Click() '学生上机实现 Dim mrc As ADODB.Recordset Dim mrcc As ADODB.Recordset Dim mrcd As ADODB.Recordset Dim mrce As ADODB.Recordset Dim txtSQl As String Dim MsgText As String Timer2.Enabled = True '判断该卡号是否正在上机 txtSQl = "select * from OnLine_Info where cardno ='" & Trim(txtCID.Text) & "'" Set mrc = ExecuteSQL(txtSQl, MsgText) If Not mrc.EOF Then MsgBox "此卡正在上机", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus txtCID.Text = "" mrc.Close End If ' txtSQl = "select * from student_Info where cardno ='" & Trim(txtCID.Text) & "'" '输入卡号,在表中找这个卡号相应的一行信息 ' Set mrcc = ExecuteSQL(txtSQl, MsgText) '卡号不能为空 If Not Testtxt(txtCID.Text) Then '卡号不为空 MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus End If '卡号是否为数字 If Not IsNumeric(txtCID.Text) Then MsgBox "请输入数字!", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus txtCID.Text = "" End If '判断卡号是否是存在的用户 txtSQl = "select * from student_Info where cardno ='" & Trim(txtCID.Text) & "'" '输入卡号,在表中找这个卡号相应的一行信息 Set mrcc = ExecuteSQL(txtSQl, MsgText) If mrcc.EOF Then MsgBox "该用户不存在,请重新输入!", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus txtCID.Text = "" Exit Sub mrcc.Close '忘记把记录集关闭 End If '判断卡上是否有余额 If mrcc.Fields(7) <= 0 Then '上方错误:错误3021 MsgBox "该卡余额不足,请充值!", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus txtCID.Text = "" mrcc.Close Exit Sub Else '卡里有余额,可以把student表中值赋给框框们 txtSID.Text = mrcc.Fields(1) txtStudentName.Text = mrcc.Fields(2) txtSex.Text = mrcc.Fields(3) txtDepartment.Text = mrcc.Fields(4) txtType.Text = mrcc.Fields(14) ' txtOnDate.Text = mrcc.Fields(12) ' txtOnTime.Text = mrcc.Fields(13) txtOnDate.Text = Format(Date, "yyyy-mm-dd") '日期和时间的格式 txtOnTime.Text = Format(Time, "hh:mm") txtBalance.Text = mrcc.Fields(7) txtOffTime.Text = "" txtOffDate.Text = "" txtCost.Text = "" txtCostTime.Text = "" mrcc.Close End If '更新上机记录表的数据 txtSQl = "select * from Line_Info" '多了一个点 Set mrcd = ExecuteSQL(txtSQl, MsgText) mrcd.AddNew '出错,未定义 mrcd.Fields(1) = Trim(txtCID.Text) mrcd.Fields(2) = Trim(txtSID.Text) mrcd.Fields(3) = Trim(txtStudentName.Text) mrcd.Fields(4) = Trim(txtSex.Text) mrcd.Fields(5) = Trim(txtDepartment.Text) mrcd.Fields(6) = txtOnDate.Text mrcd.Fields(7) = txtOnTime.Text mrcd.Fields(8) = Null mrcd.Fields(9) = Null mrcd.Fields(10) = Null mrcd.Fields(11) = ("0.0") mrcd.Fields(12) = Trim(txtBalance.Text) mrcd.Fields(13) = Trim("正常上机") mrcd.Fields(14) = Trim(VBA.Environ("computername")) '获取计算机名 mrcd.Update '更新正在上机表的数据 txtSQl = "select * from OnLine_Info" Set mrce = ExecuteSQL(txtSQl, MsgText) 'execute拼错了 mrce.AddNew mrce.Fields(0) = Trim(txtCID.Text) mrce.Fields(1) = Trim(txtType.Text) mrce.Fields(2) = Trim(txtSID.Text) mrce.Fields(3) = Trim(txtStudentName.Text) mrce.Fields(4) = Trim(txtDepartment.Text) mrce.Fields(5) = Trim(txtSex.Text) mrce.Fields(6) = Trim(txtOnDate.Text) mrce.Fields(7) = Trim(txtOnTime.Text) mrce.Fields(8) = Trim(VBA.Environ("computername")) mrce.Fields(9) = Date mrce.Update mrce.Close mrcd.Close MsgBox "恭喜你上机成功!", vbOKOnly + vbExclamation, "警告" onliner = onliner + 1 '上机人数的统计 lblOnlineNumber.Caption = onliner lblTime.Caption = Time End Sub
下面我们再来看看学生下机的实现。
首先:想要下机。对卡号进行条件筛选。
是否为空
是否为数字
是否为可用卡
是否上机
可以更新上机记录表
然后:要计算上机时间。 S:上机时间 Z:准备时间 X:最少时间
分三种情况,S<=Z Z<S<=X S >X
计算上机费用,
更新上机记录表中cash数据,这里的cash是消费的金额
更新student表中的cash数据,这里的cash是余额
最后:下机成功
Private Sub cmdDown_Click() '学生下机实现 Dim mrc As ADODB.Recordset Dim mrcc As ADODB.Recordset Dim mrcd As ADODB.Recordset Dim mrce As ADODB.Recordset Dim txtSQl As String Dim MsgText As String Dim UseTime, UnitNumber, a, b, c '判断卡号是否为空 If Not Testtxt(txtCID.Text) Then MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告" txtCID.SetFocus End If '判断卡号是否为数字 If Not IsNumeric(txtCID.Text) Then MsgBox "卡号需为数字!", 0 + 48, "提示" txtCID.SetFocus txtCID.Text = "" End If '判断卡号是否为存在的用户 txtSQl = "select * from student_Info" Set mrc = ExecuteSQL(txtSQl, MsgText) If mrc.EOF Then '如果最后一条记录里也没有这个卡号 MsgBox "该用户不存在,请重新输入!", 0 + 48, "提示" txtCID.SetFocus txtCID.Text = "" Exit Sub End If '判断卡号是否正在上机 txtSQl = "select * from OnLine_Info where cardno='" & Trim(txtCID.Text) & "'" Set mrcc = ExecuteSQL(txtSQl, MsgText) '如果没有上机 If mrcc.EOF Then MsgBox "该用户没有上机!", 0 + 48, "提示" txtCID.SetFocus txtCID.Text = "" ' txtSID.Text = "'"多了一点 txtSID.Text = "" txtType.Text = "" ' txtStudentName.Text = "'"多了一点 txtStudentName.Text = "" txtSex.Text = "" txtDepartment.Text = "" txtOnDate.Text = "" txtOnTime.Text = "" txtOffTime.Text = "" txtOffDate.Text = "" txtCostTime.Text = "" txtCost.Text = "" Exit Sub Else '如果正在上机 txtSID.Text = mrcc.Fields(2) txtType.Text = mrcc.Fields(1) txtStudentName.Text = mrcc.Fields(3) txtSex.Text = mrcc.Fields(5) txtDepartment.Text = mrcc.Fields(4) ' txtOnTime.Text = mrcc.Fields(6) txtOnDate.Text = mrcc.Fields(6) txtOnTime.Text = mrcc.Fields(7) c = mrcc.Fields(7) txtOnTime.Text = c mrcc.Delete End If '下机并更新上机记录表数据 '正常上机前有 空格txtSQl = "select * from Line_Info where status=' 正常上机' and cardno = '" & Trim(txtCID.Text) & "'" '卡号状态是正常上机的,且等于text框的卡号可以下机。 txtSQl = "select * from Line_Info where status='正常上机' and cardno = '" & Trim(txtCID.Text) & "'" '卡号状态是正常上机的,且等于text框的卡号可以下机。 Set mrce = ExecuteSQL(txtSQl, MsgText) txtOffDate.Text = Format(Date, "yyyy-mm-dd") txtOffTime.Text = Format(Time, "hh:mm") b = Abs(DateDiff("n", txtOffTime, c)) '计算上机时间的函数 txtCostTime.Text = b ' mrce.Update ' mrce.Fields(1) = Trim(txtCID.Text) ' mrce.Fields(2) = Trim(txt) mrce.Fields(8) = Trim(txtOffDate.Text) '出现错误。3021更新上机记录表中的下机日期和时间。 mrce.Fields(9) = Trim(txtOffTime.Text) mrce.Fields(10) = Trim(txtCostTime.Text) mrce.Fields(13) = Trim("正常下机") '计算上机时间 '没有写Info txtSQl = "select * from BasicData" '从基础数据设定表中提取数据 txtSQl = "select * from BasicData_Info" Set mrcd = ExecuteSQL(txtSQl, MsgText) '第一种情况,上机时间小于准备时间 '出错,变量未定义 If Val(txtCostTime) < Val(mrcd.Fields(4)) Then 缺少.text If Val(txtCostTime.Text) < Val(mrcd.Fields(4)) Then txtCost.Text = 0 '花费为0 onliner = onliner - 1 '在线人数减1 lblOnlineNumber.Caption = onliner mrce.Fields(11) = Trim(txtCost.Text) '上机记录表中消费 consume的更新 mrce.Fields(12) = Trim(txtBalance.Text) '上机记录表中余额 cash 的更新 mrce.Update '上机记录表更新 Exit Sub End If '第二种情况,准备时间<上机时间<最小上机时间 If Val(mrcd.Fields(4)) < Val(txtCostTime.Text) <= Val(mrcd.Fields(3)) Then txtCost.Text = 1 '花费记录为1 ' txtBalance.Text = mrce.Fields(12) - 1 '余额balance减1 txtBalance.Text = Val(mrc.Fields(7) - 1) '学生表中的cash数据更新减1 mrc.Fields(7) = Trim(txtBalance.Text) '把余额框的数据再赋值给学生表中的cash mrc.Update '学生表更新数据 mrce.Fields(11) = Trim(txtCost.Text) mrce.Fields(12) = Trim(txtBalance.Text) mrce.Update '更新上机记录表中数据 onliner = onliner - 1 '在线人数减1 lblOnlineNumber.Caption = onliner Exit Sub End If '第三种情况,上机时间大于最小上机时间 If Val(txtCostTime.Text) > Val(mrcd.Fields(3)) Then UseTime = Val(txtCostTime.Text) - Val(mrcd.Fields(4)) '实际上机时间不包括准备时间 UnitNumber = UseTime Mod Val(mrcd.Fields(2)) '单位用时个数等于所用时间整除基本表的单位时间 '如果上机单位用时个数不足1个 If UnitNumber = 0 Then UnitNumber = Int(UseTime / Val(mrc.Fields(2))) '实际上机用时时间除单位时间,不进行四舍五入 Else '如果上机单位用时个数大于等于1个 UnitNumber = Int(UseTime / Val(mrc.Fields(2))) + 1 '当实际上机时间大于单位时间,如 90/60 =1.5 int(1.5) =1,所以要加1 End If End If '从student表中提取数据,判断用户类型 ' if mrce.Fields If mrc.Fields(14) = "固定用户" Then a = mrcd.Fields(0) '固定用户单位费用,从基础数据设定表里提取数据 Else a = mrcd.Fields(1) '临时用户单位费用 End If '计算整体的花费 '计算消费金额 txtCost.Text = Format(UnitNumber * a, "0.0") '单位时间个数*单价 '计算余额 txtBalance.Text = Val(mrc.Fields(14)) - Val(txtCost.Text) '学生表中cash数据减消费金额 mrc.Fields(14) = Trim(txtBalance.Text) '把余额值赋给学生表的cash mrc.Update '学生表数据更新 '更新上机记录表数据 mrce.Fields(11) = Trim(txtCost.Text) mrce.Fields(12) = Trim(txtBalance.Text) mrce.Update '更新上机记录表中数据 onliner = onliner - 1 '在线人数减1 lblOnlineNumber.Caption = onliner End Sub
小结:学生上下机理清思路和流程很重要,逻辑放在首位去思考。代码实现如果困难的话,就先把注释打出来,按照注释去实现代码。
机房收费系统也在后续更新中,有错误之处,请大家指出,多多指教。