摘 要: 針對(duì)目前大多數(shù)Web應(yīng)用系統(tǒng)對(duì)層次編碼處理相對(duì)簡(jiǎn)單導(dǎo)致用戶(hù)操作不便的問(wèn)題,開(kāi)發(fā)了一個(gè)基于Web的層次編碼處理模塊,詳細(xì)介紹了其設(shè)計(jì)與實(shí)現(xiàn)思想。其操作簡(jiǎn)便,易實(shí)現(xiàn),對(duì)開(kāi)發(fā)B/S結(jié)構(gòu)的管理信息系統(tǒng)在處理層次編碼時(shí),提供了一個(gè)很好的解決方案。
關(guān)鍵詞: 層次編碼;Web;應(yīng)用系統(tǒng);Ajax
在管理信息系統(tǒng)(MIS)中,經(jīng)常涉及到對(duì)一些基本信息的管理。為了有效地組織、管理這些信息,開(kāi)發(fā)者往往通過(guò)數(shù)據(jù)編碼來(lái)確保信息的檢索、分類(lèi)、統(tǒng)計(jì)和便于控制,以提高信息的處理效率和利用價(jià)值[1]。編碼設(shè)計(jì)及其管理是信息系統(tǒng)中不可缺少的重要組成部分。在實(shí)際工作中,經(jīng)常遇到一些數(shù)據(jù)之間具有從屬或上下級(jí)關(guān)系的情況,例如機(jī)構(gòu)編制、物資分類(lèi)信息等都具有明顯的上下級(jí)和從屬關(guān)系。這類(lèi)數(shù)據(jù)的編碼就是一種層次編碼。相比較傳統(tǒng)的基于C/S的應(yīng)用系統(tǒng),基于B/S的Web應(yīng)用系統(tǒng)靈活、易維護(hù)、成本低、使用方便、容易被用戶(hù)接受,已成為企業(yè)應(yīng)用的首選[2]。本文以一種典型的層次編碼為例,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于Web的簡(jiǎn)潔美觀、功能強(qiáng)大的單位編碼幫助模塊。該模塊界面如圖1所示。
1 單位編碼幫助模塊功能
如圖1所示界面,左邊顯示上級(jí)單位的編碼和名稱(chēng),并用分隔符分開(kāi),右邊顯示左邊單位的直供單位或下級(jí)單位的編碼和名稱(chēng)。下部是“返回上級(jí)”、“下級(jí)單位”、“確定”、“取消”按鈕。選中左邊某單位,然后單擊“下級(jí)單位”按鈕,界面顯示如圖2所示。
左邊自動(dòng)顯示所選單位的下級(jí)單位,右邊則是左邊默認(rèn)選中單位的下級(jí)單位,這樣逐層展示每層的單位編碼和名稱(chēng),層次結(jié)構(gòu)清晰,便于用戶(hù)查找。
2 模塊實(shí)現(xiàn)的主要技術(shù)
用戶(hù)在操作某張頁(yè)面時(shí),可能多個(gè)地方需調(diào)用幫助模塊,如果每次都提交后臺(tái)處理,則在服務(wù)器上的程序處理頁(yè)面并返回?cái)?shù)據(jù)期間,用戶(hù)只能等待。這樣的Web應(yīng)用程序因用戶(hù)得不到立即的反應(yīng),操作習(xí)慣和思路都會(huì)在每一次提交-等待中被打斷,交互性比較差,達(dá)不到桌面應(yīng)用程序的效果。因而設(shè)計(jì)時(shí)主要考慮兩個(gè)問(wèn)題:是利用Ajax技術(shù)異步調(diào)用數(shù)據(jù),還是直接把數(shù)據(jù)下載到客戶(hù)端進(jìn)行處理;如何按層次展示數(shù)據(jù)。Ajax使用XMLHttpRequest對(duì)象與Web服務(wù)器進(jìn)行異步數(shù)據(jù)交換[3]。但當(dāng)數(shù)據(jù)量比較大時(shí),異步獲取數(shù)據(jù)需較長(zhǎng)的等待時(shí)間,因此可以把數(shù)據(jù)一次性下載到客戶(hù)端再進(jìn)行分層處理。
2.1 服務(wù)器端代碼
首先,在數(shù)據(jù)庫(kù)中建一個(gè)Dwxx表,用dwbm和dwmc兩個(gè)字段對(duì)應(yīng)存儲(chǔ)單位編碼與單位名稱(chēng),以Java平臺(tái)為例,首先可以新建一個(gè)POJO類(lèi)Dwxx:
public class Dwxx implements java.io.Serializable {
private String dwbm;
private String dwmc;
public void setDwbm(String dwbm){
this.dwbm = dwbm;
}
public String getDwbm() {
return dwbm;
}
……
}
然后,定義一個(gè)DwxxService類(lèi)來(lái)組裝數(shù)據(jù),以ArrayList的形式返回客戶(hù)端進(jìn)行處理:
public class DwxxService {//獲取所有單位信息
public ArrayList getDwxx () throws SQLException {
……
ArrayList list = new ArrayList();
String sql ="select dwbm,dwmc from sys_dwxx order by dwbm";
rs=mydb.executeQuery(sql);
while (rs.next()) {
Dwxx dwxx = new Dwxx ();dwxx.setDwxxDwbm
(rs.getString(“dwbm”));
dwxx.setDwxxDwmc(rs.getString(“dwmc”));list.add
(dwxx);
}
……
return list;
}
}
2.2 客戶(hù)端代碼
客戶(hù)端處理代碼封裝成模塊且置入主界面(如index.htm)中。用戶(hù)登錄系統(tǒng)進(jìn)入主界面后自動(dòng)下載單位編碼并生成幫助系統(tǒng)隱藏在客戶(hù)端,載入其他需調(diào)用單位編碼幫助功能的頁(yè)面時(shí)就不必重復(fù)去后臺(tái)下載單位編碼,而是把已生成的模塊由隱藏變?yōu)榭梢?jiàn),這樣大大提高層次編碼的處理速度。代碼以通用的JavaScirpt代碼為主,再輔以少量服務(wù)器端腳本。核心代碼如下:
<SCRIPT LANGUAGE="JavaScript">
/** 單位信息以三個(gè)層次為例,用三個(gè)數(shù)組分別存儲(chǔ)各層數(shù)據(jù),提高了處理效率,更多層次情況做類(lèi)似處理。**/
var dwxxarr1 = new Array(); var dwxxarr2 = new Array();var dwxxarr3 = new Array();
var listl=document.dwform.listl; var listr=document.dwform.listr
// listl,listr分別為左右邊下拉列表
function dwxx(dwbm, dwmc){//構(gòu)造數(shù)據(jù)
this.dwbm=dwbm;this. dwmc=dwmc;
}
function getDwxx(){<% //功能:接收單位編碼和名稱(chēng),根據(jù)
//編碼長(zhǎng)度分別存入到三個(gè)數(shù)組
Dwxx service=new DwxxService ();Dwxx dwxx=null;ArrayList list=new ArrayList();
String dwbm="",dwmc="";list=service.getDwxx ();
for(int i=0;i<list.size();i++){
dwxx=(Dwxx)list.get(i);dwbm=dwxx.getDwbm();dwmc=dwxx.getDwmc();
switch(dwbm.length()){ //假設(shè)單位編碼三位為一級(jí)
case 3:
%> dwxxarr1[dwxxarr1.length]=new dwxx("<%=dwbm%>","<%=dwmc%>"); <% break;
……case 6與case 9做類(lèi)似處理
}%>
}
}
function nextdw(){//功能:處理下級(jí)單位
var selectedvalue= listl.options[listl.selectedIndex].value
switch (selectedvalue.length){
case 3:
removeOptions(document.dwform.listl);
//調(diào)用清除option選項(xiàng)函數(shù)
for(i=0;i<dwxxarr2.length;i++)
if(dwxxarr2[i].dwbm.substring(0,3)==selectedvalue)
listl[listl.length]=new Option(dwxxarr2[i]. dwbm+"|"+dwxxarr2[i].dwmc,dwxxarr2[i].dwbm);
listl.options[0].selected=true;
addOptions(listl.options[listl.selectedIndex].value);
//調(diào)用增加option選項(xiàng)函數(shù)
……//case 6與case 9做類(lèi)似處理
}
}
function priordw(){//功能:處理上級(jí)單位
var selectedvalue= listl.options[listl.selectedIndex].value
switch (selectedvalue.length){
case 6:
removeOptions(listl);
//調(diào)用清除option選項(xiàng)函數(shù)
for(i=0;i<dwxxarr1.length;i++){
listl[listl.length]=new Option(dwxxarr1[i]. dwbm+"|"+dwxxarr1[i].dwmc,dwxxarr1[i].dwbm);
if(dwxxarr1[i].dwbm==selectedvalue.substring(0,3))
listl.options[listl.length-1].selected=true;
}
addOptions(listl.options[listl.selectedIndex].value);
...... //case 9做類(lèi)似處理
}
}
</script>
參照以上設(shè)計(jì)思路,可以實(shí)現(xiàn)如圖3所示的單位編碼維護(hù)模塊。由于篇幅所限,就不再給出處理代碼。
編碼處理是構(gòu)建優(yōu)秀、完善的管理信息系統(tǒng)的重要功能,其效率的高低直接關(guān)系到整個(gè)系統(tǒng)的性能。通過(guò)以上設(shè)計(jì),完成了一個(gè)高效的層次編碼處理模塊。該模塊結(jié)構(gòu)簡(jiǎn)單,稍做修改就可以在.NET平臺(tái)下實(shí)現(xiàn),相對(duì)于大部分系統(tǒng)只列出一個(gè)層次編碼的下拉框來(lái)說(shuō),更符合用戶(hù)使用習(xí)慣,突出特點(diǎn)是對(duì)大數(shù)據(jù)量層次編碼的處理也非常迅速,目前已在多個(gè)大型管理信息系統(tǒng)中采用,受到用戶(hù)一致好評(píng)。此外,本文所提出的開(kāi)發(fā)思路對(duì)處理其他各種復(fù)雜的層次編碼也起著良好的借鑒作用,完全可以運(yùn)用于供貨商編碼、地區(qū)編碼、油品編碼等處理。
參考文獻(xiàn)
[1] 康業(yè)娜,許勇,魏士偉.物流信息系統(tǒng)編碼模型研究[J].微計(jì)算機(jī)信息,2007,36(2):59-60.
[2] 郭曉峰,姚世軍,尹祖?zhèn)?基于.NET的Web應(yīng)用框架的設(shè)計(jì)與應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(2):454-455.
[3] 季強(qiáng),田薇,陳遠(yuǎn).基于Ajax技術(shù)的WebOS系統(tǒng)NixOS的構(gòu)建[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(5):1198-1199.