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