本来想写一篇优化的,但是想想最近在这个临时收费上费了一点功夫,毕竟问题都是自己解决的,还是需要总结一下的。
对于临时用户,相比较头疼的就是临时收费的计算了,计算很简单,就是当时注册的钱-上机消费后所剩余的钱了。但是line表中没有类型的划分,除非在表中加上一个字段。这个很麻烦。
那就用另外一种方法,我创建了一个sum_Info临时表,通过它进行计算,那就遇到问题了,开始的时候我实现了一个操作员进行一次的操作,注册、上下机,临时收费金额算的都没有问题,但是多个操作员或者执行多次登录、退出的操作,临时收费金额的计算就有问题了。下面步入正题:
创建一个临时用户表方便计算当操作员注册临时用户时所计算的金额。注册的用户全部为"在使用"的状态,每注册一个卡号,便会在sum_Info 表中增加相应的数据,这样当管理员操作时候,student_Info 表中只剩下了使用和未使用的用户了。只需在结账窗体中算上student_Info表中,就可以计算临时收费金额。
首先,定义一个过程,目的是没注册一个用户就相应的增加到临时表中,方便计算临时用户的起始金额。
<span style="font-size:18px;">Public Function flash()
'定义一个Flash的过程。
Dim txtSQL As String
Dim MsgText As String
Dim mrcsd As ADODB.Recordset
Dim mrc As ADODB.Recordset
Dim mrca As ADODB.Recordset
txtSQL = "select * from User_Info where Level='操作员' and userID= '" & UserName & "'"
Set mrca = ExecuteSql(txtSQL, MsgText)
<span style="white-space: pre;"> </span> txtSQL = "select * from student_Info where Ischeck='未结账' and status='在使用' and type='临时用户' and UserID= '" & mrca.Fields(0) & "'"
<span style="white-space: pre;"> </span> Set mrcsd = ExecuteSql(txtSQL, MsgText)
<span style="white-space: pre;"> </span> mrcsd.MoveLast '这句话很关键,因为我发现注册的用户都会放到最后一条,这样更新的sum_info就会一一对应了。
txtSQL = "select * from sum_Info "
Set mrc = ExecuteSql(txtSQL, MsgText)
mrc.AddNew
mrc.Fields(0) = mrcsd.Fields(7)
mrc.Fields(1) = mrcsd.Fields(0)
mrc.Fields(2) = UserName
mrc.Update
</span>
在结账窗体中,就需要计算全部上过机,或者部分上过机,或者都没有上过机的总钱数了。
<span style="font-size:18px;">'连接未使用的临时用户,这个为了计算已经上过机的用户。
txtSQL = "select * from student_Info where Ischeck='未结账' and status='未使用' and type='临时用户' and UserID='" & cboUser.Text & "'"
Set mrca = ExecuteSql(txtSQL, MsgText)
Do While Not mrca.EOF
lastcash = lastcash + mrca.Fields(7) '下机后,其中的临时用户金额变的钱的总金额。
mrca.MoveNext
Loop
</span>
<span style="font-size:18px;">'这个是为了计算还有没有上过机的临时用户。
txtSQL = "select * from student_Info where Ischeck='未结账' and status='在使用' and type='临时用户' and UserID='" & cboUser.Text & "'"
Set mrcaa = ExecuteSql(txtSQL, MsgText)
Do While Not mrca.EOF
cc = cc + mrcaa.Fields(7) '其中的临时用户金额变的钱的总金额。
mrca.MoveNext
Loop
</span>
<span style="font-size:18px;">'这个是为了计算不同操作员注册不同临时用户的总费用,就是注册的费用。
txtSQL = "select * from sum_Info where UserID='" & cboUser.Text & "'"
Set mm = ExecuteSql(txtSQL, MsgText)
Do While Not mm.EOF
aa = aa + mm.Fields(0)
mm.MoveNext
Loop
txtLincash.Text = aa - lastcash - cc '这样就可以计算临时收费了,不管临时用户是否上机都不影响结果。</span>
总之,在临时收费这块中,我不仅仅尝试了这一种方法,其实还有很多的方法,我喜欢找更简单的方法,但是每次都可能碰巧实现了,每次进行很多数据验证时会报错。当我完成了这个功能时,想想也挺简单的,当自己在一点点的探索不同方法的过程中,才会发现原来自己解决这个问题,是那么的困难。总结两点:
1.细节很重要,增加的数据是最后一条,用到了Movelast。
2.不断的尝试,不断的实践,一定会找到属于自己的方法!