机房收费系统——上机【设计篇】
最近重新重新把机房拾起来,重新找回机房的设计思路,重新找回对代码的熟悉度,上机对我来说有点稍难,但是先捋清楚思路,画好流程图,敲起来就简单很多啦。
首先给大家分享一下我的设计思路——流程图:有了流程图就简单啦,按照设计的思路一步一步的编写代码实现功能就OK啦。下面给大家分享一下我的代码,代码大体上还是以查询和添加更新为主,捋清了思路还是非常简单的增添查,所以大家不要有心理压力哦。
'定义变量
略
'判空
If Trim(txtcardno.Text = "") Then
MsgBox "请输入卡号!", 0 + 48, "提示"
txtcardno.SetFocus
Exit Sub
End If
'判断输入卡号是否是数字
If Not IsNumeric(Trim(txtcardno.Text)) Then
MsgBox "卡号请输入数字!", 0 + 48, "警告"
txtcardno.Text = ""
txtcardno.SetFocus
Exit Sub
End If
'判断卡号是否存在——连接数据库——不存在或者退卡的都不行,只有使用的可以
txtsql = "select * from student_info where cardno='" & Trim(txtcardno.Text) & "' and status='使用'"
Set mrcStu = ExecuteSQL(txtsql, msgtextStu)
If mrcStu.EOF = True Then
MsgBox "此卡号不存在或不再使用,请重新输入!", 0 + 48, "提示"
txtcardno.Text = ""
txtcardno.SetFocus
Exit Sub
End If
'判断卡号是否正在上机——online表
txtsql = "select * from online_info where cardno='" & Trim(txtcardno.Text) & "'"
Set mrcOn = ExecuteSQL(txtsql, msgtextOn)
If mrcOn.EOF = False Then
txtcardno.Text = mrcOn.Fields(0)
txttype.Text = mrcOn.Fields(1)
txtstudentNo.Text = mrcOn.Fields(2)
txtstudentname.Text = mrcOn.Fields(3)
txtdepartment.Text = mrcOn.Fields(4)
txtsex.Text = mrcOn.Fields(5)
txtonlinedate.Text = mrcOn.Fields(6)
txtonlinetime.Text = mrcOn.Fields(7)
txtcash.Text = mrcStu.Fields(7) '此时余额还未更新,数据库中的数据还没更新,是原来的
txtspendtime.Text = "" '消费时间——下机
txtspendmoney.Text = "" '消费金额——下机
txtdownlinedate.Text = ""
txtdowntime.Text = ""
MsgBox "此卡正在上机,请先下机", 0 + 48, "提示"
txtcardno.SetFocus
Exit Sub
End If
'判断卡中余额是否充足——student表和basicdata表对比最低金额
txtsqlBa = "select limitcash from basicdata_info " '查询basicdata表中的最低金额——limitcash字段,将查询的数据集与student表中的余额cash进行对比
Set mrcBa = ExecuteSQL(txtsqlBa, msgtextBa)
txtsqlStu = "select * from student_info where cardno='" & Trim(txtcardno.Text) & "'"
Set mrcStu = ExecuteSQL(txtsqlStu, msgtextStu)
If Val(mrcStu.Fields(7)) < Val(mrcBa.Fields(0)) Then '注意mrcBa数据集中只有一列字段名——limitcash或者查询时查全部:txtsqlBa = "select * from basicdata_info " 则写成fields(5)
MsgBox "此卡余额不足,请先充值!", 0 + 48, "提示"
txtcardno.Text = ""
txtcardno.SetFocus
Exit Sub
Else
'更新添加online表数据
mrcOn.AddNew
mrcOn.Fields(0) = Trim(txtcardno.Text)
mrcOn.Fields(1) = mrcStu.Fields(14)
mrcOn.Fields(2) = mrcStu.Fields(1)
mrcOn.Fields(3) = mrcStu.Fields(2)
mrcOn.Fields(4) = mrcStu.Fields(4)
mrcOn.Fields(5) = mrcStu.Fields(3)
mrcOn.Fields(6) = Date
mrcOn.Fields(7) = Time
mrcOn.Fields(8) = VBA.Environ("computername")
mrcOn.Fields(9) = Now
mrcOn.Update
'显示online中的数据
txtcardno.Text = mrcOn.Fields(0)
txttype.Text = mrcOn.Fields(1)
txtstudentNo.Text = mrcOn.Fields(2)
txtstudentname.Text = mrcOn.Fields(3)
txtdepartment.Text = mrcOn.Fields(4)
txtsex.Text = mrcOn.Fields(5)
txtonlinedate.Text = mrcOn.Fields(6)
txtonlinetime.Text = mrcOn.Fields(7)
txtcash.Text = mrcStu.Fields(7) '此时余额还未更新,数据库中的数据还没更新,是原来的
' txtspendtime.Text = "" '消费时间——下机
' txtspendmoney.Text = "" '消费金额——下机
txtdownlinedate.Text = ""
txtdowntime.Text = ""
MsgBox "上机成功!", 0 + 48, "提示"
End If
'更新line表
txtSQLline = "select * from line_info where cardno='" & Trim(txtcardno.Text) & "'"
Set mrcLine = ExecuteSQL(txtSQLline, msgtextLine)
mrcLine.AddNew
mrcLine.Fields(1) = Trim(txtcardno.Text)
mrcLine.Fields(2) = Trim(txtstudentNo.Text)
mrcLine.Fields(3) = Trim(txtstudentname.Text)
mrcLine.Fields(4) = Trim(txtdepartment.Text)
mrcLine.Fields(5) = Trim(txtsex.Text)
mrcLine.Fields(6) = Trim(txtonlinedate.Text)
mrcLine.Fields(7) = Trim(txtonlinetime.Text)
' mrcLine.Fields(8) = Trim(txtdownlinedate.Text) '上机时没有信息,可以先不写,数据库中允许为空值即可
' mrcLine.Fields(9) = Trim(txtdowntime.Text)
' mrcLine.Fields(10) = Trim(txtspendtime.Text)
' mrcLine.Fields(11) = Trim(txtspendmoney.Text)
' mrcLine.Fields(12) = Trim(txtcash.Text)
mrcLine.Fields(13) = "正常上机"
mrcLine.Fields(14) = VBA.Environ("computername")
mrcLine.Update
需要注意两点:
一.我设计的思路是先更新online表,把online表中的数据显示在文本框中,再把文本框中显示的更新到line表中,当然也可以先把student表中的数据更新到文本框显示出来,再把文本框显示的更新给online表,两种思路都可以的。
二.查询表时可以使用 “*” 查询全部信息,再比较需要的列,当然最好是直接查询所需要的列,避免数据库数据过多增加查询工作量,运行比较慢。
到此上机和更新数据库就完成了,还有显示当前上机人数和显示上机时间的设计。
当前上机人数:首先如果数据库online表中已经有正在上机的卡号,则在窗体加载时就应该显示出来,然后当有新的卡号上机后数据库更新之后应该及时查询并显示新的人数。所以就需要查询两次online表中的人数,我想到最简单的解决方式就是在加载窗体时查询一次代码,在更新完数据之后再查询一次代码,这样就会造成代码比较冗余,希望大家多多指教,提出更好的解决方法。
代码如下:
'查询上机人数,显示出来
txtsql = "select count(*) From online_info "
Set mrcOn = ExecuteSQL(txtsql, msgtextOn)
lblpeople.Caption = mrcOn.Fields(0)
上机就此成功,当然也遇到了很多问题,请期待后续博客!