【上机窗体】
1.设置label控件显示的背景色为透明:
(1)属性设置:BackStyle属性:
BackStyle = 0 '设置控件背景透明
BackStyle = 1 '设置控件背景不透明
(2)代码设置:与设置清空所有的文本框方法一样!
Dim ctl As Control '定义一个变量,把任何控件装载到里面
'把所有Label控件的背景属性都设置为0-transparent
For Each ctl In Me.Controls
If TypeOf ctl Is Label Then ctl.BackStyle = 0
Next ctl
End Sub
2.上机日期与下机日期的格式不统一:
如图:上机日期显示的格式为yyyy-mm–dd
下机日期显示的格式为:yyyy/mm/dd
查询代码发现:
上机日期显示的是online 表中的ondate,而下机日期显示的是电脑当前的时间,由于online表中的数据格式是yyyy-mm–dd,当前电脑时间的格式是yyyy/mm/dd,所以读取的数据格式不同。
解决方法:
使用关于时间的Format函数:用于制定字符串或数字的输出格式,根据格式表达式来格式化数据。
更多的关于format函数与时间设置问题请看小编博客:
https://blog.youkuaiyun.com/Ginny97/article/details/86667770
对于上机窗体,后续优化界面,将不需要输入的文本框Text换成Label控件,并且将其背景设置为透明,界面会更好看呦。
【选中学生下机】——循环检索处理
'定义变量和数组
Dim txtsql As String
Dim txtSQLStu As String
Dim msgtext As String
Dim mrcon As ADODB.Recordset
Dim mrcBa As ADODB.Recordset
Dim mrcline As ADODB.Recordset
Dim mrcStu As ADODB.Recordset
'目标存储
Dim sz(999) As String '定义数组作为容器,存储选中的卡号
Dim xh(999) As String '用来存储选中卡号的行号
'存储目标要用的存储
Dim z As Integer '存储目标行用的变量,与数据库联系
Dim j, i As Integer '表格的行列变量
Dim s As Integer '存储目标行号用到的变量,与表格联系
MyFlexGrid.SelectionMode = flexSelectionByRow '单击的时候选择的是整行
MyFlexGrid.FocusRect = flexFocusNone '在当前单元的周围画一个焦点框
MyFlexGrid.HighLight = flexHighlightWithFocus '该值决定了所选定的单元是否突出显示
'进行查询——标记:连接online表
txtsql = "select * from online_info"
Set mrcon = ExecuteSQL(txtsql, msgtext)
If mrcon.EOF = True Then
MsgBox "当前无人上机!", , "提示"
Else
'判断最后一列是否为*,若不是,该行未被选中
If MyFlexGrid.TextMatrix(MyFlexGrid.RowSel, 5) <> "*" Then
MsgBox "请先选择数据,再进行修改!", 0 + 48
Else
If MyFlexGrid.TextMatrix(MyFlexGrid.RowSel, 5) = "*" Then
With MyFlexGrid
'记录选中下机的卡号,将带有*的卡号和行号存入数组,上机卡号唯一,可以唯一标识
i = 0
For j = 1 To .Rows - 1
If .TextMatrix(j, 5) = "*" Then
sz(i) = .TextMatrix(j, 0) '存卡号
xh(i) = Val(j) '存行号
i = i + 1
End If
Next j
重点是把标记的所有行数据进行删除——查询条件为数组(sz(z))中记录的卡号,循环检索进行处理。
'删除、更新,通过z连接数据库进行循环检索处理
For z = 0 To i - 1 '从数组下标为0开始查询,查到 i-1 ,也就是第一个选中的卡号下标为0
txtsql = "select * from line_info where cardno='" & sz(z) & "'and status='正常上机'"
Set mrcline = ExecuteSQL(txtsql, msgtext)
'全部下机——计算时间,消费金额
'计算消费时间:
spendtime = DateDiff("n", mrcline!OnTime, Time) '当前时间-上机时间
spenddate = DateDiff("n", mrcline!ondate, Date) '当前日期-上机日期
spendalltime = Val(spendtime) + Val(spenddate) '总时间
'计算消费金额——先考虑上机的所有卡号是否都满足>准备时间,<=准备时间不收钱
txtsql = "select * from basicdata_info"
Set mrcBa = ExecuteSQL(txtsql, msgtext)
txtsql = "select * from online_info"
Set mrcon = ExecuteSQL(txtsql, msgtext)
If spendalltime <= Val(mrcBa.Fields(4)) Then
consume = "0" '消费金额为0
Else
If mrcon.Fields(1) = "固定用户" Then '消费金额计算 按分钟算
consume = Round(Val((spendalltime / mrcBa.Fields(2)) * mrcBa.Fields(0))) '消费金额=(消费时间/60分钟)* 每小时费用
'round函数:返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果
Else
consume = Round(Val((spendalltime / mrcBa.Fields(2)) * mrcBa.Fields(1))) '消费金额=(消费时间/60分钟)* 每小时费用
End If
End If
' 连接student表——计算余额
'txtSQLStu = "select * from student_info,online_info where student_info.cardno=online_info.cardno"
txtSQLStu = "select * from student_info where cardno='" & sz(z) & "'"
Set mrcStu = ExecuteSQL(txtSQLStu, msgtext)
mrcStu.Fields(7) = mrcStu.Fields(7) - consume '余额=当前余额-消费金额
mrcStu.Update
'更新line表
txtsql = "select * from line_info where cardno='" & sz(z) & "'and status='正常上机'"
Set mrcline = ExecuteSQL(txtsql, msgtext)
frmMain.cmddownline.Enabled = True
Do While mrcline.EOF = False
mrcline.Fields(8) = Date
mrcline.Fields(9) = Time
mrcline.Fields(13) = "正常下机"
mrcline.Fields(14) = VBA.Environ("computername")
mrcline.MoveNext
Loop
'更新online表
txtsql = "select * from online_info where cardno='" & sz(z) & "'"
Set mrcon = ExecuteSQL(txtsql, msgtext)
mrcon.Delete
Next z
'更新表格
For s = 0 To i - 1
.RemoveItem xh(s)
Next s
如果选中的几条数据在删除时只会自动删除第一条记录,请检查代码中的查询条件是否是数组中的卡号条件,并且进行循环检索,进行处理。
其他一些小的问题,相信大家都可以自行解决,小编这里只做简要总结,不做详细赘述咯—
菜单编辑器 | 窗体 | 优化 |
登录 | 登录 (frmLogin) | 登录时判断登录用户级别,一般用户登录时隐藏操作员和管理员,操作员登录时隐藏管理员,管理员权限最高,全部显示出来 |
一般用户 | 根据实际,一般用户应该是学生,学生自己刷卡上下机,一般用户若为学生,则其下边的有些窗体权限应该移到操作员下,如:选中/所有学生下机等窗体 | |
修改密码(frmchangepassword) | (1)显示当前登录用户,修改本用户的密码,避免多用户误改对方密码问题 (2)可以向某些软件一样,设置密码可视化按钮,方便用户看见自己的密码 | |
操作员 | 注册(frmRegister) | 既有“充值金额”,又有“金额”,两者重复,删除一个 |
“状态”只有“使用”一种,不用下拉文本,也不用界面显示,代码中实现输入数据库即可。 | ||
注册的充值金额可以设置上限和下限 | ||
查找按钮可以将此卡号直接赋值给跳转到查询界面,方便查询此卡信息 | ||
可以设置点击卡号,会清空所有内容,方便注册新的卡(不过有清空按钮,可以不这样设置) | ||
充值(frmRecharge) | style="width:446px;" 同理(1)充值金额设置上下限; (2)可以设置点击卡号清空,方便下一个卡的充值 | |
退卡(frmOutcard) | (1)同理,清空问题。 (2)判断条件:未结账的不可退卡 | |
收取金额查询(frmAskcollectcash) | 开始日期 < 结束日期 | |
金额返还信息查询(FrmAskoutcash) | ||
学生基本信息维护(frmMaintainstudentdata) | (1)代码复杂,可以选择使用数组
(2)窗体内当字段名为日期时,最好用日期控件DTPicker显示日期
| |
学生上机统计信息(frmonlinecount) | ||
操作员工作记录(frmOpewordrecord) | ||
管理员 | 结账(frmOverbill) | 考虑结完账之后若无新数据,则不可再结账 |
删除和添加用户(rmDelandAdduser) | 考虑同时选中多个用户删除(与选中下机一样) | |
基本数据设定(frmSetBasicData) | (1)考虑“递增单位时间”为一小时,固定,不可修改 (2)修改数据均为数字。若并未修改任何数据,则提示未修改 | |
日结账单(frmDailybill) | 同一天结账的数据为更新数据到checkday ,日结账单显示的为一条数据 | |
周结账单(frmWeeklybill) | 数据库中的checkweek表中同一天的数据为更新数据,只能有一条,不可重复添加同一天的数据 |