[摘 要] 以基于Web的會計科目輸入處理為例,分析與探討B(tài)/S模式下的信息輸入模塊的設(shè)計與實施方法和步驟,并進一步說明基于ASP的程序設(shè)計要點,提供了相應(yīng)的程序流程和代碼#65377;
[關(guān)鍵詞] B/S模式;管理信息系統(tǒng);會計科目;信息輸入;ASP程序設(shè)計
[中圖分類號]F232[文獻標識碼]A[文章編號]1673-0194(2008)13-0004-05
基于Web的信息輸入設(shè)計屬于一種B/S(瀏覽器/服務(wù)器)模式下的輸入處理設(shè)計,主要包括功能目標的設(shè)計#65380;服務(wù)器端用于保存數(shù)據(jù)的數(shù)據(jù)庫與數(shù)據(jù)表的設(shè)計#65380;瀏覽器端用于信息輸入請求的HTML網(wǎng)頁的設(shè)計#65380;服務(wù)器端用于處理信息輸入請求的ASP網(wǎng)頁的設(shè)計#65377;
1 會計科目輸入處理的功能目標
1. 1基本輸入功能
會計科目輸入處理模塊最基本的功能就是實現(xiàn)會計科目信息的輸入,具體包括:①瀏覽器端含有數(shù)據(jù)輸入?yún)^(qū)域和“確定”#65380;“取消”按鈕,如果在瀏覽器端輸入符合要求的科目編號#65380;科目名稱#65380;借貸方向和期初余額,然后單擊“確定”按鈕,即可將這些數(shù)據(jù)傳遞至服務(wù)器端,再由服務(wù)器進行處理,并將這些數(shù)據(jù)保存在會計科目表文件中;②如果在瀏覽器端輸入數(shù)據(jù)后單擊“取消”按鈕,則可立即清除輸入的這些數(shù)據(jù),等待重新輸入#65377;
1. 2輸入校驗與容錯功能
輸入校驗與容錯是現(xiàn)代信息系統(tǒng)應(yīng)用的必備功能之一,是提高數(shù)據(jù)正確性和系統(tǒng)可靠性的行之有效的方法#65377;會計科目輸入處理模塊除應(yīng)首先實現(xiàn)其基本的輸入功能外,還應(yīng)具備以下輸入校驗與容錯功能:①當瀏覽器端輸入的科目編號低于一級科目的編號長度,或輸入與會計科目表中重復(fù)的科目編號,或輸入的科目編號沒有對應(yīng)的上級科目,或輸入的科目編號有明顯的錯誤時,將進行相關(guān)的出錯提示和相應(yīng)的處理;②當瀏覽器端沒有輸入科目名稱時,按輸入空字符串處理;③當輸入的借貸方向位數(shù)不對時,則進行出錯提示和相應(yīng)處理;④當瀏覽器端沒有輸入期初余額或輸入了僅由空格組成的字符串時,將自動按輸入0處理;當瀏覽器端的期初余額輸入?yún)^(qū)內(nèi)既不是空值,又不是僅由空格形成的字符串,也不是數(shù)字型數(shù)據(jù)時,則進行相應(yīng)的出錯提示和處理#65377;
2 數(shù)據(jù)庫與數(shù)據(jù)表的設(shè)計與實現(xiàn)
數(shù)據(jù)庫與數(shù)據(jù)表的設(shè)計就是根據(jù)需要,選擇Microsoft Access#65380;Oracle#65380;Paradox等數(shù)據(jù)庫管理軟件,在服務(wù)器端建立相應(yīng)的數(shù)據(jù)庫與數(shù)據(jù)表#65377;這里,假定利用Microsoft Access建立數(shù)據(jù)庫文件zwcl.mdb,在數(shù)據(jù)庫中創(chuàng)建與設(shè)計數(shù)據(jù)表,數(shù)據(jù)表名稱為kjkm,數(shù)據(jù)結(jié)構(gòu)如表1所示#65377;

為使文件zwcl.mdb能夠保存通過信息輸入界面輸入的數(shù)據(jù),必須將zwcl.mdb的安全屬性設(shè)置為可修改#65377;步驟是:①在控制面板雙擊“文件夾選項”圖標,會彈出“文件夾選項”對話框,在“查看”選項卡將“使用簡單文件共享(推薦)”復(fù)選框前面的對號去掉,再單擊“確定”按鈕;②在zwcl.mdb所在文件夾,用鼠標右鍵單擊該文件名(或該文件圖標),再在彈出的快捷菜單單擊“屬性”選項,在“屬性”對話框的“安全”選項卡將Users的權(quán)限設(shè)置為允許完全控制,然后單擊“確定”按鈕#65377;
3 信息輸入請求網(wǎng)頁的設(shè)計與實現(xiàn)
3. 1信息輸入界面與HTML代碼
信息輸入請求網(wǎng)頁的設(shè)計就是設(shè)計一個用于信息輸入的界面或網(wǎng)頁,通過該界面或網(wǎng)頁可以向數(shù)據(jù)表輸入記錄#65377;
設(shè)計會計信息輸入界面如圖1所示#65377;該輸入界面包含4個用于信息輸入的區(qū)域,分別與kjkm數(shù)據(jù)表的4個字段相對應(yīng);另含有“確定”和“取消”按鈕,分別用于向服務(wù)器發(fā)出服務(wù)請求和清除輸入?yún)^(qū)內(nèi)容#65377;為實現(xiàn)此功能,可利用“記事本”等編輯軟件建立純文本格式的HTML文件#65377;
假設(shè)該輸入請求網(wǎng)頁的文件名為accountinput.htm,其HTML代碼如下所示:
<form action="accountinput.asp" method="post">
<table align="center" border=1>
<caption> <font face="隸書" size=6>會計科目設(shè)置
</font></caption>
<tr> <td>科目編號:</td> <td> <input type="text" name="kmbh"> </td> </tr>
<tr> <td>科目名稱:</td> <td> <input type="text" name="kmmc"> </td> </tr>
<tr> <td>借貸方向:</td> <td> <input type="text" name="jdfx"> </td> </tr>
<tr> <td>期初余額:</td> <td> <input type="text" name="qcye"> </td></tr>
</table>
<p align=center>
<input type="submit" value="確定" >
<input type="reset" value="取消" >
</p>
</form>
3. 2信息輸入請求網(wǎng)頁的HTML代碼說明
(1)<form>與</form>標記指定上述網(wǎng)頁是一個HTML表單,action="accountinput.asp"表明處理該HTML表單的程序是accountinput.asp,而method="post"指明該HTML表單采用POST方法向ASP文件傳遞數(shù)據(jù)#65377;
(2)<table>與</table>之間是一個表格,<table align=
"center" border=1>表示表格居中,表格邊框?qū)挾葹?#65377;
<caption> <font face="隸書" size=6>與</font> </caption>之間是表格的標題并指定了標題的字體和大小,<tr>與</tr>之間是表格的一行,<td>與</td>之間是表格中單元格的內(nèi)容,<input type="text" name="kmbh">表示一個Name屬性值為kmbh的單行文本輸入?yún)^(qū)域#65377;
(3)<p>與</p>是段落標記,<input type="submit" value="確定" >是一個將表單內(nèi)容提交給服務(wù)器的#65380;value屬性值為“確定”的按鈕,<input type="reset" value="取消" >是一個用于清除輸入?yún)^(qū)內(nèi)容的#65380;value屬性值為“取消”的按鈕#65377;
4 輸入請求處理的設(shè)計與實現(xiàn)
4. 1關(guān)于科目編號的基本假設(shè)
會計科目輸入請求的處理與科目編號的設(shè)計有必然的聯(lián)系,科目編號的設(shè)計方案會直接影響會計科目輸入請求的處理流程#65377;這里按照通常的做法,假定一級科目的科目編號占4位,n級科目的科目編號占(2n+2)位#65377;如1001代表一級科目,100101#65380;10010101分別代表二級#65380;三級科目#65377;這樣設(shè)計時,科目編號的位數(shù)必定大于或等于4,其位數(shù)也一定是偶數(shù),而且,超過4位的科目編號截去最右邊的兩位后所剩余的部分就是對應(yīng)的上級科目#65377;表1中kmbh的字段大小可據(jù)實際需要設(shè)計更為合理的值#65377;
4. 2輸入請求處理的程序流程
用戶在瀏覽器上運行數(shù)據(jù)輸入的網(wǎng)頁accountinput.htm,將出現(xiàn)會計科目輸入界面,如圖1所示#65377;這是一個數(shù)據(jù)輸入網(wǎng)頁,在網(wǎng)頁上輸入數(shù)據(jù)后,如果單擊“取消”按鈕,原輸入的內(nèi)容將作廢,同時各輸入文本框的內(nèi)容被清空;如果單擊“確定”按鈕,將向服務(wù)器發(fā)出服務(wù)請求,服務(wù)器將根據(jù)accountinput.asp的程序代碼進行相應(yīng)的處理,即:當輸入界面中輸入的科目編號低于4位,或雖不低于4位但位數(shù)不對(位數(shù)為奇數(shù)),或科目編號重復(fù),或無上級科目,或借貸方向#65380;期初余額不符合要求時,表單上的數(shù)據(jù)不能被保存到kjkm數(shù)據(jù)表,并由服務(wù)器向瀏覽器傳送相應(yīng)的提示信息;否則,當輸入界面輸入的數(shù)據(jù)符合保存的條件時,就立即添加到kjkm數(shù)據(jù)表中,并使瀏覽器端重定向到數(shù)據(jù)輸入網(wǎng)頁accountinput.htm,等待繼續(xù)輸入#65377;更詳細的數(shù)據(jù)輸入處理流程如圖2所示#65377;
4. 3輸入請求處理的ASP代碼


單擊會計科目輸入界面(圖1)中的“確定”按鈕,服務(wù)器將根據(jù)accountinput.asp的代碼接受輸入請求,并進行相應(yīng)的處理#65377;按照圖2所示的數(shù)據(jù)輸入處理流程,設(shè)計accountinput.asp的程序代碼如下所示:
<%
k=0
kmbh1=trim(request("kmbh"))
kmmc1=trim(request("kmmc"))
jdfx1=trim(request("jdfx"))
if trim(request("qcye"))="" then
qcye1=0
else
qcye1=request("qcye")
end if
if len(kmbh1)>=4 then
set conn=server.createobject("adodb.connection")
conn.open "Driver={Microsoft Access Driver (*.MDB)};DBQ="_
server.mappath("zwcl.MDB")
set rs=server.createobject("adodb.recordset")
rs.open "select*from kjkm where kmbh=′"kmbh1
"′",conn
if rs.eof then
if len(kmbh1)>4 then
if int(len(kmbh1)/2)=len(kmbh1)/2 then
rs.close
rs.open "select*from kjkm where kmbh=′"left(kmbh1,len(kmbh1)-2)"′",conn
if rs.eof then
response.write "<a href=javascript:history.back()>"
response.write "無上級科目,請返回輸入上級科目!</a>"
else
k=1
end if
else
response.write "<a href=javascript:history.back()>"
response.write "科目編號位數(shù)不對,請返回重新輸入!</a>"
end if
else
k=1
end if
else
response.write "< a href=javascript:history.back()>"
response.write "科目編號不能重復(fù),請返回重新輸入!</a>"
end if
if k=1 then
if len(jdfx1)=1 then
if isNumeric(qcye1) then
rs.close
rs.open "kjkm",conn,,2
rs.addnew
rs("kmbh")=kmbh1
rs("kmmc")=kmmc1
rs("jdfx")=jdfx1
rs("qcye")=qcye1
rs.update
response.redirect "accountinput.htm"
else
response.write "<a href=javascript:history.back()>"
response.write "期初余額不對,請返回重新輸入!</a>"
end if
else
response.write "<a href=javascript:history.back()>"
response.write "借貸方向不對,請返回重新輸入!</a>"
end if
end if
rs.close
set rs=nothing
conn.close
set conn=nothing
else
response.write "<a href=javascript:history.back()>"
response.write "科目編號不能低于4位,請返回重新輸入!</a>"
end if
%>
4. 3輸入請求處理的ASP代碼說明
(1)k是一個控制變量,賦初值為0#65377;當瀏覽器端輸入的會計科目為一級科目(科目編號長度等于4),且在kjkm數(shù)據(jù)表中沒有匹配的記錄時,將k的值修改為1#65377;同樣,當輸入的科目編號長度大于4,且位數(shù)為偶數(shù),并存在上級科目時,也將k的值修改為1#65377;只有當k=1時,才根據(jù)瀏覽器端輸入的借貸方向和期初余額的正確性來決定是否執(zhí)行數(shù)據(jù)保存操作#65377;
(2)kmbh1=trim(request("kmbh"))用于將瀏覽器端會計科目輸入網(wǎng)頁上的科目編號的值(對應(yīng)于圖1中的1001)保存在中間變量kmbh1中#65377;變量kmbh是accountinput.htm中定義的該文本框的Name屬性,trim(request("kmbh"))用于截去所獲得的科目編號數(shù)據(jù)的前導(dǎo)與后續(xù)空格#65377;由于瀏覽器端的accountinput.htm指定采用POST方法向服務(wù)器傳遞數(shù)據(jù),因此,可直接采用Request對象的Form集合來取得kmbh的值#65377;這樣,request("kmbh")也可寫成request.form("kmbh")#65377;同理,kmmc1#65380;jdfx1#65380;qcye1分別用于接收瀏覽器端傳遞過來的科目名稱#65380;借貸方向#65380;期初余額#65377;
(3)當瀏覽器端未輸入某項數(shù)據(jù)(或輸入了只含有空格的字符串)時,傳遞過來的數(shù)據(jù)為空字符串#65377;例如,如果trim(request("qcye"))="",就表示瀏覽器端傳遞過來的期初余額為空字符串#65377;由于期初余額是數(shù)字型數(shù)據(jù),當瀏覽器端的期初余額輸入?yún)^(qū)內(nèi)未輸入任何字符(或輸入了只含有空格的字符串)時,應(yīng)將qcye1的值當成0對待;否則,用qcye1接收瀏覽器端傳遞過來的期初余額數(shù)據(jù)#65377;這時,qcye1可能為數(shù)字型數(shù)據(jù),也可能為文本型數(shù)據(jù)#65377;如果qcye1不為數(shù)字型數(shù)據(jù),說明瀏覽器端輸入的期初余額肯定有錯誤#65377;
(4)if len(kmbh1)>=4用于判斷瀏覽器端輸入的科目編號的長度是否不小于4,而if int(len(kmbh1)/2)=len(kmbh1)/2用于判斷科目編號的位數(shù)是否為偶數(shù)#65377;當長度小于4時,科目編號一定不正確,需要提示“科目編號不能低于4位,請返回重新輸入!”#65377;當科目編號位數(shù)不是偶數(shù)時,應(yīng)提示“科目編號位數(shù)不對,請返回重新輸入!”#65377;
(5)set conn=server.createobject("adodb.connection")用于建立一個連接對象#65377;
(6)conn.open用于與數(shù)據(jù)庫建立連接,其后的字符串一定要寫正確,例如,單詞之間#65380;Driver與(*.MDB)之間必須有空格,否則運行時會出問題#65377;下劃線_是續(xù)行符,Server.mappath("zwcl.MDB")用于將數(shù)據(jù)庫文件zwcl.MDB的相對路徑映射到服務(wù)器上相應(yīng)的真實路徑上,是字符串連接符#65377;如果已經(jīng)在ODBC數(shù)據(jù)源管理器的“系統(tǒng)DSN”選項卡為數(shù)據(jù)庫文件zwcl.MDB建立了名稱為zhangwu的系統(tǒng)數(shù)據(jù)源,也可以利用conn.open "zhangwu"或conn.open "DSN=zhangwu"與數(shù)據(jù)庫建立鏈接#65377;
(7)set rs=server.createobject("adodb.recordset")用于建立一個記錄集對象#65377;
(8)rs.open "select*from kjkm where kmbh=′"kmbh1"′",conn用于打開和查找kjkm數(shù)據(jù)表中指定科目編號的記錄#65377;例如,當科目編號為1001時,該語句相當于rs.open "select*from kjkm where kmbh=′1001′",conn#65377;同理,rs.open "select*from kjkm where kmbh=′"left(kmbh1,len(kmbh1)-2)"′",conn用于打開和查找kjkm數(shù)據(jù)表中是否存在某科目的上級科目,left(kmbh1,len(kmbh1)-2)的作用是將kmbh1中最右邊的兩位截去后形成的字符串,就是kmbh1的上級科目的科目編號#65377;使用rs.open語句之前必須用rs.close語句關(guān)閉先前打開的數(shù)據(jù)源#65377;
(9)rs.eof表示記錄指針指向了文件尾(或最后一條記錄之后),這里是指沒有在kjkm數(shù)據(jù)表中找到相關(guān)的記錄#65377;
(10)response.write "<a href=javascript:history.back()>"和response.write "無上級科目,請返回輸入上級科目!</a>"可合寫為response.write "<a href=javascript:history.back()>無上級科目,請返回輸入上級科目!</a>",其作用是向瀏覽器端輸出關(guān)于“無上級科目,請返回輸入上級科目!”的超鏈接,當單擊此超鏈接時,瀏覽器端出現(xiàn)前一個網(wǎng)頁頁面(這里是accountinput.htm所表示的會計科目輸入網(wǎng)頁,可以看到原先輸入的信息)#65377;
(11)if len(jdfx1)=1用于判斷jdfx1的長度是否為1#65377;由于借貸方向的字段大小設(shè)計為1(如表1所示),所以,當jdfx1的長度不為1時,應(yīng)提示“借貸方向不對,請返回重新輸入!”#65377;
(12)if isNumeric (qcye1))用于判斷瀏覽器端所輸入的期初余額(qcye)是否為一個數(shù)字型數(shù)據(jù),當qcye1的值不是數(shù)字型時應(yīng)在瀏覽器端提示“期初余額不對,請返回重新輸入!”#65377;
(13)rs.open "kjkm",conn,,2的作用是打開kjkm數(shù)據(jù)表,并指定鎖定類型的值為2(保守式),采用默認的游標類型#65377;也可將鎖定類型的值指定為3(開放式),寫為rs.open "kjkm",conn,,3#65377;注意此語句之前必須用rs.close語句關(guān)閉先前打開的數(shù)據(jù)源#65377;
(14)rs.addnew與rs.update之間的代碼的作用是向kjkm數(shù)據(jù)表添加一條記錄#65377;其中,rs("kmbh")=kmbh1是將字段kmbh的值保存為瀏覽器端輸入的科目編號的值,該語句也可寫成rs.fields.item("kmbh")=kmbh1#65377;
(15)response.redirect "accountinput.htm"是將頁面跳轉(zhuǎn)到accountinput.htm所表示的會計科目輸入網(wǎng)頁#65377;
(16)rs.close和set rs=nothing的作用是關(guān)閉并釋放記錄集對象,conn.close和set conn=nothing的作用是關(guān)閉與數(shù)據(jù)庫的鏈接并釋放鏈接對象#65377;
主要參考文獻
[1] 李國紅. 管理信息系統(tǒng)數(shù)據(jù)輸入模塊的設(shè)計與實現(xiàn)——兼論會計科目的輸入設(shè)計[J]. 中國管理信息化, 2006(11):19-22.
[2] 陳建偉,李美軍,施建強. ASP動態(tài)網(wǎng)站開發(fā)教程[M]. 第2版. 北京: 清華大學(xué)出版社, 2005.