可重用MIS用戶接口模塊的設計
摘 要:通過對MIS通用功能的分析,采用面向對象的繼承機制構造窗口和菜單的整體框架,其中,對數據提交時校驗結果的中文提示方法、打印預覽、用戶定制查詢等進行了比較詳細的研究。有效地解決了界面設計中統一性和特殊需要之間的矛盾。
關鍵詞:用戶界面;管理信息系統;面向對象;可重用
界面是系統提供給用戶的第一感覺,不同開發者制作的界面風格有很大的差異,同一人在不同時間也具有隨意性。因此,無論個人獨自開發系統還是團隊作業,都要對界面進行整體的規劃。
制作統一界面的一般方法是具體而強行的規定,本文依據PB開發的經驗,實現了MIS系統中窗口和菜單的整體繼承框架,并對其中數據校驗結果的中文提示方法、打印預覽、用戶定制查詢和數據窗口的重復使用技術等進行了比較詳細的研究,有效地解決了界面設計中統一性和特殊需要之間的矛盾。
此框架定義的祖先窗口獨立于特定系統,可以為不同系統所使用而不用做任何修改,極大地提高了系統的開發效率和健壯性。
1 統一功能的提取
MIS系統需要實現大量的基本功能,如插入、提交、翻頁等,從權限控制的角度,有讀權限、寫權限和部分寫權限之分,體現在MIS系統設計中,就是查詢權限和錄入權限的區別。常用的操縱數據的命令如表1所示。
從中不難看出,有些命令適用于查詢,而另一些則適用于錄入。為此,可將窗口分為2個類型:一種具有數據錄入的功能,而另外一種只是查詢而已。用于錄入的窗口中可以設置與錄入所需功能命令相對應的菜單項和工具條,用于查詢的窗口可攜帶適合查詢操作的菜單項和工具條。
工具條顯示在屏幕的上方,依據以上分析,完成編輯錄入功能的窗口所帶的菜單中可含15個工具按鈕,如圖1所示。
其功能從左到右依次為:
排序、通用查詢、打印、打印預覽、導入、導出、檢索、新增、刪除、首記錄、前移、后移、末記錄、提交、關閉。
查詢所對應的功能為:通用查詢、打印、打印預覽、導出、首記錄、前移、后移、末記錄、日期段輸入、日期輸入、關閉;其圖形外觀與上面的編輯工具條類似,此處略去。
2 實現
在窗口上定義一個DataWindows控件dw_1,在窗口原有事件的基礎上定義表1所示的用戶自定義事件來操縱dw_1中的數據對象。具體的數據對象在窗口打開時指定。
在窗口所掛的菜單中設置觸發窗口自定義事件所需的子菜單和腳本,并給這些子菜單設置相應的工具條圖標。
下面的程序段是窗口所掛排序菜單的對應腳本,當圖1所示最左邊的排序按鈕被觸發時運行。
工具條上的其他按鈕不需要設置彈起和按下狀態,只需要一條觸發語句就夠了。系統運行時,用戶通過點擊工具條上的按鈕完成對應菜單項腳本的執行,菜單項中的腳本進一步觸發承載此菜單的窗口中的用戶子定義事件的執行。
對一些簡單的輸入、查詢操作,以上事件的定義和工具條的設置基本上滿足了應用要求。大多數窗口中的數據操作圍繞一個DataWindows進行,增加的DataWindows僅用于限制和過濾該中心DataWindows,因此,雖涉及多個DataWindows或其他相關控件,除操作更復雜些外,此基本功能設置也足于解決問題。當窗口上有多個DataWindows的數據需要維護時,可覆蓋祖先事件的腳本,并擴展祖先腳本使其符合新的功能要求。
3 利用繼承機制實現通用功能的一致性
由于以上窗口實現的基本功能在系統中普遍存在,為了減少編程量,提高窗口界面的一致性,可用上面介紹的窗口為祖先,讓其他負責具體事務的窗口來繼承。這樣,所有通過繼承產生的子窗口將不再書寫類似的代碼。系統在初始階段集中精力編制這些通用功能,可以保證功能實現得更加完善。
dw_1控件中數據對象的設置在每個子孫窗口的Open事件中完成,這樣就保重了各窗口所操作的數據是不同的,dw_1控件的大小可視具體的要求進行調整。
按PB中多文檔窗口的操作要求,每一個窗口都有自己的菜單和工具條,為了使菜單保持整體的穩定,即窗口切換時基本菜單功能保持外觀不變,將完成基本功能的模塊結構定義為祖先菜單,通過繼承生成查詢和編輯2個子孫菜單,子孫菜單中分別附加了觸發相關窗口事件所需的菜單項、工具條和腳本。
根據窗口功能的不同,通過繼承產生的窗口可選擇掛2個子孫菜單之一,這樣,特定窗口需要做的只是添加工具條中沒有的功能和控件。只要統一定義了窗口和數據窗口的背景色以及字體的風格、大小和顏色,即使各窗口由不同的人開發、窗口的復雜程度不同,窗口的風格也基本一致。為保證祖先窗口的事件腳本能操縱每一個子孫窗口的數據,只需在程序中將要應用的窗口名改為代詞this即可。工具條的使用,不但簡化了窗口上控件的數目、為數據區留下了更大的顯示空間,而且保證了界面風格的一致。
在實際操作的過程中,當工具條預定義的功能不適合一個特定的窗口應用時,系統可視具體情況對祖先腳本進行不同的覆蓋處理,例如,有些人只有修改權限而沒有插入權,系統會給予必要的提示;有些窗口比較復雜,涉及多個DataWindows的提交,則系統首先覆蓋繼承來的祖先的提交事件腳本,再對提交事件進行必要的、比祖先事件更復雜的處理。如果不允許工具條中的某個功能使用,只需在Open事件中設置他的屬性為Disable即可。
為了使用戶對當前DataWindows中的記錄總數有個總體的把握,系統在祖先窗口中特定義一個單行編輯器sle_1,用于提示總記錄數和當前記錄數。此功能的設置對FREE界面格式的DataWindows用戶尤其有用。實現方法是,在DataWindows的
4 錯誤俘獲及例外處理
對于錯誤的命令和輸入要提供反饋信息,給出正確用法。這一功能雖然不體現在工具條中,但具有通用性,必須由祖先窗口來實現。可以俘獲的例外很多,但MIS涉及的主要是數據庫錯誤,窗口上的其他控件的錯誤可在程序調試時糾正。
在數據提交時,DBMS要進行數據完整性的檢驗,常出現的錯誤有:非空字段沒有輸入值,這時,PB將提示一段出錯信息。遺憾的是,該信息以英文方式顯示,用戶出錯是難免的,怎么用中文實現出錯提示呢?
假如我們在DataWindows中需錄入xqrq(需求日期),該字段由非null約束,若DataWindows控件的Dberror事件中無腳本,而用戶又忘記了錄入此項數據,則提交數據時系統將以英文顯示出錯信息:
第一句指出出錯的位置,最后一句為一般性說明。
當然,數據提交前可以用程序對所有內容進行驗證,但這種解決辦法看似簡單,實現是很麻煩的,需要逐行對各字段可能的錯誤進行分析。實際上,當提交失敗時,DataWindows控件的Dberror事件首先被觸發,并傳遞5個參數,分別為:
sqldbcode(錯誤代碼),sqlerrtext(錯誤提示),sqlsyntax(出錯的語句),buffer(),row(出錯行號)。
因此,可采用以下解決途徑:
在DataWindows控件的Dberror事件中寫腳本:
gf_dbms_error(dw_1,sqldbcode,sqlerrtext,sqlsyntax,row)
其中gf_dbms_error為自定義的專門處理數據庫出錯信息的全局函數,其基本思路是:根據sqldbcode確定錯誤類型,然后從sqlerrtext提示信息中分解出字段名等信息段,根據不同的錯誤類型,重新組合并顯示在顯示器上。當然,若字段名為英文字母,還需將字段名轉換為注釋(一般為中文)。
例如:針對以上提交所碰到的問題,系統提示如圖2所示。
5 打印預覽的實現技術
打印預覽是Windows應用提供給用戶自主進行打印界面設置的一個接口,實現的基本原理是系統根據用戶需求對需預覽的DataWindows的各項默認參數進行修改,由于打印預覽結束后系統還需返回到原狀態,為此,系統不能對原DataWindows進行直接操作,又由于此功能的普遍使用性,在實現上系統將此功能安排在祖先窗口上,由各菜單來觸發該功能的執行,由工具條來具體實施。
實現的關鍵是怎么將要打印預覽的數據傳遞給用于打印預覽的子程序,解決此問題的方法一般有兩種:
(1)將需打印的DataWindows中的數據對象賦予打印預覽窗口中的DataWindows控件的數據對象,將需打印的DataWindows控件中的數據復制到Windows的剪貼板,再從剪貼板上將數據復制到打印預覽窗口中的DataWindows控件中,最后完成對窗口中各項參數的設定。
許多論文中提供了這種方法的實現,PB自帶的一個示例也是這個原理。但應用中存在以下2個主要的缺陷:
首先,若需預覽的DataWindows中帶有下拉子DataWindows,則下拉子DataWindows無法實現自動轉換,即顯示出來的是內部存儲值而不是用戶應該看到的顯示值,因為拷貝過去的是內部存儲值,從而讓用戶感到莫名其妙。為解決此問題,需重新構造各帶下拉子DataWindows的DataWindows的表的關聯關系,涉及到DataWindows中的所有子DataWindows,實現起來工作量和難度均較大,也失去了這一下拉子46DataWindows工具帶來的設計便利;第二個問題是復合報表無法實現預覽,復合報表是一個將多個DataWindows合成為一個DataWindows的技術。因此,此方法并不是一個實用的實現,只能用于最簡單的場合。
(2)設置一個全局的DataWindows控件變量,讓該DataWindows變量共享要進行打印預覽的DataWindows控件,然后對該全局的DataWindows控件變量進行用戶定制設置,則以上問題全部解決。圖3是此思路的具體實現,數據窗口上面一行的控制命令分別為:大小縮放、頁碼、上邊距、左邊距、下邊距、右邊距的直接輸入和點擊按鈕式輸入,最右邊提供的是標尺的選擇。該窗口自帶菜單和工具條,不受繼承機制的限制,工具條中提供了打印等按鈕。
6 通用查詢技術
對常用的查詢,我們可逐一定制,但定制的查詢缺乏靈活性,考慮到定制的查詢并不能完全滿足用戶的實際需要,為此系統可定義通用查詢,并將他列入工具條中,以便隨時訪問,以適應特殊的需求。
實現技術:從數據庫的系統表中提取表名、顯示所需的字段名,以及用于構造邏輯關系的字段名;構造查詢所需的邏輯表達式,并按此邏輯關系檢索數據,確認后可調用打印預覽來顯示。由于有些數據庫不支持漢字表名和字段名,使得表名和字段名需用英文字符書寫,為此真正使用的應該是表和字段的注釋。實現的另一個關鍵問題是動態SQL的構造,比較復雜,在此不一一敘述,具體結果如圖4所示,圖3中顯示的預覽結果就是由此方法構造。
通用查詢雖然提高了系統的靈活性,但操作起來比較復雜,尤其是構造復雜邏輯表達式需要專門知識,且用戶必須非常熟悉數據庫的結構。以上實現只能進行單表查詢,因此,僅做輔助性使用。
7 結 語
本文提供的窗口和菜單繼承機制保證了用戶界面的整體風格,通過仔細地設計工具條和用戶自定義事件,使窗口功能進一步完善,所需控件數目進一步變少。當然,要實現一致的用戶界面,開發者還必須進行相應的統一規定,如字體風格和顏色的統一設定、顯示分辨率設定等等。在項目開發的早期還需定義編輯格式以規范共用的數據字典、定義顯示格式以控制用戶數據的顯示方式,從每一個細節上來保證系統風格的一致。
另外,以上實現的通用界面的祖先窗口可以被所有MIS所使用。
參考文獻
[1]http://www.sybase.com/products/power builder/index.html
[2]http://lin2000.myrice.com/
[3]曉通網絡數據庫研究所.PowerBuilder 6.0/6.5開發與參考手冊[M].呼和浩特:內蒙古人民出版社,1999.
評論