詳解軟體工程之第一要務需求分析
本文作者:廊坊師範學院九期資訊科技提高班 於亮
機房收費系統基本算是竣工了,但是學到了很多的東西,我們先從巨集觀再到微觀,一點點的介紹學習的過程。
開始做機房收費系統的時候,沒有很好地認識到需求分析的重要,也沒有很重視,總覺得反正自己不懂就不懂著做吧,就胡亂點了一天,知道一個大概就開始動工了。當機房收費系統做到多半時,所有的問題都暴露出來了。資料庫中少資料需要改,資料庫改了,更得需要改程式碼,涉及到錯誤表的所有窗體都需要重新修改。
機房收費系統給我上了一堂教育課,深刻體會到了需求的重要性,沒有需求,何談程式設計,更不用談資料庫以及資料結構、表與表之間的關係,沒有需求不意味什麼都沒有也差不多。即使你將資料庫以及程式碼做完了,但是使用者的需求和功能要求基本等於零,相當於沒有該工程。
簡單的說,需求:使用者有什麼樣的要求,工程應該符合什麼條件和具有什麼功能。
需求分析:對需求進行分析,就是解決問題,要輸入什麼資料,得到什麼結果,最後應該輸出什麼。
時間是貫穿機房收費系統始終的線索,時時刻刻都陪伴在系統的左右。戀人說,時間是感情最好的療傷藥,可以沖淡一切。對於程式設計師來說,時間是資料記錄最有效的手段,雖然隱身,但如影隨行。
學生完成上機其實挺簡單隻有三步:先註冊,登入上機、下機,但是過程卻很複雜。
值班老師分為三個級別:一般教師、操作員、管理員。
巨集觀到這裡了,下面介紹一下微觀,微觀涉及到細節,程式碼指定是少不了的部分,程式碼的實現為解決需求中的問題。程式碼是程式設計中最簡單的過程,也是程式設計中技術含量最低的層次。有了需求和資料表,任何一個“碼農”都可以做到。
機房收費系統中最讓人頭疼當數三個條件的組合查詢:
程式碼展示如下:
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
其實說實話,上面的程式碼並不是很完美,還存在一點邏輯上的錯誤:從圖中可以看出,當執行兩個組合查詢同時執行時,我們的初衷要先執行第一個組合關係再執行第二個組合關係。
若第一個組合關係為“或”,第二個組合關係為“與”,這是就出錯誤,計算機不僅沒有按照我們的要求執行,反而先執行的“與”關係,再執行“或”。對於解決一般問題當然沒有任何問題,就當是給自己時時刻刻的提醒吧。
機房收費系統雖然已經告一段落,但是學習並沒有因此止步,革命尚未成功,同志更需要努力。
軟體工程的學習是很簡單的,希望我的分享對您有幫助,並希望大家提供寶貴的建議。