机房收费系统一个难点是:上下机的代码。上下机不但要在上下机窗口中用到,在菜单项“选中学生下机”“所有学生下机”和最后服务器关闭时所有学生下机都要用到,所以,这里就要讲一下,怎样封装一个函数。
在模块中用到的public定义的变量和函数是整个工程中都可以用的,所以,我们可以通过传给函数一个“卡号”变量,来执行上下机函数。
实现上下机,就要对数据类型熟练、逻辑清晰、还要有检测代码的手段。在这里,我就说说我的上下机是怎样写的。
主代码尽可能的清楚:
Mod_ConsumeTime = DateDiff("n", Ondate, Now) '得到的时间
'----------------------第一次修改------------------
'----------------------------第二次修改-----------------
If Mod_ConsumeTime < Mod_Leasttime Then
Mod_Time = 0
Mod_ConsumeCash = 0
Else
Mod_Time = Int(Mod_ConsumeTime / Mod_UnitTime) + 1 '这是单位时间内的钱数
If Trim(Mod_Type) = "固定用户" Then
Mod_ConsumeCash = Val(Mod_Time * Mod_Rate)
Else
Mod_ConsumeCash = Val(Mod_Time * Mod_Tmprate)
End If
End If
这样,本身我用的就很简单。几句话就可以实现上下机的功能。
数据类型,datediff函数一定要是date类型的,从数据库中“设计”中,你的字段必须是datetime类型,这样才能用datediff。
同时,大家也有这样的疑惑,就是有一些数据从数据里拿出来跟其他数据比较是没有办法比较大小的。那么我告诉你,检查你的数据库中这个字段的数据类型,还有,把将该字段中的数传给一个参数,这个参数的类型一定要和你数据库中该字段的数据类型一致。
上下机设计到basicdata-info、student-info、line-info、online-info,而且一个表可能要改两遍,这时候就一定是考验咱逻辑的时候了。
所有的代码我是这样写的:
Public StuOnLine As Integer '链接学生上机状态查询和上下机界面的东西
Public Mod_Card As Integer '需要传递的一个值
Public Mod_ConsumeCash As Single
Public Mod_Cash As Single
Public Mod_ConsumeTime As Single
Public Mod_Limitcash As Single
'这个窗体是用来实现时间计算
Function CaculationCash()
Dim txtSQL As String
Dim Msgtext As String
Dim mrc As ADODB.Recordset
Dim Ondate
Dim Mod_Type As String
Dim Mod_Rate
Dim Mod_Tmprate
Dim Mod_UnitTime
Dim Mod_Leasttime As Integer
Dim Mod_preparetime As Integer
Dim Mod_Ondate
Dim Mod_Offdate
Dim Mod_Time
Dim Mod_Student_Consumecash As Single
txtSQL = "select * from student_info where cardno='" & Mod_Card & "'" & " and status='" & "使用'" 'student表中调去用户类型数据
Set mrc = ExecuteSQL(txtSQL, Msgtext)
If Not (mrc.EOF Or mrc.BOF) Then
Mod_Type = mrc.Fields(14)
Else
MsgBox "该卡没有注册!"
End If
txtSQL = "select * from basicdata_info" 'basicdata 表中取出数据
Set mrc = ExecuteSQL(txtSQL, Msgtext)
If Not (mrc.EOF Or mrc.BOF) Then
mrc.MoveFirst
Mod_Rate = Trim(mrc.Fields(0))
Mod_Tmprate = Trim(mrc.Fields(1))
Mod_UnitTime = Trim(mrc.Fields(2))
Mod_Leasttime = Trim(mrc.Fields(3))
Mod_preparetime = Trim(mrc.Fields(4))
Mod_Limitcash = Trim(mrc.Fields(5))
End If
mrc.Close
txtSQL = "select * from online_info where cardno='" & Mod_Card & "'" 'online表中删除数据
Set mrc = ExecuteSQL(txtSQL, Msgtext)
If Not (mrc.EOF Or mrc.BOF) Then
Ondate = mrc.Fields(9)
mrc.Delete
' Else
' MsgBox "该学生已下机", vbOKOnly + vbExclamation, "警告"
End If
txtSQL = "select * from line_info where status='" & "正常上机'" & " and cardno='" & Mod_Card & "'" 'line表中读取数据
Set mrc = ExecuteSQL(txtSQL, Msgtext)
If mrc.EOF = True Then
MsgBox "该卡没有上机", vbOKOnly + vbExclamation, "警告"
Else
Mod_ConsumeTime = DateDiff("n", Ondate, Now) '得到的时间
'----------------------第一次修改------------------
'----------------------------第二次修改-----------------
If Mod_ConsumeTime < Mod_Leasttime Then
Mod_Time = 0
Mod_ConsumeCash = 0
Else
Mod_Time = Int(Mod_ConsumeTime / Mod_UnitTime) + 1 '这是单位时间内的钱数
If Trim(Mod_Type) = "固定用户" Then
Mod_ConsumeCash = Val(Mod_Time * Mod_Rate)
Else
Mod_ConsumeCash = Val(Mod_Time * Mod_Tmprate)
End If
End If
mrc.Fields(8) = Date
mrc.Fields(9) = Format(Now, "hh:mm:ss")
mrc.Fields(10) = Mod_ConsumeTime
mrc.Fields(11) = Mod_ConsumeCash
Mod_Student_Consumecash = Trim(mrc.Fields(12))
mrc.Fields(13) = Trim("正常下机")
mrc.Fields(12) = Mod_Student_Consumecash - Mod_ConsumeCash
mrc.Update
mrc.Close
End If
txtSQL = "select * from student_info where cardno='" & Mod_Card & "' and status='使用'" '更新student表中也有一个cash
Set mrc = ExecuteSQL(txtSQL, Msgtext)
If mrc.EOF = False Then
Mod_Student_Consumecash = Trim(mrc.Fields(7))
mrc.Fields(7) = Mod_Student_Consumecash - Mod_ConsumeCash
Mod_Cash = Trim(mrc.Fields(7))
mrc.Update
mrc.Close
End If
End Function
大家有木有用过立即窗口,它可以帮你显示出所有你的参数值。
将这句话复制到你的SQL Server里面,检查就对了。
到这里上下机代码就可以了,那么就是封装上下机的函数了,下面大家可以看到,上下机封装无非就是参数的输入和输出,他就是一个处理工具,进去的是一个card出来可能就是一个time、cash等等,你想要什么让它输出就好了。
早就想写这篇文章了,由于一些原因拖到了现在,实在是:革命尚未成功。。。。。。