机房收费系统——选择下机

做完全部下机紧接着就是选择下机,这是一个难点,难在哪呢,请听牛哥分解

选择下机我想大家的第一反应就是通过循环将要进行下机的卡号识别并删除掉吧。但老让人家识别、删除、循环也不得劲哎,只能一条一条的删,它也会闲累的,而且我对高深的循环也不熟悉,所以就换了种方法——用容器。先看代码,该严肃了,一定得结合注释看

Rem: 对表格控件进行修改

Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    '获取选中不连续行的权限,及实现多行选中
    Dim col As Integer
    
    If MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 5) = "√" Then
        MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 5) = ""
        
    '改变行颜色(变为没选中之前的)
    For col = 0 To MSFlexGrid1.Cols - 1
        MSFlexGrid1.col = col
        MSFlexGrid1.CellBackColor = vbWhite
    Next col
    
    Else
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 5) = "√"
    '改变行颜色(选中后的颜色)
    For col = 0 To MSFlexGrid1.Cols - 1
        MSFlexGrid1.col = col
        MSFlexGrid1.CellBackColor = vbBlue
    Next col
    
    End If
End Sub


Rem: 选择下机按钮

Private Sub cmdsome_Click()
    '目标存储
    Dim sz(9999) As String '定义数组作为容器,存储选中的卡号
    Dim xh(9999) As String '用来存储选中卡号的行号
    '存储目标要用的存储
    Dim z As Integer '存储目标行用的变量,与数据库联系
    Dim i, j As Integer '表格的行列变量
    Dim s As Integer '存储目标行号用到的变量,与表格联系
     
    strSQL2 = "select * from basicdata_info " '链接basicdata表
    Set mrc2 = ExecuteSQL(strSQL2, msgstring)
    '上机表
    strSQL_online = "select * from online_info "
    Set mrc_online = ExecuteSQL(strSQL_online, msgstring)
    If mrc_online.EOF Then
        MsgBox "当前无上机人员!", , "提示"
    Else
        With MSFlexGrid1
        '筛选。记录选中下机的卡号,进行√标记,将目标存入数组,上机卡号唯一,可以唯一标识
        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
        '删除、更新。通过z连接数据库尽心循环检索处理
        
        For z = 0 To i - 1
            txtsql_line = "select * from line_info where cardno='" & sz(z) & "'and status='正常上机'"
            Set mrc_line = ExecuteSQL(txtsql_line, msgstring)
            MDImain.cmdxiaji.Enabled = True
            'line表时间补全
            Do While mrc_line.EOF = False
                mrc_line.Fields(8) = Date
                mrc_line.Fields(9) = Time$
                mrc_line.Fields(13) = "正常下机"
                mrc_line.Fields(14) = Trim(VBA.Environ("computername"))

                costdate = DateDiff("n", mrc_line.Fields(6), mrc_line.Fields(8))
                costtime = DateDiff("n", mrc_line.Fields(7), mrc_line.Fields(9))
                mrc_line.Fields(10) = (Val(costdate) + Val(costtime)) + 1
                
                If mrc_online.Fields(1) = "固定用户" Then
                    mrc_line.Fields(11) = Format(mrc_line.Fields(10) / mrc2.Fields(2) * mrc2.Fields(0), "0.00")
                Else
                    mrc_line.Fields(11) = Format(mrc_line.Fields(10) / mrc2.Fields(2) * mrc2.Fields(1), "0.00")
                    mrc_line.Fields(12) = mrc_line.Fields(12) - mrc_line.Fields(11)
                End If
                mrc_line.MoveNext
            Loop
            '更新表online_info
            txtsql_online = "delete online_info where cardno='" & sz(z) & "'"
            Set mrc = ExecuteSQL(txtsql_online, msgstring)
        Next z
        '更新表格
        For s = 0 To i - 1
            .RemoveItem xh(s)
        Next s
            '主窗体在上机人数更新
        Call updatenum
        MsgBox "操作完成!", , "提示"
        End With
    End If
End Sub

思路:

筛选全部上机卡号中的要下机卡号进行标记,将标记的数据放入容器——这样容器中装的就是所有要下机的卡号了,直接对容器清空就OK了。我之前试过用表格做容器,但失败了,原因是两个表格交集部分一模一样,无法区分,导致和数据库关联不好,有兴趣的同学可以改进。在这我用的数组做容器。

第一步是让表格可以进行多选和标记,第二步是将标记的记录用个小循环放入容器,第三部查询卡号等于容器里卡号的记录,第四步就该用循环将信息补全并删除了(这和全部下机思路就一样了),一定要在最后在删除相关数据库数据,因为如果先删了后,要用删掉的数据的话会报错信息已删除,查不到。最后对相关位置进行更新就行了。

到这还没完呢,sorry。当你对最后一个上机卡号进行选择下机时可能会报错,但检测数据库部分已经没什么问题了。在这里给大家一个小建议:降低一下视觉效果,把表格的固定行改为0看看ok不ok。

难点:

和全部下机那一样的补全信息代码所在位置出一点偏差就会报错

定义的i、j、z等是有意义的,不清楚它们的特殊含义就会很懵

将整体代码按你想要的过程分开做,分步思考,不然很容易处于被动地位

容器这种思想也是归类的一个具体应用,不易理解

 

你可能感兴趣的:(机房收费系统)