详解软件工程之第一要务需求分析

2021-01-29 13:57:18 浏览数 (1)

机房收费系统基本算是竣工了,但是学到了很多的东西,我们先从宏观再到微观,一点点的介绍学习的过程。

开始做机房收费系统的时候,没有很好地认识到需求分析的重要,也没有很重视,总觉得反正自己不懂就不懂着做吧,就胡乱点了一天,知道一个大概就开始动工了。当机房收费系统做到多半时,所有的问题都暴露出来了。数据库中少数据需要改,数据库改了,更得需要改代码,涉及到错误表的所有窗体都需要重新修改。

机房收费系统给我上了一堂教育课,深刻体会到了需求的重要性,没有需求,何谈编程,更不用谈数据库以及数据结构、表与表之间的关系,没有需求不意味什么都没有也差不多。即使你将数据库以及代码做完了,但是用户的需求和功能要求基本等于零,相当于没有该工程。

简单的说,需求:用户有什么样的要求,工程应该符合什么条件和具有什么功能。

需求分析:对需求进行分析,就是解决问题,要输入什么数据,得到什么结果,最后应该输出什么。

时间是贯穿机房收费系统始终的线索,时时刻刻都陪伴在系统的左右。恋人说,时间是感情最好的疗伤药,可以冲淡一切。对于程序员来说,时间是数据记录最有效的手段,虽然隐身,但如影随行。

学生完成上机其实挺简单只有三步:先注册,登录上机、下机,但是过程却很复杂。

值班老师分为三个级别:一般教师、操作员、管理员。

宏观到这里了,下面介绍一下微观,微观涉及到细节,代码指定是少不了的部分,代码的实现为解决需求中的问题。代码是编程中最简单的过程,也是编程中技术含量最低的层次。有了需求和数据表,任何一个“码农”都可以做到。

机房收费系统中最让人头疼当数三个条件的组合查询:

代码展示如下:

代码语言:javascript复制
Private Sub cmdChk_Click()
    Dim strFld(3) As String '字段
    Dim strRelate(2) As String '组合关系

    '判断字段名1是否为空,为空提示信息
    If cmbFld1.Text = "" Then
        MsgBox "请选择第一个字段名!", vbOKOnly   vbExclamation, "提示"
        cmbFld1.SetFocus
        Exit Sub

    End If

    Select Case cmbFld1.ListIndex
        Case 0
        strFld(0) = "card_No"
        Case 1
        strFld(0) = "student_Name"
        Case 2
        strFld(0) = "onday"
        Case 3
        strFld(0) = "ontime"
        Case 4
        strFld(0) = "offday"
        Case 5
        strFld(0) = "offtime"
        Case 6
        strFld(0) = "consumemoney"
        Case 7
        strFld(0) = "remainmoney"
        Case 8
        strFld(0) = "status"
    End Select

    '判断操作符1是否为空,为空提示信息
    If cmbString1.Text = "" Then
        MsgBox "请选择第一个操作符!", vbOKOnly   vbExclamation, "提示"
        cmbString1.SetFocus
        Exit Sub
    End If
    '当选择字段2时
    Select Case cmbFld2.ListIndex
        Case 0
        strFld(1) = "card_No"
        Case 1
        strFld(1) = "student_Name"
        Case 2
        strFld(1) = "onday"
        Case 3
        strFld(1) = "ontime"
        Case 4
        strFld(1) = "offday"
        Case 5
        strFld(1) = "offtime"
        Case 6
        strFld(1) = "consumemoney"
        Case 7
        strFld(1) = "remainmoney"
        Case 8
        strFld(1) = "status"
    End Select
  
    Select Case cmbRelate1.ListIndex
        Case 0
        strRelate(0) = "and"
        Case 1
        strRelate(0) = "or"
    End Select
    '    '******************************************************************
    '当选择字段3时
    Select Case cmbFld3.ListIndex
        Case 0
        strFld(2) = "card_No"
        Case 1
        strFld(2) = "student_Name"
        Case 2
        strFld(2) = "onday"
        Case 3
        strFld(2) = "ontime"
        Case 4
        strFld(2) = "offday"
        Case 5
        strFld(2) = "offtime"
        Case 6
        strFld(2) = "consumemoney"
        Case 7
        strFld(2) = "remainmoney"
        Case 8
        strFld(2) = "status"
    End Select
    Select Case cmbRelate2.ListIndex
        Case 0
        strRelate(1) = "and"
        Case 1
        strRelate(1) = "or"
    End Select
    '*************************************************************
    '判断要查询的内容是否为空,为空提示信息
    If txtChk1.Text = "" Then
        mshflgStuLogonInfo.clear
        MsgBox "请选择第一个查询内容!", vbOKOnly   vbExclamation, "提示"
        txtChk1.SetFocus
        Exit Sub
    End If
    '第一个组合关系
    If cmbRelate1.Text = "" Then
    
       '判断第一个组合关系是否为空,若为空,提示信息
            If (cmbFld2.Text <> "" Or cmbString2.Text <> "" Or txtChk2.Text <> "") And cmbRelate1.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第一个组合关系!", vbOKOnly   vbExclamation, "提示"
                Exit Sub
            End If
            
        '查询记录
        strLineSQL = "select * from line_info where " & strFld(0) & "" & Trim$(cmbString1.Text) & " '" & Trim$(txtChk1.Text) & "'"
        Set adoLineRst = ExecuteSQL(strLineSQL, strLineMsg)
        If adoLineRst.EOF Then
            mshflgStuLogonInfo.clear
            MsgBox "没有此记录", vbOKOnly   vbExclamation, "提示"
            Exit Sub
        Else
            Call ViewData '查询数据
        End If
    Else
        '第二个组合关系
        If cmbRelate2.Text = "" Then
            '判断字段2是否为空,为空提示信息
            If cmbFld2.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第二个字段名!", vbOKOnly   vbExclamation, "提示"
                cmbFld2.SetFocus
                Exit Sub
            End If
            '判断操作符2是否为空,为空提示信息
            If cmbString2.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第二个操作符!", vbOKOnly   vbExclamation, "提示"
                cmbString2.SetFocus
                Exit Sub
            End If
            '判断要查询的内容是否为空,为空提示信息
            If txtChk2.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第二个查询内容!", vbOKOnly   vbExclamation, "提示"
                txtChk2.SetFocus
                Exit Sub
            End If
             '判断第二个组合关系是否为空,若为空,提示信息
            If (cmbFld3.Text <> "" Or cmbString3.Text <> "" Or txtChk3.Text <> "") And cmbRelate2.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第二个组合关系!", vbOKOnly   vbExclamation, "提示"
                Exit Sub
            End If
            '查询记录
            strLineSQL = "select * from line_info where " & strFld(0) & " " & Trim$(cmbString1.Text) & vbCrLf _
                        & "'" & Trim$(txtChk1.Text) & "'" & " " & strRelate(0) & " " & strFld(1) & " " & Trim$(cmbString2.Text) & " '" & Trim$(txtChk2.Text) & "'"

            'strtxtSQL = "select * from Up where" & Trim$(cboFileName1.Tag) & " " & Trim$(cboSign1.Text) & "'" & Trim$(txtInquire1.Text) & ""
            '" & Trim$(cboRelation1.Tag) & "" &Trim(cboFileName2.Tag) & " " & Trim$(cboSign2.Text) &"
            '" & Trim$(txtInquire2.Text) & "'"
            Set adoLineRst = ExecuteSQL(strLineSQL, strLineMsg)
            If adoLineRst.EOF Then
                mshflgStuLogonInfo.clear
                MsgBox "没有此记录", vbOKOnly   vbExclamation, "提示"
                Exit Sub
            Else
                Call ViewData '查询数据
            End If
        Else
            '查询并显示符合三个条件的记录
            If cmbFld3.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第三个字段名!", vbOKOnly   vbExclamation, "提示"
                cmbFld3.SetFocus
                Exit Sub
            End If
            '判断操作符3是否为空,为空提示信息
            If cmbString3.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第三个操作符!", vbOKOnly   vbExclamation, "提示"
                cmbString3.SetFocus
                Exit Sub
            End If
            '判断要查询的内容是否为空,为空提示信息
            If txtChk3.Text = "" Then
                mshflgStuLogonInfo.clear
                MsgBox "请选择第三个查询内容!", vbOKOnly   vbExclamation, "提示"
                txtChk3.SetFocus
                Exit Sub
            End If
            strLineSQL = "select * from line_info where" & " " & strFld(0) & " " & Trim$(cmbString1.Text) & vbCrLf _
                        & " '" & Trim$(txtChk1.Text) & "'" & " " & strRelate(0) & " " & strFld(1) & " " & Trim$(cmbString2.Text) & vbCrLf _
                        & " '" & Trim$(txtChk2.Text) & "'" & " " & strRelate(1) & " " & strFld(2) & " " & Trim$(cmbString3.Text) & vbCrLf _
                        & " '" & Trim$(txtChk2.Text) & "'"

            Set adoLineRst = ExecuteSQL(strLineSQL, strLineMsg)
            If adoLineRst.EOF Then
                mshflgStuLogonInfo.clear
                MsgBox "没有此记录", vbOKOnly   vbExclamation, "提示"
                Exit Sub
            Else
                Call ViewData '查询数据
            End If

        End If
    End If
End Sub

Private Sub Form_Load()
     '显示cmbfld1的内容
     cmbFld1.AddItem "卡号"
    cmbFld1.AddItem "姓名"
    cmbFld1.AddItem "上机日期"
    cmbFld1.AddItem "上机时间"
    cmbFld1.AddItem "下机日期"
    cmbFld1.AddItem "下机时间"
    cmbFld1.AddItem "消费金额"
    cmbFld1.AddItem "余额"
    cmbFld1.AddItem "备注"
    
    '显示cmbfld2的内容
     cmbFld2.AddItem "卡号"
    cmbFld2.AddItem "姓名"
    cmbFld2.AddItem "上机日期"
    cmbFld2.AddItem "上机时间"
    cmbFld2.AddItem "下机日期"
    cmbFld2.AddItem "下机时间"
    cmbFld2.AddItem "消费金额"
    cmbFld2.AddItem "余额"
    cmbFld2.AddItem "备注"
    
    '显示cmbfld3的内容
    cmbFld3.AddItem "卡号"
    cmbFld3.AddItem "姓名"
    cmbFld3.AddItem "上机日期"
    cmbFld3.AddItem "上机时间"
    cmbFld3.AddItem "下机日期"
    cmbFld3.AddItem "下机时间"
    cmbFld3.AddItem "消费金额"
    cmbFld3.AddItem "余额"
    cmbFld3.AddItem "备注"
    
    '显示cmbString1的内容
    cmbString1.AddItem "="
    cmbString1.AddItem "<"
    cmbString1.AddItem ">"
    cmbString1.AddItem "<>"
    
    '显示cmbString2的内容
    cmbString2.AddItem "="
    cmbString2.AddItem "<"
    cmbString2.AddItem ">"
    cmbString2.AddItem "<>"
    
    '显示cmbString3的内容
    cmbString3.AddItem "="
    cmbString3.AddItem "<"
    cmbString3.AddItem ">"
    cmbString3.AddItem "<>"
    
    '显示cmbrelate1的内容
    cmbRelate1.AddItem "与"
    cmbRelate1.AddItem "或"
    
    '显示cmbrelate2的内容
    cmbRelate2.AddItem "与"
    cmbRelate2.AddItem "或"
End Sub

Public Function ViewData()
     With mshflgStuLogonInfo
        .Rows = 1
        .CellAlignment = 4
        .TextMatrix(0, 0) = "卡号"
        .TextMatrix(0, 1) = "姓名"
        .TextMatrix(0, 2) = "上机日期"
        .TextMatrix(0, 3) = "上机时间"
        .TextMatrix(0, 4) = "下机日期"
        .TextMatrix(0, 5) = "下机时间"
        .TextMatrix(0, 6) = "消费金额"
        .TextMatrix(0, 7) = "余额"
        .TextMatrix(0, 8) = "备注"
    End With
    ’显示查询的内容
    Do While Not adoLineRst.EOF
        With mshflgStuLogonInfo
            .Rows = .Rows   1
            .CellAlignment = 4
            .TextMatrix(.Rows - 1, 0) = Trim$(adoLineRst.Fields("card_No"))
            .TextMatrix(.Rows - 1, 1) = Trim$(adoLineRst.Fields("student_Name"))
            .TextMatrix(.Rows - 1, 2) = Trim$(adoLineRst.Fields("onday"))
            .TextMatrix(.Rows - 1, 3) = Trim$(adoLineRst.Fields("offtime"))
            .TextMatrix(.Rows - 1, 4) = Trim$(adoLineRst.Fields("offday"))
            .TextMatrix(.Rows - 1, 5) = Trim$(adoLineRst.Fields("offtime"))
            .TextMatrix(.Rows - 1, 6) = Trim$(adoLineRst.Fields("consumemoney"))
            .TextMatrix(.Rows - 1, 7) = Trim$(adoLineRst.Fields("remainmoney"))
            .TextMatrix(.Rows - 1, 8) = Trim$(adoLineRst.Fields("status"))
            adoLineRst.MoveNext
        End With
    Loop
    '释放记录集
    adoLineRst.Close
End Function

其实说实话,上面的代码并不是很完美,还存在一点逻辑上的错误:从图中可以看出,当执行两个组合查询同时执行时,我们的初衷要先执行第一个组合关系再执行第二个组合关系。

若第一个组合关系为“或”,第二个组合关系为“与”,这是就出错误,计算机不仅没有按照我们的要求执行,反而先执行的“与”关系,再执行“或”。对于解决一般问题当然没有任何问题,就当是给自己时时刻刻的提醒吧。

机房收费系统虽然已经告一段落,但是学习并没有因此止步,革命尚未成功,同志更需要努力

0 人点赞