收费系统中我们凭卡上机,上之前,我们会线检查卡呢余额,如果不足多少元请持卡人充值后在上机.我们需要设置一个金额,假如说五元.但是这样其实是有点不太合理,有些人的卡内余额其实还可以上,但是也必须得充值到最少余额才可以上.这样其实还有一个漏洞:持卡人可以上机两小时,但是他上了三个小时或是更多,这样就会出现负值.所以我们提前设置一个门槛值是有局限的.所以我稍微做了一下改进:定时检查卡内余额.
定时检测
在系统中增加一个timer 事件,定时检查各个正在上机的卡的余额,到门槛值时提醒用户,如果余额为0,那么就强制用户被迫下机。
思路如下:
其中判断计算消费时间用到了时间函数:datediff ;和自定义的判断消费金额函数:DynCash。
定时长短,可以根据具体情况而定.在timer控件的interval属性设置就好。
代码如下:
Private sub timer_click()
StrSqla = "select CID,ontime from Online"
Set objrsa = ExecuteSQL(StrSql, StrMsg)
ReDim DynCard(objrsa.RecordCount) As Integer '定义卡号数组
ReDim DynTime(objrsa.RecordCount) As String '定义上机时间字符串数组
Dim StaticOver As Integer '定义消费前余额
Dim DynInterval As Integer '定义实时时间间隔
Dim Intindex As Integer
Dim DynOver As Integer ’定义动态余额
'将卡号和余额依次放入到数组中
For Intindex = 0 To objrsa.RecordCount - 1
objrsa.MoveFirst
DynCard(Intindex) = objrsa!CID
DynTime(Intindex) = objrsa!OnTime
'计算余额
StrSqlb = "select Cash from stuinfo where CID='" & DynCard(Intindex) & "'"
Set objrsb = ExecuteSQL(StrSqlb, StrMsg)
StaticOver = objrsb!Cash
'1求时间间隔
DynInterval = interval(DynTime(Intindex), Time)
'2消费的金额
DynOver = DynCash(DynInterval)
'3求余额
StaticOver = StaticOver - DynOver
'对余额进行判断
If StaticOver < 5 Then
MsgBox "您的余额不足五元,请酌情上机", vbOKOnly, "提示"
End If
If StaticOver = 0 Then
MsgBox "卡内余额不足", vbOKOnly, "提示"
cmdOff_Click
StrSqlb = "select * from consumeinfo where cid='" & DynCard(Intindex) & "'"
Set objrsb = ExecuteSQL(StrSqlb, StrMsg)
objrsb!Status = "被迫下机"
MsgBox DynCard(Intindex) & "号卡已经下机!", vbOKOnly, "下机提示"
End If
'卡号向后移动
objrsa.MoveNext
Next
End sub
’******************************************************************************
’调用的自定义函数如下:
' '获取时间间隔
Private Function interval(StrStart As String, StrEnd As String) As Integer
interval = DateDiff("n", StrStart, StrEnd)
End Function
Private Function DynCash(IntConsumeTime As Integer) As Integer
'判断用户类型,收取费用。
If txtType.Text = "一般用户" Then
'上机时间少于五分钟,收费为0
If IntConsumeTime < 5 Then
DynCash = 0
Else
DynCash = (Int(IntConsumeTime / 30) + 1) * 1
End If
Else
'上机时间少于五分钟,收费为0
If IntConsumeTime < 5 Then
DynCash = 0
Else
DynCash = Int(IntConsumeTime / 30) * 0.5
End If
End If
End Function
有不足之处请指正。