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

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

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

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


       更新:对代码格式进行修改。原来的代码格式就像后半段的代码,每句的代码都是一行,那是因为我添加代码之后又让代码整体缩进了一下。这样改完之后,两种样式做一下对比,有一个错误的记录。



你可能感兴趣的:(【学生系统】——查询窗体和修改窗体)