机房收费系统的手动下机有很多的逻辑在里面,当时做的有些费脑细胞但整体做下来还算顺利,而自动下机就费了大劲儿了,想到了很多方法也进行了很多尝试,考虑的角度也很多,分别是:从VB程序本身、从数据库、从余额等等角度都有考虑尝试过,但都未成功,其中占用时间最长的一个尝试是从数据库角度出发,把余额转化为最长上机时间,在数据库中加一列数据最长上机时间,然后把数据更新到数据库,数据库则每分钟进行递减,有用到触发器进行递减操作但没起作用。后来一个思路让我找到了方向,最终完成了自动下机,但前提是我在数据库的数据表里加了一列数据,一个获取下机时长的数据,那具体是怎么操作的呢,现在分享给大家^_^
一、自动下机流程
以上流程图中的自动下机时间是什么呢?请往下看
二、错误集
自动下机里最多的错误就是逻辑错误,要不都下不了机、要不就都下机了(没到时间的也下机了),逻辑的调整问题就不在此赘述了,因为是错误的逻辑,再加上太多了很多都忘记了(⊙o⊙)…
三、查询集
①、如何获取程序运行时长?
四、代码片段
①、获取当前程序的运行时间
Private Sub Timer2_Timer() '获取当前程序运行时间
S = DateDiff("S", Tim, Time)
If S > 60 Then
B = S
M = B \ 60 '将运行时间转化为分钟数
End If
lbltime.Caption = M '将分钟数赋值给lbltime控件
End Sub
②、 判断卡类型并算出某卡的下机时长
If txttype.Text = 固定用户 Then
longtime = txtcash.Text / 2 '如果是固定用户则余额除以2得出总上机时长
Else
longtime = txtcash.Text / 3 '如果是临时用户则余额除以3得出总上机时长
downtime = longtime + lbltime.Caption '下机时长=总上机时长+程序已运行时长
③、防止重复timer3事件时因无法搜索到已下机卡号而报错,将正在上机数据表中的数据更新到界面
onlinetxtSQL = "select * from online_Info " '防止重复timer事件时的数据库无内容报错
Set onlinemrc = ExecuteSQL(onlinetxtSQL, onlineMsgText)
'获取正在上机数据表中的数据
If onlinemrc.EOF Then
MsgBox "无上机人员!", vbOKOnly, "温馨提示:"
txtcardno.SetFocus
Else
txtcardno.Text = onlinemrc.Fields(0)
txttype.Text = onlinemrc.Fields(1)
txtstudentno.Text = onlinemrc.Fields(2)
txtstudentName.Text = onlinemrc.Fields(3)
txtdepartment.Text = onlinemrc.Fields(4)
txtsex.Text = onlinemrc.Fields(5)
txtondate.Text = onlinemrc.Fields(6)
txtontime.Text = onlinemrc.Fields(7)
txtoffdate.Text = Format(Now(), "yyyy-MM-dd")
txtofftime.Text = Format(Now(), "HH:mm:ss")
End If
lblonline.Caption = onlinemrc.RecordCount
onlinemrc.Close
④、在数据库中循环查询下机时长符合条件的卡号,自动下机
Private Sub Timer3_Timer()
Dim onlinetxtSQL As String
Dim onlineMsgText As String
Dim onlinemrc As ADODB.Recordset
Call Timer2_Timer '调取timer2时间事件,获取当前时间
onlinetxtSQL = "select * from online_Info where longtime='" & lbltime.Caption & "'"
Set onlinemrc = ExecuteSQL(onlinetxtSQL, onlineMsgText)
'查询数据库中正在上机数据表中的下机时间列数据
If onlinemrc.EOF Then '如果该下机时间,那么继续执行timer3事件,循环寻找
Timer3.Enabled = True
Else
MsgBox "您的卡内余额不足,即将下机!", vbOKOnly, "温馨提示:"
'如果有符合的下机时间则提示下机
Call cmddown_Click '调取下机过程进行下机
End If
End Sub
以上四个代码片段便是自动下机的核心代码,看上去可能没什么特别,然而他们的先后顺序,两个timer的调用顺序,两个Timer的运行与停止位置,代码的位置也是一些要思考的问题。上面的办法可能看上去笨笨的,不过能自动下机就很开心了,自动下机就到此结束了,下一站退卡窗体走起^_^