前言:机房收费系统到现在已经基本完成。这段时间优化主要解决了一个问题就是余额实时更新的问题。也有一些不足的地方。下面就说一下我解决的问题和不足。
一、余额实时更新问题
如图所示,在还没有下机的时候把余额实时的更新到窗体,以便用户查阅和从数据库中选出临时用户的消费金额。代码和下机的代码大同小异,把所有涉及到窗体上控件名的地方都换成了对应的数据库表里字段名,因为timer事件中不涉及到窗体上的控件。下面是timer的代码。
Private Sub Timer2_Timer() '余额,消费金额实时更新
Dim onmrc As ADODB.Recordset
Dim mrc As ADODB.Recordset
Dim bsdtmrc As ADODB.Recordset
Dim m As Long
Dim c As String
txtSQL = "select * from basicdata_Info" '数据设定表
Set bsdtmrc = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from online_Info " '正在上机表
Set onmrc = ExecuteSQL(txtSQL, MsgText)
If onmrc.EOF Then '没有人正在上机
Exit Sub
Else
Do While Not onmrc.EOF
txtSQL = "select * from student_Info where cardno = '" & Trim(onmrc.Fields(0)) & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
'计算时间
t = Trim((Date - DateValue(onmrc.Fields(6))) * 24 + (Hour(Time) - Hour(TimeValue(onmrc.Fields(7)))) + (Minute(Time) - Minute(TimeValue(onmrc.Fields(7)))) / 60)
If t * 60 < bsdtmrc.Fields(4) Then
s = 0
Else
t = t - bsdtmrc.Fields(4) / 60
If t - Int(t) <= 0.5 Then
t = Int(t) + 0.5
Else
t = Int(t) + 1
End If
'计算消费金额
If Trim(mrc.Fields(14)) = "固定用户" Then
s = t * bsdtmrc.Fields(0)
Else
s = t * bsdtmrc.Fields(1)
End If
End If
m = Val(mrc.Fields(7)) - s
'更新上机表
txtSQL = "select * from Line_Info where cardno = '" & Trim(onmrc.Fields(0)) & "' and status = '正常上机 '"
Set linmrc = ExecuteSQL(txtSQL, MsgText)
If Not linmrc.EOF Then
linmrc.Fields(12) = m
linmrc.Fields(11) = s
linmrc.Update
End If
'当上机的卡号和正在上机表中的卡号相等就把余额和消费金额更新到窗体
If onmrc.Fields(0) = Val(txtCardnum.Text) Then
txtBalance.Text = m
txtConsummoney.Text = s
End If
' '如果余额低于最低金额给出提示
c = Trim(onmrc.Fields(0))
' If m < bsdtmrc.Fields(5) And m > 0 Then
' MsgBox "卡号为:" & c & "的亲,您的余额已不足" & m & "元,请尽快充值!"
' End If
'如果金额为0强制下机
If m <= 0 Then
MsgBox "卡号为" & c & "的亲,您的余额已不足0元,马上为您下机", vbInformation
' Call viewData
txtSQL = "select * from student_Info where cardno = '" & Trim(onmrc.Fields(0)) & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
'把余额填到学生表里
mrc.Fields(7) =<span style="color:#ff6666;"> Val(mrc.Fields(7))</span> - s
mrc.Update
linmrc.Fields(8) = Format(Date, "yyyy-mm-dd")
linmrc.Fields(9) = Time
linmrc.Fields(10) = Val(t * 60)
linmrc.Fields(11) = Val(s)
linmrc.Fields(12) = mrc.Fields(7)
linmrc.Fields(13) = "强制下机"
linmrc.Update
txtType.Text = mrc.Fields(14)
txtSnum.Text = mrc.Fields(1)
txtName.Text = mrc.Fields(2)
txtDepartment.Text = mrc.Fields(4)
txtGender.Text = mrc.Fields(3)
txtBalance.Text = mrc.Fields(7)
txtOnlinedate.Text = onmrc.Fields(6)
txtOnlinetime.Text = onmrc.Fields(7)
txtOfflinedate.Text = Date
txtOfflinetime.Text = Time
'删除正在上机表中的记录
onmrc.Delete
onmrc.Update
' Unload Me
End If
onmrc.MoveNext
Loop
End If
' dtNextTime = DateAdd("n", 25, Now)
' Timer2.Enabled = True
' End If
End Sub
实现余额实时更新后感觉也没什么难的,但是在写的过程中余额可以实时显示到数据库中但是就是显示不到窗体上,也花了好多时间,最后解决后发现是非常小的问题,就是上图红色的地方。一开始我没有写val(),它们的类型不匹配所以出不来。所以不要忽视任何小的地方,不怕拦路虎,就怕绊脚羊。要做一个专业的程序员要对所有细节都熟记于心。
二、不足的地方
1、没有实现“金额不足最低金额提示用户充值”的功能
一开始我把这个功能和金额小于0强制用户下机一起写到了timer2里,因为timer的间隔是1秒,这样就会一直弹出消息框说让用户充值。所以要改一下timer的间隔,但是timer的最大间隔也就65秒。于是站在巨人的肩旁上写了下面的代码,但是功能没有实现,这个功能还需要再研究。
Dim dtNextTime As Date
Private Sub Form_load()
Timer1.Interval = 500
Timer1.Enabled = True
dtNextTime = DateAdd("n", 2, Now)
End Sub
Private Sub Timer1_Timer()
If Now >= dtNextTime Then
Timer1.Enabled = False
'在此加入你的代码
dtNextTime = DateAdd("n", 2, Now)
Timer1.Enabled = True
End If
End Sub
2、没有真切的站到用户的角度思考问题
我对注册的考虑是把注册金额和充值金额分开,而且把注册金额设成固定的,注册金额是从数据基本设定的表里调出来的,不需要用户手动输入。如下图所示,注册金额是不能输入的。
我这样设置主要是根据经验,去网吧等注册一张卡的钱肯定是固定的,不能有的人注册的钱收的多,有的人收的少。如果有人想多充电钱,就把出去注册的钱填的充值中就OK了。这样在结账的时候也好计算,让注册金额乘以固定用户的个数,加上固定用户充值的钱,再加上临时用户消费的钱,再减去固定用户退卡的钱就行了。不然,还要再专门建一张表放注册金额,比较麻烦。这样问题就来了,这样弄我是不麻烦了,但是用户使得时候,注册时还要自己把收的钱减去注册金额再填入充值里,给用户带来麻烦。
总结:做一个系统不仅是要实现具体的功能,重要的是设计理念,思想。要从用户的角度思考问题,我们是为用户服务的,所以要最大限度给用户带来方便。其次,要想成为专业的程序员就必须不能忽视任何小的问题,比如数据类型的一致问题。世界很简单,要么是0,要么是1,做事情也是要做好,要么别做。