您的位置:首页 > 其它

【学生系统】——查询窗体和修改窗体

2014-07-27 14:58 141 查看
       学生信息系统的三大窗体就剩下查询窗体和修改窗体了,这两个窗体中没有太多要注意的,除了一般的判断是否为空、是否为数字、是否重复等这些问题以外,修改窗体另外还有一个要注意的问题,这些问题不注意的话,运行时一不小心就会报错。而查询窗体主要是理解代码,其中有一点很难理解,那就是定义的逻辑变量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


这样的话,报错问题就会解除了。

       学生信息管理系统总结还在进行中。

       更新:对代码格式进行修改。原来的代码格式就像后半段的代码,每句的代码都是一行,那是因为我添加代码之后又让代码整体缩进了一下。这样改完之后,两种样式做一下对比,有一个错误的记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: