机房收费整体思路
来源:互联网 发布: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 秒
七、自我分析
下次再做系统的时候一定要掌握好节奏,做好时间管理,要严格要求自己该哪天完成的工作决不拖到第二天。
遇到困难第一反应不是问同学也不是自己百度,而是先分析分析自己找找原因,培养自己解决问题的能力。
遇到没见过的代码一定要耐心的看,分析,这样在遇到的时候才不陌生。
及时总结自己的收获不要等着做完系统才想起来写总结,这样就跟我一样弄得不太好了。
自己动手做了之后发现,其实也没那么难,所谓的难都仅仅只是感觉。
- 机房收费整体思路
- 机房收费系统整体观看
- 机房收费系统思路要点
- 机房收费系统之思路
- 机房收费系统思路整理
- 机房收费系统(一)整体总结
- 机房收费文档之流程整体分析
- 【机房收费系统】 之 整体理解
- 机房收费系统——整体总结
- 机房收费系统之逻辑思路
- 重构版机房收费系统构建思路
- 思路梳理----第一遍机房收费系统
- 再理机房收费系统思路
- 机房收费系统思路大总结
- 机房收费系统——编写思路
- 机房收费系统之上下机思路整理
- 【第一遍机房收费系统】——整体结构
- 机房收费系统(一)--前期思路整理
- Python3 使用bs4按标签提取贴吧楼主发表内容
- Anroid之HttpClient异步请求数据
- Eclipse中文字体太小的解决办法
- caffe学习(2):安装完caffe后,配置python接口
- 【源码】LruCache源码剖析
- 机房收费整体思路
- HDU 1827 Summer Holiday
- 矩阵论还真有用:触摸屏校准
- hdojBiker's Trip Odometer(水题)
- [INS-060001]Failed to perform operation due to internal driver error.
- JAVA socket FTPserver HTTPserver chatting RMI(Remote Method Invocation)
- An out-of-range value
- C/C++ Pointer Learning ||
- while(cin>>temp)如何结束循环