小编今天敲收取金额窗体,有一个纠结之处,询问许久,发现好多小伙伴都没有想到这一点,特此分享与大家,互相学习,不分对错,只是思维方式不同而已。
首先,从字面意思上看,收取金额查询是什么意思? 是不是一段时间内所收取的金额,在该时间段内用户给上机卡充值所交的费用是管理员所收取的费用,那么,在该段时间内用户来办理新卡时往卡里充值的钱算不算管理员收取的金额呢?
问题就出现在这里,小伙伴们只想到用户来充值的钱是所收取的钱,但是忽略的用户来办理新卡时也要给卡里充钱,这时候也是要交钱的,当然也算是收取的金额啦,也应该查询到的。
那么,我们应该怎么查询到这部分钱呢?咱们大家在敲注册窗体时,把充值的钱都更新到了student表中的cash列,但是student表中的cash不仅仅是充值的钱数,还涉及到后续的充值,上机下机等涉及到钱的地方都会更新student表中的cash,也就是说cash是卡的余额,而不是单指注册金额,所以问题就来了,我们要怎么查询到我们注册时候的钱?
小编在这里的解决方法是:在注册卡号时不仅仅更新student表,还要更新recharge表,并且给数据库中recharge表中添加一列,列名为注册金额并且可以为空(充值卡时此列为空)
这样,我们在计算收取金额时,只需要把注册金额和充值金额都设置在表格中显示出来即可!
下面是小编注册窗体的设计流程图:
收取金额查询流程图:
部分代码分享:
【注册窗体】1.存盘代码:
'判断是否输入卡号
If Not Testtxt(txtcardno.Text) Then
MsgBox "请输入卡号!", 0 + 48, "警告"
txtcardno.SetFocus
Exit Sub
End If
'或者代码是:判断是否为空
'If Trim(txtcardno.Text) = "" Then
' MsgBox "卡号不能为空!", 0 + 48, "警告"
' txtcardno.SetFocus
' Exit Sub
' End If
'判断输入卡号是否是数字
If Not IsNumeric(Trim(txtcardno.Text)) Then
MsgBox "卡号请输入数字!", 0 + 48, "警告"
txtcardno.Text = ""
txtcardno.SetFocus
Exit Sub
End If
'其他判空,略
'判断是否有重复记录——student表
txtsql = "select * from student_info where cardno='" & Trim(txtcardno.Text) & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF = False Then
MsgBox "此卡号已经存在,您可查询余额!", 0 + 48, "警告"
txtcardno.SetFocus
Exit Sub
Else
'判断充值金额是否小于最低金额充值,连接basicdata_info表
txtsqlBa = "select * from basicdata_info"
Set mrcBa = ExecuteSQL(txtsqlBa, msgtextBa)
If Val(txtRecharge.Text) < Val(mrcBa.Fields(5)) Then '必须是数值型比较
MsgBox "金额不可小于最低余额充值,请重新输入!", 48, "警告"
txtRecharge.Text = ""
txtRecharge.SetFocus
Exit Sub
End If
'添加记录——student表
mrc.AddNew
'给每个字段赋值
mrc.Fields(0) = Trim(txtcardno.Text)
mrc.Fields(1) = Trim(txtstudentNo.Text)
mrc.Fields(2) = Trim(txtstudentName.Text)
mrc.Fields(3) = Trim(Combosex.Text)
mrc.Fields(4) = Trim(txtdepartment.Text)
mrc.Fields(5) = Trim(txtgrade.Text)
mrc.Fields(6) = Trim(txtclass.Text)
mrc.Fields(7) = Trim(txtRecharge.Text)
mrc.Fields(8) = Trim(Txtexplain.Text)
mrc.Fields(9) = username
mrc.Fields(10) = Trim(Combostatus.Text)
mrc.Fields(11) = "未结账"
mrc.Fields(12) = Date
mrc.Fields(13) = Time
mrc.Fields(14) = Trim(Combotype.Text)
mrc.Update
' '更新recharge表
txtSQLRe = "select * from recharge_info where cardno='" & Trim(txtcardno.Text) & "'"
Set mrcRe = ExecuteSQL(txtSQLRe, msgtextRe)
mrcRe.AddNew '注册信息添加到recharge表中
mrcRe.Fields(1) = Trim(txtstudentNo.Text)
mrcRe.Fields(2) = Trim(txtcardno.Text)
mrcRe.Fields(4) = Date
mrcRe.Fields(5) = Time
mrcRe.Fields(6) = username
mrcRe.Fields(7) = mrc.Fields(11) 'recharge表中是status是student表中的ischeck列
mrcRe.Fields(8) = Trim(txtRecharge) '注册卡时充值的金额
mrcRe.Update
mrc.Close
mrcRe.Close
MsgBox "存盘成功!", 0 + 48, "提示"
End If
End Sub
【收取金额查询窗体】部分代码:
'以日期为查询条件,大于等于开始时间,小于等于终止时间——recharge表
txtsqlRe = "select * from recharge_info where date >='" & begindate.Value & "' and date <= '" & enddate.Value & "'"
Set mrcRe = ExecuteSQL(txtsqlRe, msgtextRe)
If begindate > enddate Then
MsgBox "起始日期大于终止日期", 0 + 48, "提示"
Exit Sub
Else
If mrcRe.EOF = True Then '数据集无数据为真
MsgBox "该时间段无数据", 0 + 48, "温馨提示"
Exit Sub
End If
End If
'将查询内容显示在表格控件中
With MyFlexGrid
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "充值金额"
.TextMatrix(0, 2) = "注册金额"
.TextMatrix(0, 3) = "充值日期"
.TextMatrix(0, 4) = "充值时间"
.TextMatrix(0, 5) = "充值教师"
.TextMatrix(0, 6) = "结账状态"
'显示查询数据
Do While Not mrcRe.EOF
.Rows = .Rows + 1
.TextMatrix(.Rows - 1, 0) = Trim(mrcRe.Fields(2))
.TextMatrix(.Rows - 1, 1) = Trim(mrcRe.Fields(3)) & " " '充值金额
.TextMatrix(.Rows - 1, 2) = Trim(mrcRe.Fields(8)) & " " '注册金额
.TextMatrix(.Rows - 1, 3) = Trim(mrcRe.Fields(4))
.TextMatrix(.Rows - 1, 4) = Trim(mrcRe.Fields(5))
.TextMatrix(.Rows - 1, 5) = Trim(mrcRe.Fields(6))
.TextMatrix(.Rows - 1, 6) = Trim(mrcRe.Fields(7))
'移动到下一条记录
mrcRe.MoveNext
Loop
End With
理论知识分享:
1.【注册窗体】全部清空问题:
最简单的方法:
Private Sub cmdempty_Click() '最简单的方法一
txtcardno.Text = ""
txtRecharge.Text = "'"
txtstudentNo.Text = ""
txtstudentName.Text = ""
Combosex.Text = " "
txtdepartment.Text = ""
txtgrade.Text = ""
txtclass.Text = ""
Combostatus.Text = ""
Combotype.Text = ""
Txtexplain.Text = ""
End Sub
方法二:
Private Sub cmdempty_Click()
Dim ct1 As Control '定义一个变量,把任何控件装载到里面
'删除所有text文本框内容
For Each ct1 In Controls
If TypeOf ct1 Is TextBox Then ct1.Text = ""
Next ct1
'删除所有combobox文本框内容
For Each ct1 In Controls
If TypeOf ct1 Is ComboBox Then ct1.Text = ""
Next ct1
End Sub
代码解释:
(1)、Visual Basic提供Control类作为控件的一般变量类型。当声明一个变量为As Control,就可以将任何控件引用赋给该变量
(2)、TypeOf (objectname) Is (objecttype )形式表达式。其中的 objectname是任何对象的引用,而objecttype 则是任何有效的对象类型。如果 objectnam是 objecttype所指定的一种对象类型,则表达式为True,否则为False。
2.用了很多次MSFlexGrid控件,却没有好好研究一下该控件的属性,每次编写代码时都有诸多疑惑,特此研究,发现咱们优秀的师哥师姐已经做了很好的总结,推荐给大家。
https://blog.csdn.net/q290994/article/details/52771793
CellAlignment属性:
该属性返回或设置的数值确定了一个单元格或被选定的多个单元格所在区域的水平和垂直对齐方式。该属性在设计时(这一期间是指在开发环境中,通过增加控件、设置控件或窗体属性等方式建造一个应用程序。相反,在运行时,程序员像用户那样与应用程序进行人机交互。)是不可使用的。
我们平时写的 CellAlignment=4是单元格的内容居中,居中对齐。