机房收费整体思路

来源:互联网 发布:win 2008 如何打开端口 编辑:程序博客网 时间:2024/04/19 12:54

实话说这个系统直到敲了一大半才有点明白了,不过也走了很多的弯路,现在就把现在稍好一点的思路拿出来跟大家分享一下。

记得原先以为师傅说过当你不知道从哪里入手的时候,就随便找一个自己拿手的着手点,把简单的一点点的实现,稍微复杂的功能的思路也越来越清晰,这样既不浪费太多的时间梳理思路,也能让自己的学习进度不是那么慢。下面是我对里面的一些过程的自己的一点看法,希望大家发现问题积极提出。

一、主窗体的菜单设置

这个问题不是新问题,编辑菜单我们已经遇到过很多次了,但是这次是自己设计菜单,怎样设计菜单是我们知得研究的问题。

注意:1、首先分析这个菜单的功能,每个菜单的区别于联系

        2、利用好英文缩写,实在不行拼音也行(不建议)最好让别人也能看懂

         专业解答:[作用范围域前缀] + [前缀] + 基本类型 + 变量名

         其中前缀是可选项,以小写字母表示 

基本类型是必选项,以小写字母表示 
变量名是必选项,可多个单词(或缩写)合在一起,每个单词首字母大写

机房举例:主窗体上菜单名称就可以设置为:mnu_admin_**

优点:1、方便阅读和调用

     2、在修改和完善功能的时候更加节省时间

延伸:窗体、菜单、控件、函数等都可以参考这种命名来提高效率

二、功能与数据库的分析

仔细研究了一下这个机房收费系统,里面除了帮助菜单没有用到数据库其余都有数据库的调用,所以分析好每一个功能所用到的表是值得我们下功夫研究的。

分析方法:要从头开始分析,从登录窗体到点击关闭按钮都要认真的查看这个功能会用到那个表,用到哪个字段,这样也有利于数据库的设计

红利:

登录窗体:user_info,onwork_info,worklog_info

学生查看余额:student_info

学生查看上机记录:line_info

学生充值记录查询:recharge_info

学生上机状态查看:student_info,basicdata_info,online_info,line_info

修改密码:user_info

注册:student_info

充值:recharge_info,student_info

退卡:cancelcard_info,student_info

收取金额查询:recharge_info

金额返还信息查询:cancelcard_info

学生基本信息维护:student_info

学生上机统计信息查询:line_info

操作员工作记录:worklog_info

结账:user_info,student_info,recharge_info,cancelcard_info

删除添加用户:user_info

基本数据设定:basicdate_info

正在值班的教师:onwork_info

日结账单:checkday_info

周结账单:checkweek_info

上机:student_info ,basicdate_info,line_info,online_info

下机:student_info,basicdate_info,online_info,line_info

三、功能与逻辑

每个功能都对应着一种逻辑关系,理清楚每个功能的逻辑才能更好的去用代码实现功能表达想法。

红利:

最简单的逻辑(直接调用数据库中某个表或已知某个字段的值调用表的某一条记录将其显示在窗体上,或将记录更新到数据库里):

例如:学生查看余额,学生查看上机记录,学生充值记录查询,上机状态查看,密码修改,注册,充值,退卡,收取金额查询,金额返还信息查询,添加删除用    户,基本信息设定,正在值班教师,结账。(百分之八十的都是简单的逻辑类型)

上机逻辑:判断是否输入卡号——>卡号是否为空——>卡号是否注册——>卡号是否正在使用——>卡里的余额是否充足——>更新数据库——>上机成功

下机逻辑:输入卡号——>是否为空——>是否注册——>是否上机——>计算上机时间——>判断用户类型确定单位时间的金钱——>计算金钱——>修改记录——>下机

组合查询逻辑:确定bombobox与textbox在点击查询之前不为空——>简单的数据库调用——>把查询到的内容直接添加到msflexgrid控件上

例如:学生基本信息维护,学生上机统计信息查询,操作员工作记录

报表逻辑:这个逻辑比较简单,主要是学习报表的设计调用。刷新主要是报表参数与vb的交互的学习。

温馨提示:逻辑功能相同的窗体,可以着重研究一个,把代码尽量优化,完成这个之后别的都是复制修改代码的体力劳动了。

四、功能与代码

下面的功能主要与上面的逻辑对应

逻辑一:

txtsql = "select * from XX_info where XX='" & Trim(XX.Text) & "'"   '调用你所需要的表
Set mrc = executesql(txtsql, msgtext) '执行sql语句,把执行结果赋值给mrc    If mrc.EOF Then '没有你想要的信息时        MsgBox "提示信息!", vbOKOnly + vbExclamation, "提示"        Exit Sub    Else        xx.xx = mrc.Fields(n) '把所查询到的数据对应的字段赋值给某个控件        mrc.Delete '删除你所查询到的数据        mrc.AddNew '更新你窗体上的数据到数据库        mrc.Fields(x) = xx.xx        mrc.Update    End If
上机逻辑:

'上机先判断是为空号,是否注册,是否符合上机条件—余额充足Private Sub cmdsj_Click()    Dim mrc As ADODB.Recordset    Dim txtsql As String    Dim msgtext As String    Dim txtsql1 As String    Dim mrc1 As ADODB.Recordset    Dim txtsql2 As String    Dim mrc2 As ADODB.Recordset    Dim txtsql3 As String    Dim mrc3 As ADODB.Recordset        If Not testtxt(txtcardno.Text) Then '防止输入框为空        MsgBox "卡号为空!", vbOKOnly + vbExclamation, "警告"        txtcardno.SetFocus        Exit Sub    End If         If Not IsNumeric(Trim(txtcardno.Text)) Then '防止输入框为空        MsgBox "请输入数字!", vbOKOnly + vbExclamation, "警告"        txtcardno.SetFocus        Exit Sub    End If    '判断卡号是否存在,判断此卡是否正在上机    txtsql = "select * from student_info where cardno='" & Trim(txtcardno.Text) & "'" 'And "status= '" & 使用 & "'"""    Set mrc = executesql(txtsql, msgtext)        '寻找基本数据里面最少上机金额    txtsql3 = "select * from basicdata_info "    Set mrc3 = executesql(txtsql3, msgtext)        If mrc.EOF Then        MsgBox "此卡号尚未注册"        txtcardno.Text = ""        txtcardno.SetFocus    Else        '判断余额是否充足,如果充足执行下面的语句,如果不充足提示充值        If mrc.Fields(7) < mrc3.Fields(5) Then            MsgBox "余额不太多了,请先充值再上机!", vbOKOnly + vbExclamation, "温馨提示"            frmchargecard.Show            Exit Sub        End If                    txtsql1 = "select * from online_info where cardno='" & Trim(txtcardno.Text) & "'" 'And "status= '" & 使用 & "'"""        Set mrc1 = executesql(txtsql1, msgtext)        '往line表里更新数据        txtsql2 = "select * from line_info"        Set mrc2 = executesql(txtsql2, msgtext)                        If mrc1.EOF Then            If mrc1.Fields(11) = "未结账" Then                MsgBox "该用户正在上机!", vbOKOnly + vbExclamation, "提示"                Exit Sub            Else                '调用的学生信息表给文本框,然后在把文本框里的文本更新到onwork_info表                txttype.Text = mrc.Fields(14)                txtstudentno.Text = mrc.Fields(1)                txtname.Text = mrc.Fields(2)                txtsex.Text = mrc.Fields(3)                txtdepartment.Text = mrc.Fields(5)                txtsjdate.Text = mrc.Fields(12)                txtsjtime.Text = mrc.Fields(13)                mrc1.AddNew                mrc1.Fields(0) = txtcardno.Text                mrc1.Fields(1) = txttype.Text                mrc1.Fields(2) = txtstudentno.Text                mrc1.Fields(3) = txtname.Text                mrc1.Fields(4) = txtdepartment.Text                mrc1.Fields(5) = txtsex.Text                mrc1.Fields(6) = txtsjdate.Text                mrc1.Fields(7) = txtsjtime.Text                mrc1.Fields(8) = Winsock1.LocalHostName                mrc1.Fields(9) = Now '数据库里面既包含日期有包含时间那就是now了                mrc1.Update                mrc2.AddNew                mrc2.Fields(1) = txtcardno.Text                mrc2.Fields(2) = txtstudentno.Text                mrc2.Fields(3) = txtname.Text                mrc2.Fields(4) = txtdepartment.Text                mrc2.Fields(5) = txtsex.Text                mrc2.Fields(6) = txtsjdate.Text                mrc2.Fields(7) = txtsjtime.Text                mrc2.Fields(11) = "0"                mrc2.Fields(12) = mrc.Fields(7) '把student_info表里面的信息放到line表里面                mrc2.Fields(13) = "正常上机"                mrc2.Fields(14) = Winsock1.LocalHostName                mrc2.Update            End If        Else            MsgBox "此卡正在上机!"            txttype.Text = mrc1.Fields(1)            txtstudentno.Text = mrc1.Fields(2)            txtname.Text = mrc1.Fields(3)            txtdepartment.Text = mrc1.Fields(4)            txtsex.Text = mrc1.Fields(5)            txtsjdate.Text = mrc1.Fields(6)            txtsjtime.Text = mrc1.Fields(7)        End If            End If     End Sub
下机逻辑:

Private Sub cmdxj_Click()    Dim mrc1 As ADODB.Recordset    Dim mrc2 As ADODB.Recordset    Dim mrc3 As ADODB.Recordset    Dim mrc4 As ADODB.Recordset    Dim txtsql1 As String    Dim txtsql2 As String    Dim txtsql3 As String    Dim txtsql4 As String    Dim msgtext1 As String    Dim msgtext2 As String    Dim msgtext3 As String    Dim msgtext4 As String    Dim t    Dim t1    Dim mrate As Long    Dim mtmprate As Long    Dim tleasttime    Dim tprepare    Dim money As Integer    Dim cash As Integer    Dim mlimitcash As Integer        '对四个表的分别调用    txtsql1 = "select * from student_info where cardno='" & Trim(txtcardno.Text) & "'"    txtsql2 = "select * from basicdata_info "    txtsql3 = "select * from OnLine_info where cardno='" & Trim(txtcardno.Text) & "'"    txtsql4 = "select * from line_info where cardno='" & Trim(txtcardno.Text) & "'"        Set mrc1 = executesql(txtsql1, msgtext1)    Set mrc2 = executesql(txtsql2, msgtext2)    Set mrc3 = executesql(txtsql3, msgtext3)    Set mrc4 = executesql(txtsql4, msgtext4)            '判断是否为空    If Not testtxt(txtcardno.Text) Then '防止输入框为空        MsgBox "卡号为空!", vbOKOnly + vbExclamation, "警告"        txtcardno.SetFocus        Exit Sub    End If    '判断是否为数字    If Not IsNumeric(Trim(txtcardno.Text)) Then '防止输入框为空        MsgBox "请输入数字!", vbOKOnly + vbExclamation, "警告"        txtcardno.SetFocus        Exit Sub    End If    '判断是否合法    If mrc1.EOF Then        MsgBox "此号尚未注册!", vbOKOnly + vbExclamation, "提示"        txtcardno.Text = ""        txtcardno.SetFocus        Exit Sub    End If    '判断是否上机    If mrc4.EOF Then        MsgBox "此卡号没有上机!", vbOKOnly + vbExclamation, "提示"        txtcardno.Text = ""        txtcardno.SetFocus    Else         '把基本数据表里的数据都赋值出来         mrc2.MoveLast        mrate = mrc2.Fields(0)        mtmprate = mrc2.Fields(1)        tunittime = mrc2.Fields(2)        tleasttime = mrc2.Fields(3)  'budui        tprepare = mrc2.Fields(4)        mlimitcash = mrc2.Fields(5)        '把line表的基本数据表示出来        cash = mrc4.Fields(12)                Dim M As Date                 M = Format(Now(), "yyyy-mm-dd hh:mm:ss")        t = DateDiff("n", mrc3.Fields(9), M) 'datediff函数来取时间               '判断上机时间的长短        If t < tprepare Then            t1 = 0  '时间小于准备时间的时间按零算        Else            If t < tleasttime Then            '这里逻辑有点问题,最小时间没什么用                t1 = tleasttime / 60 '小于最小时间的按最小时间算            Else                If t Mod 60 = 0 Then                    t1 = Int(t / 60) '如果整除的话就按整点算                Else                    t1 = Int(t / 60) + 1 '如果不能整除就取整加一                End If            End If        End If        '时间已经有了就差计算金钱了                '判断用户类型        If mrc1.Fields(14) = "固定用户" Then            money = t1 * mrate        Else            money = t1 * mtmprate        End If         '窗体上显示下机日期,下机时间,消费时间        txtxjdate.Text = Date        txtxjtime.Text = Time        txttime.Text = t        txtspendmoney.Text = money        txttype.Text = mrc1.Fields(14)        txtstudentno.Text = mrc1.Fields(1)        txtname.Text = mrc1.Fields(2)        txtsex.Text = mrc1.Fields(3)        txtdepartment.Text = mrc1.Fields(5)        txtsjdate.Text = mrc1.Fields(12)        txtsjtime.Text = mrc1.Fields(13)        txtmoney.Text = cash - money        '更新line表里的下机日期,下机时间,用来计算上机时长        mrc4.Fields(8) = Date        mrc4.Fields(9) = Time        mrc4.Fields(10) = t        mrc4.Fields(11) = money        mrc4.Fields(12) = cash - money        mrc4.Update        MsgBox "下机成功!", vbOKOnly + vbExclamation, "提示"        txtcardno.Text = ""        txtcardno.SetFocus      ' mrc4.Delete        mrc3.Delete        mrc1.Fields(11) = "已结账"        mrc1.Fields(7) = cash - money        mrc1.Update            End IfEnd Sub
组合查询逻辑:

Private Sub cmdinquire_Click()    Dim txtsql As String    Dim msgtext As String    Dim mrc As ADODB.Recordset         txtsql = "select * from student_info where "    '判断字段是否为空    If combofield1.Text = "" Then        MsgBox "请选择字段名!", vbOKOnly + vbExclamation, "提示"        Exit Sub    ElseIf Comboczf1.Text = "" Then        MsgBox "请选择操作符!", vbOKOnly + vbExclamation, "提示"        Exit Sub    ElseIf txtinquire1.Text = "" Then        MsgBox "请输入要查询的内容!", vbOKOnly + vbExclamation, "提示"        Exit Sub    ElseIf combozh1.Text <> "" Then        If combofield2.Text = "" Then            MsgBox "请选择第二个字段名!", vbOKOnly + vbExclamation, "提示"            Exit Sub        ElseIf comboczf2.Text = "" Then            MsgBox "请选择第二个操作符!", vbOKOnly + vbExclamation, "提示"            Exit Sub        ElseIf txtinquire2.Text = "" Then            MsgBox "请输入第二个查询框要查询的内容!", vbOKOnly + vbExclamation, "提示"            Exit Sub        ElseIf combozh2.Text <> "" Then                If combofield3.Text = "" Then                    MsgBox "请选择第3个字段名!", vbOKOnly + vbExclamation, "提示"                    Exit Sub                ElseIf comboczf3.Text = "" Then                    MsgBox "请选择第3个操作符!", vbOKOnly + vbExclamation, "提示"                     Exit Sub                ElseIf txtinquire3.Text = "" Then                    MsgBox "请输入第3个查询框要查询的内容!", vbOKOnly + vbExclamation, "提示"                    Exit Sub                Else                    txtsql = txtsql & field1 & Comboczf1.Text & "'" & Trim(txtinquire1.Text) & "'" & zh1 & field2 & comboczf2.Text & "'" & Trim(txtinquire2.Text) & "'" & zh2 & field3 & comboczf3.Text & "'" & Trim(txtinquire3.Text) & "'"                End If        Else        txtsql = txtsql & field1 & Comboczf1.Text & "'" & Trim(txtinquire1.Text) & "'" & zh1 & field2 & comboczf2.Text & "'" & Trim(txtinquire2.Text) & "'"        End If    Else        txtsql = txtsql & field1 & Comboczf1.Text & "'" & Trim(txtinquire1.Text) & "'"    End If                       Set mrc = executesql(txtsql, msgtext)    If mrc.EOF Then        MsgBox "该条件的数据不存在", vbOKOnly + vbExclamation, "提示"            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) = "班级"            .TextMatrix(0, 7) = "性别"            .TextMatrix(0, 8) = "状态"            .TextMatrix(0, 9) = "备注"            .TextMatrix(0, 10) = "类型"            .TextMatrix(0, 11) = "日期"            .TextMatrix(0, 12) = "时间"        End With        Exit Sub   Else        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) = "班级"            .TextMatrix(0, 7) = "性别"            .TextMatrix(0, 8) = "状态"            .TextMatrix(0, 9) = "备注"            .TextMatrix(0, 10) = "类型"            .TextMatrix(0, 11) = "日期"            .TextMatrix(0, 12) = "时间"        End With                    Do While Not mrc.EOF               With myflexgrid               .Rows = .Rows + 1 '这种方式也可防止空白行的出现               .CellAlignment = 4               .TextMatrix(.Rows - 1, 0) = mrc.Fields(1)               .TextMatrix(.Rows - 1, 1) = mrc.Fields(2)               .TextMatrix(.Rows - 1, 2) = mrc.Fields(0)               .TextMatrix(.Rows - 1, 3) = mrc.Fields(7)               .TextMatrix(.Rows - 1, 4) = mrc.Fields(4) & "" '这里报错,无效使用null添加“”               .TextMatrix(.Rows - 1, 5) = mrc.Fields(5) & ""               .TextMatrix(.Rows - 1, 6) = mrc.Fields(6)               .TextMatrix(.Rows - 1, 7) = mrc.Fields(3)               .TextMatrix(.Rows - 1, 8) = mrc.Fields(10)               .TextMatrix(.Rows - 1, 9) = mrc.Fields(8)               .TextMatrix(.Rows - 1, 10) = mrc.Fields(14)               .TextMatrix(.Rows - 1, 11) = mrc.Fields(12)               .TextMatrix(.Rows - 1, 12) = mrc.Fields(13)               mrc.MoveNext               End With           Loop    End IfEnd Sub
报表逻辑:

Dim WithEvents Report As grproLibCtl.GridppReport  '实例化报表Private Sub cmdprint_Click()Report.[Print] (True) '打印,因为报表对象的print方法名与vb的内部定义方法有冲突所以要用中括号End SubPrivate Sub cmdprintviewer_Click()      Report.PrintPreview (True)End SubPrivate Sub cmdrefresh_Click()    Dim strSQL As String    Dim strMsg As String    Dim objRsWeekliyBill As ADODB.Recordset    Dim objRsDaliyBill As ADODB.Recordset      If startdateview.Value > enddateview.Value Then '条件限制        MsgBox "终止日期不能小于起始日期!", vbOKOnly + vbExclamation, "警告"        Exit Sub    End If    '把选择的时间赋值给参数    Report.ParameterByName("startdate").Value = Format$(startdateview.Value, "yyyy-mm-dd")    Report.ParameterByName("enddate").Value = Format$(enddateview.Value, "yyyy-mm-dd")      '日期的选定    strSQL = "select * from CheckDay_Info where date between'" & Format$(startdateview.Value, "yyyy - mm - dd") & "'" & " and'" & Format$(enddateview.Value, "yyyy-mm-dd") & "'"    Set objRsDaliyBill = executesql(strSQL, strMsg)      strSQL = "select * from CheckWeek_Info"    Set objRsWeekliyBill = executesql(strSQL, strMsg)    Do While objRsWeekliyBill.EOF = False        objRsWeekliyBill.Delete        objRsWeekliyBill.MoveNext    Loop  't = Format(objRsDaliyBill.Fields(5), yyyy / mm / dd)    '更新到日结表中    Do While objRsDaliyBill.EOF = False '判断是否有数据        With objRsWeekliyBill            .AddNew            .Fields(0) = objRsDaliyBill.Fields(0) & ""            .Fields(1) = objRsDaliyBill.Fields(1) & ""            .Fields(2) = objRsDaliyBill.Fields(2) & ""            .Fields(3) = objRsDaliyBill.Fields(3) & ""            .Fields(4) = objRsDaliyBill.Fields(4) & ""            .Fields(5) = objRsDaliyBill.Fields(5)            .Update            objRsDaliyBill.MoveNext        End With    Loop    grdWeekliyBill.Refresh  '刷新    'Report.DetailGrid.Recordset.QuerySQL = "select * from weekcheck_info where date between '" & startdateview.Value & "' and '" & enddateview.Value & "'"End SubPrivate Sub Form_Load()    '创建报表对象    Set Report = New grproLibCtl.GridppReport    '载入报表模版文件    Report.LoadFromFile (App.Path & "\weekcheck.grf")    '设置数据连接串    Report.DetailGrid.Recordset.ConnectionString = Connectstring '"provider=SQLOLEDB;server=LI;database=charge_sys;integrated security =SSPI"    '用来使grdWeekliyBill报表查询器控件显示报表中的内容    grdWeekliyBill.Report = Report    grdWeekliyBill.Start     Report.ParameterByName("startdate").Value = Format$(startdateview.Value, "yyyy-mm-dd")   Report.ParameterByName("enddate").Value = Format$(enddateview.Value, "yyyy-mm-dd")  'Report.ParameterByName("enddate").Value = Date    End Sub

五、模块简化

熟练正确的使用模块能大大的提高我们的编程效率。我个人的理解就是把代码相同的功能放到模块里面直接调用就行了。

举个例子:在整个系统中basicdate_info 这个表的调用都是直接调用的,把它写到模块里面准备好,在需要基本数据的时候用一行代码就可以搞定了。

    优化的时候每个窗体的文本框都不能随便输入特殊字符,这个也可以放到模块里。

六、函数分析

平时多积累函数,搞清楚每个函数的用途能省去很多的代码。

eg:在组合查询的时候,需要将combobox里面的text转化为数据库表中的字段名,如果用select case就比用if  then 效率高很多

datediff函数在计算上机时间的时候用起来很方便

专业补充:DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
      DateDiff 函数语法中有下列命名参数:
                            interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔 
                            Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。 
                            Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。 
                            firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。 
                            interval 参数的设定值如下:
                            设置 描述 
                             yyyy 年 
                            q 季 
                            m 月 
                            y 一年的日数 
                            d 日 
                            w 一周的日数 
                            ww 周 
                            h 时 
                           n 分钟 
                           s 秒 
 七、自我分析

下次再做系统的时候一定要掌握好节奏,做好时间管理,要严格要求自己该哪天完成的工作决不拖到第二天。

遇到困难第一反应不是问同学也不是自己百度,而是先分析分析自己找找原因,培养自己解决问题的能力。

遇到没见过的代码一定要耐心的看,分析,这样在遇到的时候才不陌生。

及时总结自己的收获不要等着做完系统才想起来写总结,这样就跟我一样弄得不太好了。

自己动手做了之后发现,其实也没那么难,所谓的难都仅仅只是感觉。

2 0
原创粉丝点击