第一次机房收费系统花了20多天,终于接近了尾声。这是初次脱离源码,随心所欲的设计软件。从机房收费系统初想到现在,一路走来,慢慢体会,慢慢感悟。
昨天师傅给验收系统,发现了自己存在的一个很大的问题:系统需求分析不到位。其实在刚一开始还是被下发的收费系统束缚了,我在窗体的设计上依旧是照葫芦画瓢,人家有哪个窗体我就建了哪个窗体。对于不同级别用户的权限问题还是很模糊,很少加进自己的逻辑思维。以至于在师傅提问的时候傻眼了。
因而有必要站在一个新节点上重新分析机房收费系统。
0.总体认识。
机房收费系统旨在开发一个由少数工作人员来完成学生刷卡消费上机的自动化。通过对权限的设定约束不同级别用户的职权。该系统最大的优势是可以实现多用户同时操作,同步更新。
1.用户分析。
一般用户:拥有最低权限。可以进行的操作:查看学生余额、充值记录、上机记录。
操作员:拥有中级权限。职能:注册、充值、退卡;查询金额收取、金额返还、学生上机信息、操作员工作记录;维护学生 基本信息。
管理员:拥有最高权限。职能:查看正在值班教师;设定收费标准并进行结账;添加和删除用户。
学习误区:
一直都以为一般用户就是学生,其实并不能这样理解。这个系统的意图是实现学生刷卡上机自动化,可以理解为是学生上机显示器,因而其用户并非是面向学生的。所以一般用户可以理解为是一些教师等。
2.功能分析
机房收费系统是以数据库为基础的,对其操作无非是通过编码实现对数据库信息的增删改查。
增:注册卡、添加用户
删:删除用户
改:充值、退卡、收费标准、密码
查:学生信息、卡信息、工作记录,进行汇总结账
难点:
在敲代码的过程中自我感觉有三个地方比较难搞定。
⑴导出数据到Excel。
这个功能是因为以前没有遇到过,觉得比较高大上。其实从网上查了查,也是不难实现的。
<span style="font-family:Microsoft YaHei;font-size:18px;"> Dim xlsApp As Excel.Application '声明EXCEL应用程序对象 Dim xlsBook As Excel.Workbook '声明EXCEL工件簿 Dim xlsSheet As Excel.Worksheet '声明设置的活动工作表 Dim intR As Integer '循环变量,用于控制行 Dim intC As Integer '循环变量,用于控制列 Set xlsApp = CreateObject("Excel.Application") '创建EXCEL对象 Set xlsBook = xlsApp.Workbooks.Add '新建EXCEL工件簿文件 Set xlsSheet = xlsBook.Worksheets(1) '设置活动工作表 '判断MSHFlexgridRecord表里是否有数据 If MSFlexGrid1.Rows > 1 Then For intR = 0 To MSFlexGrid1.Rows - 1 For intC = 0 To MSFlexGrid1.Cols - 1 If intC = 0 Then '第一列为学号,让其以字符形式显示 xlsSheet.Cells(intR + 1, intC + 1) = "'" & MSFlexGrid1.TextMatrix(intR, intC) Else xlsSheet.Cells(intR + 1, intC + 1) = MSFlexGrid1.TextMatrix(intR, intC) End If Next intC Next intR xlsApp.ActiveWorkbook.SaveAs App.Path & "\学生上机信息.xls" '表格保存路径 xlsApp.ActiveWorkbook.Saved = True '保存表格 MsgBox "表格已导出!", vbOKOnly + vbExclamation, "提示" '保存成功提示信息 '显示表格 xlsApp.Visible = True '显示Excel Set xlsApp = Nothing '交还控制给Excel Else MsgBox "没有数据可以导出!", vbOKOnly + vbExclamation, "警告" End If</span>
⑵组合查询
其实就是对查询信息的组合,比较新奇的地方是,这里需要重新定义一个函数,识别选中条件,并从数据库中找到相应字 段。
举个例子,学生上机信息统计模块的。
<span style="font-family:Microsoft YaHei;font-size:18px;"> <span style="font-family:KaiTi_GB2312;"> Public Function FieldName(StrFieldName As String) As String Select Case StrFieldName Case "卡号" FieldName = "cardno" Case "姓名" FieldName = "studentname" Case "上机日期" FieldName = "ondate" Case "上机时间" FieldName = "ontime" Case "下机日期" FieldName = "offdate" Case "下机时间" FieldName = "offtime" Case "消费金额" FieldName = "consume" Case "余额" FieldName = "cash" Case "备注" FieldName = "status" Case "与" FieldName = "and" Case "或" FieldName = "or" End Select End Function</span></span>进行组合查询:
<span style="font-family:Microsoft YaHei;font-size:18px;">t<span style="font-family:KaiTi_GB2312;">xtSQL = "select * from line_info where " txtSQL = txtSQL & FieldName(cmbfieldname1.Text) & cmdoprater1.Text & "'" & txtrecord1.Text & "'" If Trim(cmbfieldname2.Text <> "") Then If Trim(cmbfieldname2.Text) = "" Or Trim(cmdoprater2.Text) = "" Or Trim(txtrecord2.Text) = "" Then MsgBox "你选择了组合查询,请先完善您的查询信息!", vbOKOnly + vbExclamation, "警告" Exit Sub Else Select Case cmbrelation1.Text Case "或" txtSQL = txtSQL & "or " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" Case "与" txtSQL = txtSQL & "and " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" End Select End If End If If Trim(cmbfieldname3.Text <> "") Then If Trim(cmbfieldname3.Text) = "" Or Trim(cmdoprater3.Text) = "" Or Trim(txtrecord3.Text) = "" Then MsgBox "你选择了组合查询,请先完善您的查询信息!", vbOKOnly + vbExclamation, "警告" Exit Sub Else Select Case cmbrelation2.Text Case "或" txtSQL = txtSQL & "or " & FieldName(cmbfieldname3.Text) & cmdoprater3.Text & "'" & txtrecord3.Text & "'" Select Case cmbrelation1.Text Case "或" txtSQL = txtSQL & "or " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" Case "与" txtSQL = txtSQL & "and " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" End Select Case "与" txtSQL = txtSQL & "and " & FieldName(cmbfieldname3.Text) & cmdoprater3.Text & "'" & txtrecord3.Text & "'" Select Case cmbrelation1.Text Case "或" txtSQL = txtSQL & "or " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" Case "与" txtSQL = txtSQL & "and " & FieldName(cmbfieldname2.Text) & cmdoprater2.Text & "'" & txtrecord2.Text & "'" End Select </span></span>
<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:KaiTi_GB2312;"> End Select</span></span>
<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:KaiTi_GB2312;">。。。。。。(此处省略查询结果判定语句)</span></span>切记:一定要规范写标点符号,不要因为一个空格而搞的程序错乱啊。
因为要显示和打印账单,所以引入了报表。先来认识一下报表设计器。
Grid++Report 是一款高性能高效率的报表开发工具,既可开发桌面软件(C/S软件)的报表与打印系统,也可开发WEB(B/S)软件的报表与打印系统。提供一个具有超强数据展现能力的数据网格(DataGrid)部件,制作各种表格报表非常简便;运行时可通过事件处理使报表与用户交互;针对票据套打进行了专门实现;总之Grid++Report是制作动态报表的最佳选择。提供可视化报表设计器,设计报表快速简单。Grid++Report除了提供打印功能外,还提供报表的查询显示功能,即如各种数据网格(DataGrid)控件一样显示数据,让报表的查询显示与打印一次实现,既提高开发效率又保持数据的一致性。
关于报表的使用,我是站在了巨人们的肩膀上—从网上搜了一些师哥师姐关于这方面的博客实例,推荐一篇博客:用VB做报表
其实设计报表一点都不难,一学就会啊。
关于结账单代码的实现:
<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:14px;">Dim Report As grproLibCtl.GridppReport Dim mrc As ADODB.Recordset Dim MsgText As String Dim strSQL As String '实现打印功能 Private Sub cmdprint_Click() Report.[Print] (True) End Sub '数据库中信息导出到报表 Private Sub CmdRefresh_Click() strSQL = "select * from checkday_info where date='" & Format(Date, "yyyy-mm-dd") & "'" Report.DetailGrid.Recordset.QuerySQL = strSQL GRDisplayViewer1.Start End Sub '打印预览 Private Sub CmdRePrint_Click() Report.PrintPreview (True) End Sub</span></span>周结账单相对日结来说就多了个时间范围选择的,其它的和日结挺像的,没有什么难度。
最让我头疼的就是结账了,想了好久,思路总算是清晰了,详见下篇博客。
3.思想认识
米老师一直在说“聪”和“明”:聪,是因为看见才相信;明,是因为相信才看见(中间的过程是因为我们在“做”)。能做到 “聪” 的人很多,但能做到“ 明 ”的人很少。我们最好做到后者,当然两者结合起来才是真正的“聪明”。
我的意思是说,在敲代码的过程中我们要有足够的信心,相信自己能做好,然后“土豆土豆炖”,无所畏惧,一直往前走。