机房收费1.0完成了,现在我来对我的机房收费系统做一下总结。
我的机房收费系统包括25个窗体,一个模块。整个过程主要是对select语句的运用,主要是进行“查”这一项操作。关于查的操作可以有很多的用途,比如登录需要身份验证,比如调用数据库的信息,导出Excel表格,比如多字段查询你需要的信息,还有就是报表通过与数据库建立联系,调用数据库中的信息,报表再与VB进行交互,就会实现账单的刷新,当然这里还涉及到报表的制作,虽然刚开始会陌生一点,但是总起来的操作还是很简单的。这是一些总体上的认识,下面来看看我的机房收费系统的一些具体的收获吧。
1.我想说的是登陆窗体,这里涉及到一个身份验证,根据身份不同,主窗体能进行的功能操作也不同,这里就需要调用数据库。下面来看看我关于身份验证所需要的代码。
txtSQL = "select * from User_Info where userID='" & txtUserName & "'"
Set mrc1 = ExecuteSQL(txtSQL, MsgText)
a = Trim(mrc1.Fields(2))
If a = "操作员" Then
frmMain.administratorMenu.Enabled = False '管理员菜单栏不能用
ElseIf a = "一般用户" Then
frmMain.administratorMenu.Enabled = False
frmMain.operatorMenu.Enabled = False '操作员菜单栏不能用
End If
在身份验证这儿我一直你没有实现,知道周三才得以实现,错误点即在黄色区域,我没有通过Trim语句去空格,所以身份验证纠结了很久,这也就提醒了我,关注细节,因为本身自己对于小细节的忽略,导致我经常遇到这样的问题,这次给了我一个深刻的教训。
2.因为之前有学生信息管理系统的基础,所以一些类似的窗体的代码还是比较简单的,但是这里经常出现一个问题:
出现这个问题,伴随的代码出现问题的地方是:
if mrc.eof=false then
这说明你的代码不能访问到数据库,这里你需要注意检查的地方是:
要查询的表的名字是否正确(尤其是大小写的问题),代码某个单词是否出现错误,Select语句是否有错,还有去空格的问题(用trim函数会明显减少出错率)
3.接下来我想说的是注册问题,就是一些数据保存到数据库中,这段代码我也是出了很多次错误之后才总结出了经验
这段代码中,我经常忘记Update语句的输入,这句话不输入,数据库是不会保存你重新输入的语句的。
还有就是如果数据库中设置的每个字段都不能为空时,你在重新写入数据的时候,必须保证每个字段都有数据,不会出现空的字段,否则会出现错误,代码所需要的功能不能实现。
4.我要说的是Excel表格的导出,在这里是要把数据库中的信息导入到Excel表格中,这段代码是查资料得到的,写下来作为积累,先面试我的代码:
首先我们先声明一个过程:
Public Sub Exporttoexcel(formname As Form, flexgridname As String) '参数传递
Dim xlApp As Object '创建一个类 用来创建excel实例化对象
Dim xlBook As Object 'Excel.Workbook '用来创建工作薄 Dim xlSheet As Object 'Excel.Worksheet '用来创建一个工作表
Dim lngRows As Long
Dim intCols As Integer
Screen.MousePointer = vbHourglass
On Error GoTo Err_Proc
Set xlApp = CreateObject("Excel.Application") '将类xlApp实例化为一个excel表
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1) '表的名字也可以更改,不再叙说
'将数据填入到excel中
With formname.Controls(flexgridname)
'对行和列进行循环
For lngRows = 0 To .Rows - 1
For intCols = 0 To .Cols - 1
xlSheet.Cells(lngRows + 1, intCols + 1).Value = "'" & .TextMatrix(lngRows, intCols)
Next intCols
Next lngRows
End With
xlApp.Visible = True
Screen.MousePointer = vbDefault
Exit Sub
Err_Proc:
Screen.MousePointer = vbDefault
MsgBox "请确认您的电脑已安装Excel!", vbExclamation, "提示"
End Sub
然后再通过相应的按钮来激发这个过程:
Private Sub cmdOK_Click()
If myFlexGrid1.Cols > 1 Then
X = MsgBox("当前没有记录,确定要导出表格吗?", vbYesNo Or vbDefaultButton2 + vbExclamation, "学生上机记录查询")
If X = vbYes Then
Call Exporttoexcel(Me, "myFlexGrid1") '导出excel
End If
End If
End Sub
5.我想说的是多字段查询的问题,在这里我纠结了好几天才实现的,我的代码很简单,但是,这里是最考验细节的地方,一个不注意,你的代码就无法实现,因为现在是1.0,还有很多逻辑上没有完善的地方,但是基本上的查询问题解决了,下面来看看我的代码:
Private Sub cmdInquire_Click()
Dim mrc As New ADODB.Recordset
Dim txtSQL As String
Dim MsgText As String
Dim Fieldstr As String '用来保存字段名的内容
Dim RelationStr As String '用来保存组合关系
Dim dd(2) As Boolean '用来判断是否有查询到的记录
'判断字段名是否为空
If Combofields(0).Text = "" Then
MsgBox "字段名不能为空!", vbOKOnly + vbExclamation, "警告"
Combofields(0).SetFocus
Exit Sub
End If
'判断操作符是否为空
If cmbOperators(0).Text = "" Then
MsgBox "操作符不能为空!", vbOKOnly + vbExclamation, "警告"
cmbOperators(0).SetFocus
Exit Sub
End If
'判断要查询的内容是否为空
If txtcontent(0).Text = "" Then
MsgBox "要查询的内容不能为空!", vbOKOnly + vbExclamation, "警告"
txtcontent(0).SetFocus
Exit Sub
End If
'判断字段名选择方式
Select Case Combofields(0).Text
Case "卡号"
Fieldstr = "cardno"
Case "姓名"
Fieldstr = "studentName"
Case "上机日期"
Fieldstr = "ondate"
Case "上机时间"
Fieldstr = "ontime"
Case "机房号"
Fieldstr = "computer"
End Select
'连接数据库
txtSQL = "select * from OnLine_Info where " & Fieldstr & cmbOperators(0) & "'" & Trim(txtcontent(0).Text) & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
'判断是否查询到记录,如果有则显示
If mrc.EOF = False Then
'显示记录
With FlexGridOnStatus
.Rows = 1
.CellAlignment = 4
.TextMatrix(0, 0) = "卡号"
.TextMatrix(0, 1) = "姓名"
.TextMatrix(0, 2) = "上机日期"
.TextMatrix(0, 3) = "上机时间 "
.TextMatrix(0, 4) = "机房号"
Do While Not mrc.EOF
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = mrc.Fields(0)
.TextMatrix(.Rows - 1, 1) = mrc.Fields(3)
.TextMatrix(.Rows - 1, 2) = mrc.Fields(6)
.TextMatrix(.Rows - 1, 3) = mrc.Fields(7)
.TextMatrix(.Rows - 1, 4) = mrc.Fields(8)
mrc.MoveNext
Loop
End With
Else
dd(0) = 1
End If
'断开连接
mrc.Close
'如果字段名2,操作符2,要查询内容2和组合关系1有一个不为空,那么其他几项都不能为空
'如果字段名2,操作符2,要查询内容2和组合关系1都为空,则退出此过程
If Not (Combofields(1).Text = "" And cmbOperators(1).Text = "" And txtcontent(1).Text = "" And cmbOrAnd(0).Text = "") Then
'字段名2不能为空
If Combofields(1).Text = "" Then
MsgBox "字段名不能为空!", vbOKOnly + vbExclamation, "警告"
Combofields(1).SetFocus
Exit Sub
End If
'操作符2不能为空
If cmbOperators(1).Text = "" Then
MsgBox "操作符不能为空!", vbOKOnly + vbExclamation, "警告"
cmbOperators(1).SetFocus
Exit Sub
End If
'要查询的内容不能为空
If txtcontent(1).Text = "" Then
MsgBox "要查询的内容不能为空!", vbOKOnly + vbExclamation, "警告"
txtcontent(1).SetFocus
Exit Sub
End If
'组合关系不能为空
If cmbOrAnd(0).Text = "" Then
MsgBox "组合关系不能为空!", vbOKOnly + vbExclamation, "警告"
cmbOrAnd(0).SetFocus
Exit Sub
End If
'判断字段名选择的方式
Select Case Combofields(1).Text
Case "卡号"
Fieldstr = "cardno"
Case "姓名"
Fieldstr = "studentName"
Case "上机日期"
Fieldstr = "ondate"
Case "上机时间"
Fieldstr = "ontime"
Case "机房号"
Fieldstr = "computer"
End Select
'判断组合关系方式
Select Case cmbOrAnd(0).Text
Case "与"
RelationStr = " and "
Case "或"
RelationStr = " or "
End Select
'连接查询
txtSQL = txtSQL & RelationStr & Fieldstr & cmbOperators(1) & "'" & Trim(txtcontent(1).Text) & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
'显示记录
If mrc.EOF = False Then
With FlexGridOnStatus
.Rows = 1
Do While Not mrc.EOF
.Rows = .Rows + 1
.Cols = 8
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = mrc.Fields(0)
.TextMatrix(.Rows - 1, 1) = mrc.Fields(3)
.TextMatrix(.Rows - 1, 2) = mrc.Fields(6)
.TextMatrix(.Rows - 1, 3) = mrc.Fields(7)
.TextMatrix(.Rows - 1, 4) = mrc.Fields(8)
mrc.MoveNext
Loop
End With
Else
dd(1) = 1
End If
End If
'断开连接
'mrc.Close
'如果字段名3,操作符3,要查询内容3和组合关系2有一个不为空,那么其他几项都不能为空
'如果字段名3,操作符3,要查询内容3和组合关系2都为空,则退出此过程
If Not (Combofields(2).Text = "" And cmbOperators(2).Text = "" And txtcontent(2).Text = "" And cmbOrAnd(1).Text = "") Then
'字段名3不能为空
If Combofields(2).Text = "" Then
MsgBox "字段名不能为空!", vbOKOnly + vbExclamation, "警告"
Combofields(2).SetFocus
Exit Sub
End If
'操作符3不能为空
If cmbOperators(2).Text = "" Then
MsgBox "操作符不能为空!", vbOKOnly + vbExclamation, "警告"
cmbOperators(2).SetFocus
Exit Sub
End If
'要查询的内容不能为空
If txtcontent(2).Text = "" Then
MsgBox "要查询的内容不能为空!", vbOKOnly + vbExclamation, "警告"
txtcontent(2).SetFocus
Exit Sub
End If
'组合关系不能为空
If cmbOrAnd(1).Text = "" Then
MsgBox "组合关系不能为空!", vbOKOnly + vbExclamation, "警告"
cmbOrAnd(1).SetFocus
Exit Sub
End If
'判断字段名选择的方式
Select Case Combofields(2).Text
Case "卡号"
Fieldstr = "cardno"
Case "姓名"
Fieldstr = "studentName"
Case "上机日期"
Fieldstr = "ondate"
Case "上机时间"
Fieldstr = "ontime"
Case "机房号"
Fieldstr = "computer"
End Select
'判断组合关系方式 ,小记一笔,我就是在这里的逻辑关系不严谨,需要完善
Select Case cmbOrAnd(1).Text
Case "与"
RelationStr = " and "
Case "或"
RelationStr = " or "
End Select
'连接查询
txtSQL = txtSQL & RelationStr & Fieldstr & cmbOperators(2) & "'" & Trim(txtcontent(2).Text) & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
'显示记录
If mrc.EOF = False Then
With FlexGridOnStatus
.Rows = 1
Do While Not mrc.EOF
.Rows = .Rows + 1
.Cols = 8
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = mrc.Fields(0)
.TextMatrix(.Rows - 1, 1) = mrc.Fields(3)
.TextMatrix(.Rows - 1, 2) = mrc.Fields(6)
.TextMatrix(.Rows - 1, 3) = mrc.Fields(7)
.TextMatrix(.Rows - 1, 4) = mrc.Fields(8)
mrc.MoveNext
Loop
End With
Else
dd(2) = 1
End If
End If
'断开连接
'mrc.Close
'判断是否查询到记录
If (dd(0) = 1 And dd(1) = 1 And dd(2) = 1) Then
MsgBox "无记录!", vbOKOnly + vbExclamation, "警告"
End If
End Sub
小记一笔: 在这里我的缺陷是关于关系处理的代码,我在这设置这方面的逻辑问题存在缺陷,在调整,这方面的问题还是师傅给我提出来的,当时我感觉我自己的逻辑很好啊,后来想想那种逻辑是不严谨,用户用起来也不方便,所以我自己的那种逻辑是不合格的
6.在这我想说的是日结账单和周结账单,关于日结账单纠结了3天还是做完了,但是周结账单整整纠结了5天,开始一直以为日结账单做完之后,周结账单很简单,现在看来也不是很难了,但是当时我之所以纠结周结账单的时间很长时我的上期余额字段总是不能实现。其它的都好说,但是上期余额这个字段我话费了很多的心思才实现的,用的语句是order by,通过对各条记录的时间排序,最后找出最后一条记录,在这里涉及到数据库中表的设置问题,因为这些,我又删除我的CheckDay_Info ,重新创建表,然后设置我日期字段为datetime.
关于机房收费系统的总结就写这些,其它的细节会写在别的博客里面。