在说周结账单和日结账单之前,得先做好结账的工作。在汇总里面,有个结账,其实这个结账的代码很简单,只是两个Update,值要把结账状态的标记改变一下就可以。这个结账好像平常都会有个老师负责收取充值的现金,也负责退卡的现金,在结他的账的时候,他要把手里的钱都上交。
周结账单和日结账单是对所有金额的汇总,包括学生的消费金额,而由于在上机时的消费金额是在下机时自动扣除的,所以,不涉及到现金的问题。但是,虽然这个金额不反应在结账里面,但是却反应在周结账单和日决诶账单里面。
'先判断所有内容是否都为0,如果都为0,那么,禁止结账
If (Trim(txtReturnCardNum.Caption) = "0" And Trim(txtRechargeRmb.Caption) = "0" And Trim(txtReturnRmb.Caption) = "0" And Trim(txtAllRmb.Caption) = "0") Then
MsgBox "操作员 " + " " + Trim$(cmbUserId.Text) + " 账目已全部结完!", vbOKOnly + vbInformation, "提示"
Exit Sub
Else '如果有信息
'将“未结账”的标记改为“已结账”的标记
SQL = "update TeaReturnCard set 结账状态='已结账' where 退卡教师='" & Trim(cmbUserId.Text) & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
SQL = "update TeaRechargeInfo set 结账状态='已结账' where 充值教师='" & Trim(cmbUserId.Text) & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
MsgBox "结账成功!", vbOKOnly + vbInformation, "提示"
End If
在计算日结账单时,我采取的方法是:在昨日账单的基础上结账。
'在窗体加载时,写日结账单表
'在写日结账单表之前,先判断今天是否已经写过日结账单表了
'如果写过日结账单表了,那么,就删除今天写过的那条,重写今天的日结账记录
'如果,没有,就不重写记录
'日结账单中的计算
'昨日充值卡中余额=读取昨天的日结账单的金额总和
'充值金额=今天充值表中所有的钱
'消费金额=今天学生上机表中,所有的消费金额相加
'退还金额=今天教师退卡表里面,已经(结过账)的退卡总金额
'金额总和=昨日卡中金额+充值金额-消费金额-退还金额
'日期时间是今天的日期时间
'判断今天是否已经结果账了
SQL = "select * from dayaccount where 日期='" & Format(GetSqlTime, "yyyy-mm-dd") & "'" '从日结账单表里选择今天的结账记录
Set Rst = ExecuteSQL(SQL, strMsg)
If Not (Rst.BOF And Rst.EOF) Then '今天已经结过账了,即,这不是今天第一次结账
'先删除今天结过的账单
SQL = "delete from dayaccount where 日期='" & Format(GetSqlTime, "yyyy-mm-dd") & "'"
Call ExecuteSQL(SQL, strMsg)
'然后根据昨天的结账记录重新结账
'此处因为今天已经结果账了,也可以不上去今天的结账记录,在今天的记录上重新计算,然后用update更新一下就行
End If
'计算昨日充值卡中的余额
'昨日充值卡中的余额=日结账单表中金额总和
SQL = "select sum(金额总和) from dayaccount where 日期='" & Format(GetSqlTime - 1, "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
If IsNull(Rst.Fields(0)) = True Then
YesDayRMB = 0
Else
YesDayRMB = Trim(Rst.Fields(0))
End If
'计算充值金额(充值金额是教师充值信息表里面,教师今天充值的金额,并且这些金额都已经结果账了,如果今天充值了某些金额,但是没有结账,则在计算日结账单时,不计入)
SQL = "select sum(充值金额) from tearechargeinfo where 日期='" & Format(GetSqlTime, "yyyy-mm-dd") & "' and 结账状态='已结账'"
Set Rst = ExecuteSQL(SQL, strMsg)
If IsNull(Rst.Fields(0)) = True Then
RechargeRmb = 0
Else
RechargeRmb = Trim(Rst.Fields(0)) '充值金额赋值
End If
'计算消费金额
SQL = "select sum(消费金额) from stushangji where 上机日期='" & Format(GetSqlTime, "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
If Rst.EOF And Rst.BOF Then
CostRMB = 0
Else
CostRMB = Trim(Rst.Fields(0))
End If
'计算退还金额
SQL = "select sum(退卡金额) from teareturncard where 退卡日期='" & Format(GetSqlTime, "yyyy-mm-dd") & "' and 结账状态='已结账'"
Set Rst = ExecuteSQL(SQL, strMsg)
If IsNull(Rst.Fields(0)) = True Then
RetRMB = 0
Else
RetRMB = Trim(Rst.Fields(0))
End If
'计算金额总和=昨日卡中金额+充值金额-消费金额-退还金额
AllRMB = YesDayRMB + RechargeRmb - CostRMB - RetRMB
'插入日结账单表
SQL = "insert into DayAccount values('" & YesDayRMB & "','" & RechargeRmb & "','" & CostRMB & "','" & RetRMB & "','" & AllRMB & "','" & Format(GetSqlTime, "yyyy-mm-dd") & "','" & Format(GetSqlTime, "hh-mm-ss") & "')"
Call ExecuteSQL(SQL, strMsg)
三,周结账单
周结账单是对从BeginTime到EndTime的金额的汇总,每次在需要周结账单时才插入,一旦不需要,就删除掉。可以说,周结账单是对这段是间的日结账单的汇总。
'每次都先删除周结账单里的数据,然后重新写入
SQL = "delete from weekaccount "
Call ExecuteSQL(SQL, strMsg)
'将日结账单里的内容汇总后,填入周结账单,周结账单只是一个临时的表,一旦本窗体写在,周结账单里的内容也随之被Delete
'上期充值卡余额=在begintime之前的充值卡的余额
'本期充值金额=从dayAccount中,得到的这段时间的充值金额
'本期消费金额=从dayAccount中,得出的这段时间的消费金额
'本期退款金额=从dayAccount中,得出的这时间的退款金额
'本期充值卡余额=上期充值卡余额+本期充值金额-本期消费金额-本期退款金额
'日期=今天
'计算上期充值卡余额
SQL = "select max(金额总和) from dayaccount where 日期 < '" & Format(CDate(DTpcBegin.Value), "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
Debug.Print SQL
If IsNull(Rst.Fields(0)) = True Then
BalanceRmb = 0
Else
BalanceRmb = Trim(Rst.Fields(0)) '上期充值卡余额
End If
'显示在文本框中
txtBalance.Text = Format(BalanceRmb, "Fixed")
'计算本期充值金额
SQL = "select sum(充值金额) from dayaccount where 日期 between '" & Format(CDate(DTpcBegin.Value), "yyyy-mm-dd") & "' and '" & Format(CDate(DTPcEnd.Value), "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
Debug.Print SQL
If IsNull(Rst.Fields(0)) = True Then
BenQiRechargeRmb = 0
Else
BenQiRechargeRmb = Trim(Rst.Fields(0))
End If
'计算本期消费金额
SQL = "select sum(消费金额) from dayaccount where 日期 between '" & Format(CDate(DTpcBegin.Value), "yyyy-mm-dd") & "' and '" & Format(CDate(DTPcEnd.Value), "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
Debug.Print SQL
If IsNull(Rst.Fields(0)) = True Then
BenQiCostRmb = 0
Else
BenQiCostRmb = Trim(Rst.Fields(0))
End If
'计算本期退款金额
SQL = "select sum(退还金额) from dayaccount where 日期 between '" & Format(CDate(DTpcBegin.Value), "yyyy-mm-dd") & "' and '" & Format(CDate(DTPcEnd.Value), "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
Debug.Print SQL
If IsNull(Rst.Fields(0)) = True Then
ReturnRmb = 0
Else
ReturnRmb = Trim(Rst.Fields(0))
End If
'计算本期充值卡余额
'BenQiCardRmb = BalanceRmb + BenQiRechargeRmb - BenQiCostRmb - ReturnRmb(在所有数据完整时没问题,但是数据如果不完整,就不行了,所以采取别的办法)
SQL = "select max(金额总和) from dayaccount where 日期 <= '" & Format(CDate(DTPcEnd.Value), "yyyy-mm-dd") & "'"
Set Rst = ExecuteSQL(SQL, strMsg)
If IsNull(Rst.Fields(0)) = True Then
BenQiCardRmb = 0
Else
BenQiCardRmb = Trim(Rst.Fields(0))
End If
'计算日期
DateToday = Format(GetSqlTime, "yyyy-mm-dd")
'插入到周结账单里面
SQL = "insert into weekaccount values('" & BalanceRmb & "','" & BenQiRechargeRmb & "','" & BenQiCostRmb & "','" & ReturnRmb & "','" & BenQiCardRmb & "','" & DateToday & "')"
Call ExecuteSQL(SQL, strMsg)
Call showReport '显示查询到的报表
Viewer.Refresh '刷新