学生信息系统的三大窗体就剩下查询窗体和修改窗体了,这两个窗体中没有太多要注意的,除了一般的判断是否为空、是否为数字、是否重复等这些问题以外,修改窗体另外还有一个要注意的问题,这些问题不注意的话,运行时一不小心就会报错。而查询窗体主要是理解代码,其中有一点很难理解,那就是定义的逻辑变量dd(4)。下面来解释一下:
查询窗体中有三种查询方式,分别是按学号、课程、姓名查询,但是用户在查询时却会出现4种情况,那就是单一方式查询、两种方式同时查询、三种方式同时查询和没有选择查询方式,dd(4)正是代表了这四种情况,下面结合代码理解一下:
Private Sub cmdinquire_Click() Dim txtsql As String Dim msgtext As String Dim dd(4) As Boolean '代表四种查询情况 Dim mrc As ADODB.Recordset '不同的查询方式查询的表是一样的,只不过不同的方式入手的地方不一样 txtsql = "select * from result_info where " '入手的地方就是where后面的内容 If Check1(0).Value Then '按学号查询 If Trim(txtsid.Text) = "" Then smeg = "学号不能为空" MsgBox smeg, vbOKOnly + vbExclamation, "警告" txtsid.SetFocus Exit Sub Else If Not IsNumeric(Trim(txtsid.Text)) Then MsgBox "请输入数字!", vbOKOnly + vbExclamation, "警告" Exit Sub txtsid.SetFocus End If dd(0) = True 'dd(0)=Ture代表的是按学号查询 txtsql = txtsql & "student_id= '" & Trim(txtsid.Text) & "'" End If End If If Check1(1).Value Then '按姓名查询 If Trim(txtname.Text) = "" Then smeg = "姓名不能为空" MsgBox smeg, vbOKOnly + vbExclamation, "警告" txtname.SetFocus Exit Sub Else dd(1) = True 'dd(1)=Ture代表的是按姓名查询 If dd(0) Then '如果同时按学号和姓名查询 txtsql = txtsql & "and student_name= '" & txtname.Text & "'" Else txtsql = txtsql & "student_name= '" & txtname.Text & "'" End If End If End If </pre><p></p><p><span style="font-size:18px"></span></p><pre name="code" class="html"> If Check1(2).Value Then '按课程查询 If Trim(txtcourse.Text) = "" Then smeg = "课程不能为空" MsgBox smeg, vbOKOnly + vbExclamation, "警告" txtcourse.SetFocus Exit Sub Else dd(2) = True 'dd(2)=Ture代表的是按课程查询 If dd(0) Or dd(1) Then '如果同时按课程和学号或者同时按课程和姓名查询 txtsql = txtsql & "and course_name= '" & txtcourse.Text & "'" Else txtsql = txtsql & "course_name= '" & txtcourse.Text & "'" End If End If End If If Not (dd(0) Or dd(1) Or dd(2) Or dd(3)) Then '没有选择查询方式 MsgBox "请设置查询方式!", vbOKOnly + vbExclamation, "警告" Exit Sub End If txtsql = txtsql & "order by student_id" Set mrc = executesql(txtsql, msgtext) With myflexgrid .Rows = 2 .CellAlignment = 4 .TextMatrix(1, 0) = "考试编号" .TextMatrix(1, 1) = "学号" .TextMatrix(1, 2) = "姓名" .TextMatrix(1, 3) = "班号" .TextMatrix(1, 4) = "课程名称" .TextMatrix(1, 5) = "分数" Do While Not mrc.EOF .Rows = .Rows + 1 .CellAlignment = 4 .TextMatrix(.Rows - 1, 0) = mrc.Fields(0) .TextMatrix(.Rows - 1, 1) = mrc.Fields(1) .TextMatrix(.Rows - 1, 2) = mrc.Fields(2) .TextMatrix(.Rows - 1, 3) = mrc.Fields(3) .TextMatrix(.Rows - 1, 4) = mrc.Fields(4) .TextMatrix(.Rows - 1, 5) = mrc.Fields(5) mrc.MoveNext Loop End With mrc.Close End Sub
其实出现这个问题的原因是有一个很重要的内容没有理解,那就是查询窗体是怎么实现查询功能的?查询时的Select语句有两种不同的情况,一种是:
txtsql = txtsql & "and student_name= '" & txtname.Text & "'"
另一种是:
txtsql = txtsql & "student_name= '" & txtname.Text & "'"
这两句代码其实就差一个“and”,“and”在这里是连接两个字符串,加“and”的一句代码运行的结果是同时按学号和姓名查询,相当于:
txtsql = txtsql & "student_id and student_name= '" & txtname.Text & "'"
不同的查询方式其实是查询的同一张表,只不过是入手点不同,也就是说txtsql = "select * from result_info where " 一句where后面的内容不同,where后面的内容正是查询的入手点。
修改窗体中要注意的问题是删除最后一条记录后会报错,因为原代码中删除最后一条记录后指针不消失,还是指向下一条,结果就会出错,这样的话就需要借用错误语句,也就是说On Error GoTo 语句:
Private Sub deletecommand_Click()
Dim msgtext As String
mybookmark = mrc.Bookmark '对编辑行做标记
str2$ = MsgBox("是否删除当前记录?", vbOKCancel, "删除当前记录")
mrc.Delete
comboexamtype.Text = ""
comboclassno.Text = ""
combosid.Text = ""
combocourse.Text = ""
txtname.Text = ""
txtresult.Text = ""
On Error GoTo CheckDataErr
mrc.MoveFirst
Call viewdata
mybookmark = mrc.Bookmark '使指针指向原来标记的记录行
mcclean = True
CheckDataErr:
If Err = 3021 Then
MsgBox "已删除所有记录!", vbOKOnly + vbExclamation, "警告"
comboexamtype.Text = ""
comboclassno.Text = ""
combosid.Text = ""
combocourse.Text = ""
txtname.Text = ""
txtresult.Text = ""
frmmodifyresult.Hide
End If
End Sub
这样的话,报错问题就会解除了。
学生信息管理系统总结还在进行中。
更新:对代码格式进行修改。原来的代码格式就像后半段的代码,每句的代码都是一行,那是因为我添加代码之后又让代码整体缩进了一下。这样改完之后,两种样式做一下对比,有一个错误的记录。