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

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


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