【前言】
机房收费系统终于大收官了,感觉结账可以说是机房收费系统中相对需要好好理清思路的一部分了,其他的现在感觉起来还简单,在结账的过程中每个人都有自己的理解,但是选择自己认为正确的理解去实现功能就好了,要从软件是为谁设计的,要实现什么样的功能出发来思考软件各部分的设计。
下面就总结一下我在结账中的爬摸滚打,为前面的学习做一个完美的总结,为后面的学习留下宝贵的经验。
【内容分析】
1.给谁结账?
是给上机的学生结账还是给操作员结账?
我刚开始结账的时候一直没有搞清楚到底是要给谁结账,以致不知从何下手来实现代码,我们分析如果是给学生结账,就会分析学生卡内的余额,消费金额,但是学生卡内的余额在学生下机的时候,就可以自动地进行计算出来,不需要对其结账。另外我们应该想一下这个系统是给谁用的,是给学校的老师也就是我们说的管理者用的,我们看一下操作员的功能是:注册卡,充值卡,退卡,金额,学生上机查询等工作,操作员相当于员工,工作一天,最后需要把今天的收支情况报告给管理员,只有管理员有结账的权限,结的是操作员(包括管理员)的账,这样管理员就可以很清楚地查看每个操作员今天的收支,最后把所有操作员的收支形成日结账单,就是这一天整个机房的收入情况。所以一定要理清思路。
2.应该怎么结账?
下面就是我们结账的界面。
我们先要选择一个操作员(或管理员),点击下面的sstab不同选项卡,会显示他购卡,充值,退卡等信息,汇总只是对当前要结账的操作员在当天还没有结账的记录中关于售卡张数,退卡张数,应收金额等的一个汇总。
在这里我认为的结账是给操作员和管理员结账,因为管理员也可以注册卡,充值和退卡,最后的钱同样要更新到日结账单中。
计算问题:
售卡张数:在student_info 表中当天该操作员未结账的记录条数。
退卡张数:cancelcard_info 表中当天该操作员未结账的记录条数。
充值金额:recharge_info 表中该操作员当天未结账的金额总数。
临时收费金额:student表中当天该操作员对临时用户的收费金额。
退卡金额:cancelcard_info 表中操作员当天未结账的金额总数。
总售卡数:售卡张数-退卡张数
应收金额:充值金额+注册金额-退卡金额
当我们选中操作员(管理员)之后,点击结账的时候我么需要做两个工作。一是更新日结账单,把要结账的记录更新到日结账单中,二是把相应表中的"未结账"改为"结账"。
3.代码:
'结账分为两部分
'一是将要准备结账的相关信息存入日结账单中,日结账单是结过的账
'二是先将相关表中的 "未结账"改为"结账"
Private Sub cmdsquareacounts_Click()
Dim txtsql As String
Dim Ctxtsql As String
Dim msgtext As String
Dim mrcS As ADODB.Recordset
Dim mrcC As ADODB.Recordset
Dim mrcL As ADODB.Recordset
Dim sumcash As Integer
Dim consumecash As Integer
Dim mrc As ADODB.Recordset
Dim precash As Integer
'先判断所有的内容是否为0,如果为0,则禁止结账
If Trim(txtcharge.Text) = "0" And Trim(txtsellcard.Text) = "0" And Trim(txtexitcard.Text) = "0" Then
MsgBox "操作员" & " " & Trim(Combouserid.Text) & "账目已全部结完!", vbOKOnly, "提示"
Exit Sub
End If
'结完账之后需要把当天的结账记录更新到日结账单,
'日结账单是需要每天进行更新的,了解每一天的状况。
'在写日结账单之前要先判断今天是否已经写过日结账单了,
'写过的话就直接在当前装态更新当天结账记录,
'没结过的话添加新记录
'日结账单中的计算
'上期充值卡余额=昨日日结账单的本期余额
'当日充值金额=今天充值表中已经结过账的所有钱
'当日消费金额=今天上机表中,所有学生上机消费的钱
'当日退款金额=今天退卡表中,已经结过账的退卡的钱
'本期充值卡金额= 注册金额+充值金额-退卡金额,即今天应该收的钱
'本期金额,我的理解是赚的钱,本期金额=注册卡+充值-退卡,这样老板就可以一眼看到今天的净利润。
'上期余额,可以理解成是昨天或前天最后的本期余额,也就是赚的钱。
'注册金额应该把注册的钱更新到charge表中,添加一条记录保存起来,
'recharge中的cash和student中的cash是不一样的,student是卡里的钱,
'recharge中的cash是每一次充值,或注册时的钱,没有累加在一起,这样会把每一个操作员的工作记录下来。
'因为cash的值会随上下机,充值等操作而改变
'计算注册总金额,从recharge表中找。
txtsql = "select sum(cash) from recharge_info where userid='" & Trim(Combouserid.Text) & "' and ischeck='" & "未结账" & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrcS = executesql(txtsql, msgtext)
If IsNull(mrcS.Fields(0)) Then
sumcash = 0
Else
sumcash = mrcS.Fields(0)
End If
'当日充值金额,从recharge_info 表中找,txtcharge.text
'当日消费金额,从line表中找
txtsql = "select sum(consume) from line_info where ondate='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrcL = executesql(txtsql, msgtext)
If IsNull(mrcL.Fields(0)) Then
consumecash = 0
Else
consumecash = mrcL.Fields(0)
End If
'当日退款金额,从cancel_card表中找,txtexitamount.text
更新日结账单,在这里我们需要注意的是日结账单中的一条记录显示的是当天所有操作员和管理员结账的总和。在结账的过程中我们应该把一个操作员或一个管理员作为一个对象,这个对象的本期金额就是他注册卡金额+充值卡金额-退卡金额,即他应该收的钱,这样每一个操作员应该收的钱加起来就构成了今天的本期金额。同样在往日结账单中更新记录的时候,需要分两种情况,如果今天结过账的话就直接在今天的基础上更新,没有结过的话再添加新的记录。
'将相应的记录存入到日结账单
'这里分两种情况,如果当天结过的话,就在当天的基础上更新,没有结过的话就添加新的结账记录
Ctxtsql = "select * from checkday_info where date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrcC = executesql(Ctxtsql, msgtext)
txtsql = "select * from checkday_info where date='" & Format(Date - 1, "yyyy-mm-dd") & "'"
Set mrc = executesql(txtsql, msgtext)
If mrc.RecordCount = 0 Then
precash = 0
Else
precash = mrc.Fields(4)
End If
'结过的话就直接在原基上更新,添加上次结过的,本期余额=注册+充值-退卡
If mrcC.EOF = False Then
'上期余额,可以理解为昨天赚的钱,日结就需要每天都结账,本期余额就是今天总共赚的钱
mrcC.Fields(0) = mrc.Fields(4) '上期余额
mrcC.Fields(1) = Val(txtcharge.Text) + mrcC.Fields(1) '当日充值金额
mrcC.Fields(2) = consumecash + mrcC.Fields(2) '当日消费金额
mrcC.Fields(3) = Val(txtexitamount.Text) + mrcC.Fields(3) '当日退卡金额
mrcC.Fields(4) = (sumcash + Val(txtcharge.Text) - Val(txtexitamount.Text)) '总金额
mrcC.Fields(5) = Date
mrcC.Update
mrcC.Close
mrcS.Close
mrcL.Close
mrc.Close
'没结过的话,添加新记录
Else
mrcC.AddNew
mrcC.Fields(0) = precash
mrcC.Fields(1) = Val(txtcharge.Text)
mrcC.Fields(2) = consumecash
mrcC.Fields(3) = Val(txtexitamount.Text)
mrcC.Fields(4) = sumcash + Val(txtcharge.Text) - Val(txtexitamount.Text)
mrcC.Fields(5) = Date
mrcC.Update
mrcC.Close
mrcS.Close
mrcL.Close
mrc.Close
End If
'将相关表中的“未结账”改为“结账”
'从student表看此操作员是否已经结账
txtsql = "select * from student_info where userid='" & Trim(Combouserid.Text) & "'and ischeck='" & "未结账" & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrc = executesql(txtsql, msgtext)
'将student,recharge,cancelcard表中的未结账改为结账
Do While Not mrc.EOF
mrc.Fields(11) = "结账"
mrc.Update
mrc.MoveNext
Loop
mrc.Close
'将recharge表中的未结账改为结账
txtsql = "select * from recharge_info where userid='" & Trim(Combouserid.Text) & "'and status='" & "未结账" & "'and date='" & Format(Date, "yyyy-mm-dd") & "' "
Set mrc = executesql(txtsql, msgtext)
Do While Not mrc.EOF
mrc.Fields(7) = "结账"
mrc.Update
mrc.MoveNext
Loop
mrc.Close
'cancelcard表
txtsql = "select * from cancelcard_info where userid='" & Trim(Combouserid.Text) & "'and status='" & "未结账" & "'and date='" & Format(Date, "yyyy-mm-dd") & "'"
Set mrc = executesql(txtsql, msgtext)
Do While Not mrc.EOF
mrc.Fields(6) = "结账"
mrc.Update
mrc.MoveNext
Loop
mrc.Close
MsgBox "结账成功!", vbOKOnly, "提示"
End Sub
【总结】
结账中理清楚应该怎么结账,这是重点,理解应收金额是什么意思,应该怎么计算,最后应该怎么更新到日结账单中,以及日结账单中的本期金额是干什么用的,这几点比较关键。
谢谢您的阅读
〜
〜
〜