前言:前面的文章提过,机房收费系统的三大重点:组合查询、上下机和结账,那么今天的文章就迎来了三难点的最后一位:结账。
结账的功能就是对一天内流入的金额与流出的金额进行相减(当然实际过程要比这复杂得多,后面我会详细讲解),所剩余的就是这段时间内的收入。我所设计系统的逻辑是:点击相应操作员后,在“结账”栏目中出现各种数据,如充值金额、上机收费金额、上期余额、退卡金额…点击结账后,各项数据被放入到日结账表中,完成结账。若今天重复结账,则以最新的一次覆盖上一次,但不会覆盖其他日期的数据。
其中略微复杂的就是对收费合计的计算。计算公式:今日充值+今日消费-今日退卡
流程图:
代码部分:
Option Explicit
Dim mru As ADODB.Recordset
Dim mrcs As ADODB.Recordset
Dim mrcsb As ADODB.Recordset
Dim mrcc As ADODB.Recordset
Dim mrcc1 As ADODB.Recordset
Dim mrcr As ADODB.Recordset
Dim mrcd As ADODB.Recordset
Dim mrcsum As ADODB.Recordset
Dim mrcst As ADODB.Recordset
Dim mrbd As ADODB.Recordset
Dim txtSQL$
Dim MsgText$
Private Sub comboUserName_Click()
txtSQL = "select * from user_info where userid='" & Trim(comboUserName.Text) & "'"
Set mru = ExecuteSQL(txtSQL, MsgText)
'点击时txtUserName随着comboUserName变化
txtUserName.Text = mru!UserName
'计算购卡张数
txtSQL = "select * from student_info where userid='" & Trim(comboUserName.Text) & "' and ischeck='" & "未结账" & "' and date='" & Date & "'"
Set mrcs = ExecuteSQL(txtSQL, MsgText)
If mrcs.EOF Then
txtBuyCard.Text = 0
Else
txtBuyCard.Text = mrcs.RecordCount
End If
'计算上期余额
txtSQL = "select allcash from checkday_info where date='" & Date - 1 & "'"
Set mrcc1 = ExecuteSQL(txtSQL, MsgText)
If mrcc1.EOF Then
txtYesCash.Text = 0
Else
txtYesCash.Text = mrcc1.Fields(0)
End If
'计算退卡张数
txtSQL = "select * from cancelcard_info where userid='" & Trim(comboUserName.Text) & "' and status='" & "未结账" & "' and date='" & Date & "'"
Set mrcc = ExecuteSQL(txtSQL, MsgText)
If mrcc.EOF Then
txtCancelCard.Text = 0
Else
txtCancelCard.Text = mrcc.RecordCount
End If
'计算充值余额
txtSQL = "select sum(addmoney) from recharge_info where userid='" & Trim(comboUserName.Text) & "' and status='" & "未结账" & "' and date='" & Date & "'"
Set mrcr = ExecuteSQL(txtSQL, MsgText)
If IsNull(mrcr.fields(0)) Then
txtRechargeCash.Text = 0
Else
txtRechargeCash.Text = mrcr.Fields(0)
End If
'计算退卡余额
txtSQL = "select sum(cancelcash) from cancelcard_info where userid='" & Trim(comboUserName.Text) & "' and status='" & "未结账" & "' and date='" & Date & "'"
Set mrcc1 = ExecuteSQL(txtSQL, MsgText)
If IsNull(mrcc1.fields(0)) Then
txtCancelCardCash.Text = 0
Else
txtCancelCardCash.Text = mrcc1.Fields(0)
End If
'计算总卡数
txtSumBuyCard.Text = Val(txtBuyCard.Text) - Val(txtCancelCard.Text)
txtSQL = "select * from basicdata_info "
Set mrbd = ExecuteSQL(txtSQL, MsgText)
'计算用户上机计时收费
txtSQL = "select sum(consume) as sum_info from line_info where ondate='" & Date & "'"
Set mrcst = ExecuteSQL(txtSQL, MsgText)
If mrcst.Fields(0) = Null Then
txtUnTmpCash.Text = 0
Else
txtUnTmpCash.Text = mrcst.Fields(0)
End If
'计算应收费
txtEarnCash.Text = Val(txtUnTmpCash.Text) + Val(txtRechargeCash.Text) - Val(txtCancelCardCash.Text)
'购卡
txtSQL = "select * from student_info where userid='" & Trim(comboUserName.Text) & "'"
Set mrcs = ExecuteSQL(txtSQL, MsgText)
With MSHFlexGrid1
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "日期"
.TextMatrix(0, 3) = "时间"
Do While Not mrcs.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(mrcs!cardno)
.TextMatrix(.Rows - 1, 1) = Trim(mrcs!studentno)
.TextMatrix(.Rows - 1, 2) = Trim(mrcs!Date)
.TextMatrix(.Rows - 1, 3) = Trim(mrcs!Time) mrcs.MoveNext
Loop
End With
'充值
txtSQL = "select * from recharge_info where userid='" & Trim(comboUserName.Text) & "'"
Set mrcr = ExecuteSQL(txtSQL, MsgText)
With MSHFlexGrid2
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "充值金额"
.TextMatrix(0, 3) = "日期"
.TextMatrix(0, 4) = "时间"
Do While Not mrcr.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(mrcr!cardno)
.TextMatrix(.Rows - 1, 1) = Trim(mrcr!studentno)
.TextMatrix(.Rows - 1, 2) = Trim(mrcr!addmoney)
.TextMatrix(.Rows - 1, 3) = Trim(mrcr!Date)
.TextMatrix(.Rows - 1, 4) = Trim(mrcr!Time) mrcr.MoveNext
Loop
End With
'退卡
txtSQL = "select * from cancelcard_info where userid='" & Trim(comboUserName.Text) & "'"
Set mrcc = ExecuteSQL(txtSQL, MsgText)
With MSHFlexGrid3
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "退还金额"
.TextMatrix(0, 3) = "日期"
.TextMatrix(0, 4) = "时间"
Do While Not mrcc.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(mrcc!cardno)
.TextMatrix(.Rows - 1, 1) = Trim(mrcc!studentno)
.TextMatrix(.Rows - 1, 2) = Trim(mrcc!cancelcash)
.TextMatrix(.Rows - 1, 3) = Trim(mrcc!Date)
.TextMatrix(.Rows - 1, 4) = Trim(mrcc!Time) mrcc.MoveNext
Loop
End With
'临时用户
txtSQL = "select * from student_info where userid='" & Trim(comboUserName.Text) & "' and type='" & "临时用户" & "'"
Set mrcs = ExecuteSQL(txtSQL, MsgText)
With MSHFlexGrid4
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "学号"
.TextMatrix(0, 2) = "日期"
.TextMatrix(0, 3) = "时间"
Do While Not mrcs.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = Trim(mrcs!cardno)
.TextMatrix(.Rows - 1, 1) = Trim(mrcs!studentno)
.TextMatrix(.Rows - 1, 2) = Trim(mrcs!Date)
.TextMatrix(.Rows - 1, 3) = Trim(mrcs!Time) mrcs.MoveNext
Loop
End With
End Sub
Private Sub cmdFinCash_Click()
Dim mrcd1 As ADODB.Recordset
If comboUserName.Text = "" Then
Label12.Caption = "请选择用户!"
comboUserName.SetFocus
Exit Sub
End If
'将统计的数据放入日结账单表中
txtSQL = "select * from checkday_info where date='" & Date & "'"
Set mrcd = ExecuteSQL(txtSQL, MsgText)
'若有重复记录,覆盖添加新的记录
If mrcd.EOF = False Then
With mrcd
!remaincash = Trim(txtYesCash.Text)
!rechargecash = Trim(txtRechargeCash.Text)
!consumecash = txtUnTmpCash.Text
!cancelcash = Trim(txtCancelCardCash.Text)
!allcash = Trim(txtEarnCash.Text)
!Date = Date
End With
mrcd.Update
'如果没结过账就添加新记录
Else
txtSQL = "select * from checkday_info "
Set mrcd1 = ExecuteSQL(txtSQL, MsgText)
mrcd.AddNew
mrcd!remaincash = Trim(txtYesCash.Text)
mrcd!rechargecash = Trim(txtRechargeCash.Text)
mrcd!consumecash = Trim(txtUnTmpCash.Text)
mrcd!cancelcash = Trim(txtCancelCardCash.Text)
mrcd!allcash = Trim(txtEarnCash.Text)
mrcd!Date = Date
mrcd.Update
mrcd.Close End If MsgBox "结账完成!"
Unload MeEnd SubPrivate Sub Form_Activate()
Dim str As String
txtSQL = "select * from user_info"
Set mru = ExecuteSQL(txtSQL, MsgText)
'判断表内是否有记录
If mru.EOF Then
MsgBox "没有记录了,是否前往添加?", vbOKCancel, "提示"
'若选择是
If str$ = vbOK Then
frmAddUser.Show
frmFinCas.Hide
Else
Exit Sub
Unload Me
End If
End If
End Sub
Private Sub Form_Load()
Label3.ForeColor = vbRed
txtUserName.Enabled = False
Dim i As Integer
txtSQL = "select * from user_info "
Set mru = ExecuteSQL(txtSQL, MsgText)
'显示表内所有用户
For i = 1 To mru.RecordCount
comboUserName.AddItem mru!UserID
mru.MoveNext
Next i
mru.Close
End Sub
PS:在结账部分中,有一个很重要的步骤:即对退卡金额、充值金额的计算。该部分的计算与判断空值需要涉及两个较重要的SQL语法:SUM()与IsNull()。前者功能为将该列中数据的加和;而后者则是用于判断是否有空值。在之后的优化部分,我会对这两方面做出详细讲解。
结语:三大困难都已经解决,可以做第一遍验收了