机房收费系统 & 【优化】&【选中下机】

【上机窗体】

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.csdn.net/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

如果选中的几条数据在删除时只会自动删除第一条记录,请检查代码中的查询条件是否是数组中的卡号条件,并且进行循环检索,进行处理。

猜你喜欢

转载自blog.csdn.net/Ginny97/article/details/88599949