董 琴
(鹽城工學(xué)院 實驗教學(xué)部, 鹽城 224051)
PowerBuilder提供了對目前流行的大多數(shù)關(guān)系數(shù)據(jù)庫管理系統(tǒng)的支持,由于在PowerBuilder的應(yīng)用程序中對數(shù)據(jù)庫訪問的部分一般采用國際化標(biāo)準(zhǔn)數(shù)據(jù)庫查詢語言SQL,使得用PowerBuilder開發(fā)的應(yīng)用程序可以不做修改或者只做少量的修改就可以在不同的后臺數(shù)據(jù)庫管理系統(tǒng)上使用。也就是說用PowerBuilder開發(fā)的應(yīng)用程序是獨立于服務(wù)器上的數(shù)據(jù)庫管理系統(tǒng)的。PowerBuilder是一種面向?qū)ο蟮拈_發(fā)工具,各種WINDOWS應(yīng)用程序中常見的窗口、菜單、控件等在PowerBuilder中都是一個個的對象。在PowerBuilder中我們還可以創(chuàng)建自己的用戶對象。特別要指出的是PowerBuilder提供了對面向?qū)ο蠓椒ㄖ械母鞣N技術(shù)的全面支持,我們可以利用面向?qū)ο蠓椒ㄖ械膶ο蟮姆庋b性、繼承性、多態(tài)性等特點使得我們開發(fā)的應(yīng)用程序具有極大的可重用性和可擴展性,而這一點正是軟件工程中對應(yīng)用程序所提出的重要目標(biāo)。
對客戶端軟件開發(fā)我們用PowerBuilder編程語言實現(xiàn)。PowerBuilder是一種目前流行的數(shù)據(jù)庫前端開發(fā)工具,相對于其他的客戶機/服務(wù)器開發(fā)工具而言,PowerBuilder提供的開發(fā)環(huán)境更加方便快捷,而且功能也更為強大,特別適合做信息系統(tǒng)的開發(fā),它為開發(fā)人員提供豐富的對象、控件、函數(shù)以及良好的用戶界面,支持目前流行的數(shù)據(jù)庫,支持Web應(yīng)用的開發(fā),支持應(yīng)用的跨平臺開發(fā)和分布,極大地減輕了程序員在不同平臺上移植程序的工作量。PowerBuilder提出了數(shù)據(jù)窗口(DataWindow)對象的概念。數(shù)據(jù)窗口對象是PowerBuilder中的一種對象類型,是專門為訪問后臺的數(shù)據(jù)庫服務(wù)的,在數(shù)據(jù)窗口對象中我們定義了數(shù)據(jù)的來源和數(shù)據(jù)的顯示風(fēng)格。PowerBuilder在數(shù)據(jù)窗口對象中提供了豐富的數(shù)據(jù)顯示方式,可以滿足各種不同的需要。我們應(yīng)用中的很多報表就是通過數(shù)據(jù)窗口對象來實現(xiàn)的,如果要更改報表的數(shù)據(jù)內(nèi)容和顯示格式,也只要對相應(yīng)的數(shù)據(jù)窗口對象進(jìn)行修改就可以了。
PowerBuilder開發(fā)的應(yīng)用服務(wù)器上的組件其實就是一個自定義的類。它基于面向?qū)ο蟮乃枷?,將?fù)雜的業(yè)務(wù)邏輯處理和數(shù)據(jù)訪問代碼封裝在其中,以實現(xiàn)邏輯獨立性和組件級的代碼共享,
便于維護。我們將組件方法調(diào)用中引用到的數(shù)據(jù)窗口對象(也就是報表對象)跟該組件對象的自定義對象存儲在同一個庫文件中,可以利用PowerBuilder開發(fā)工具中的很多向?qū)б黄鸢l(fā)行并部署到EAServer上。EAServer作為Sybase公司提供的企業(yè)級應(yīng)用服務(wù)器,支持用PB、Java、C等多種語言編寫的組件。EAServer為服務(wù)器端的組件提供了緩沖機制、安全性和事務(wù)處理等多方面的支持,可以使用EAServer提供的事務(wù)管理機制來取代傳統(tǒng)的使用Commit和Rollback的事務(wù)管理方法。
服務(wù)組件對后臺數(shù)據(jù)庫的訪問是通過通用數(shù)據(jù)庫接口(如ODBC)或者DBMS生產(chǎn)商提供的專用數(shù)據(jù)庫接口進(jìn)行的。為了提高資源利用率,減少服務(wù)器的開銷,EAServer提供了數(shù)據(jù)庫連接緩沖機制。由于分布式應(yīng)用中客戶端不直接訪問數(shù)據(jù)庫,而通過組件來訪問數(shù)據(jù)庫,PB開發(fā)的組件是通過使用PB傳統(tǒng)的非可視化數(shù)據(jù)訪問對象Datastore來訪問后臺數(shù)據(jù)庫,訪問方法與兩層C/S應(yīng)用中的數(shù)據(jù)訪問方法相同。當(dāng)數(shù)據(jù)存儲對象通過Retrieve函數(shù)把報表數(shù)據(jù)提取到數(shù)據(jù)存儲對象后,通過數(shù)據(jù)存儲對象的GetFullState函數(shù)再把它提取到一個Blob型的變量里??蛻舳塑浖ㄟ^遠(yuǎn)程對象的方法調(diào)用再把Blob型的數(shù)據(jù)提取到客戶端,用SetFullState函數(shù)把Blob變量里的內(nèi)容重新填入目標(biāo)數(shù)據(jù)窗口中,以便再現(xiàn)從數(shù)據(jù)庫提取的報表內(nèi)容和格式。
如圖1所示,系統(tǒng)采用基于EAServer應(yīng)用服務(wù)器的多層分布式結(jié)構(gòu)。EAServer提供了對各類組件的管理和通信環(huán)境,報表引擎是封裝數(shù)據(jù)存儲和數(shù)據(jù)連接的一組組件,由客戶端的報表系統(tǒng)接口調(diào)用。其中數(shù)據(jù)連接對象用于與各種數(shù)據(jù)庫建立連接,支持PowerBuilder的內(nèi)部接口和ODBC兩種接口,組件對象向客戶端提供了獲取報表數(shù)據(jù)的各種方法。
圖1 系統(tǒng)的總體結(jié)構(gòu)
在客戶端應(yīng)用中,連接對象負(fù)責(zé)與EAServer的通信聯(lián)系;代理對象封裝了EAServer組件的客戶端接口,使客戶端應(yīng)用象訪問本地對象實例一樣訪問EAServer組件。報表接口就是封裝了連接對象和代理對象的客戶端應(yīng)用接口,可以訪問報表引擎的所有功能。
報表引擎運行在應(yīng)用服務(wù)器EAServer上,為客戶端提供所有報表系統(tǒng)的功能服務(wù)。EAServer支持多種組件類型,如COM、CORBA、JavaBean/EJB和PowerBuilder NVO。PowerBuilder NVO組件具有跨平臺特性,可以高效穩(wěn)定地運行,因此報表引擎采用PowerBuilderNVO組件來實現(xiàn)。PowerBuilder是面向?qū)ο蟮目梢暬幊陶Z言,支持類的繼承、封裝、重載和多態(tài)性。在報表引擎的實現(xiàn)中首先把數(shù)據(jù)庫連接、數(shù)據(jù)存儲和數(shù)據(jù)訪問做成基本類庫,供其他功能類繼承。組件類圖如圖2所示。
圖2 組件基本類庫
n_easdb為其他類的父類,主要方法有對事務(wù)服務(wù)對象、數(shù)據(jù)庫事務(wù)對象、錯誤日志對象的建立和對日志信息的記錄等,其中s_userinfo是一個包含客戶端用戶信息的參數(shù)類型,便于對客戶端的操作進(jìn)行記錄,n_easdb類是跟數(shù)據(jù)操作相關(guān)類的基礎(chǔ)類。類n_rep用于從數(shù)據(jù)庫提取報表結(jié)構(gòu)數(shù)據(jù),其中of_getdw_withparm函數(shù)一般被子類調(diào)用,用于根據(jù)用戶參數(shù)生成對應(yīng)報表的blob數(shù)據(jù)(帶有數(shù)據(jù)內(nèi)容和格式);of_get_ddlb_reps函數(shù)用于提取客戶端框架窗口可以操作的報表對象名,以便客戶端用戶選擇對應(yīng)報表;of_get_parm_window函數(shù)用于提取客戶端框架窗口對應(yīng)的報表參數(shù)選擇窗口。類n_rep_sale用于根據(jù)客戶端框架窗口的選定參數(shù)提取對應(yīng)報表的數(shù)據(jù)(通過調(diào)用of_getdw_withparm函數(shù)),生成組件后可以被客戶端通過代理對象進(jìn)行遠(yuǎn)程調(diào)用。根據(jù)不同的業(yè)務(wù)報表需要可以從n_rep繼承建立如發(fā)貨、庫存等相應(yīng)類后生成組件對象。
客戶端程序的編寫可分為三個步驟:建立連接對象、建立組件代理對象和編寫客戶端應(yīng)用。連接對象(Connection Object)負(fù)責(zé)客戶端應(yīng)用與組件服務(wù)器之間的通信,代理對象(Proxy Object)是應(yīng)用服務(wù)器中處理業(yè)務(wù)邏輯的組件在客戶端的代理,客戶端應(yīng)用正是通過代理對象來使用遠(yuǎn)程應(yīng)用服務(wù)器的組件所提供的服務(wù)??梢岳肞owerBuilder所提供的連接對象向?qū)Ш徒M件代理向?qū)Ь涂梢院苋菀椎亟⑦B接對象和代理對象。
筆者以實現(xiàn)銷售查詢和統(tǒng)計報表框架的實現(xiàn)為例說明客戶端報表框架的設(shè)計與實現(xiàn),其窗口對象的基本類圖如圖3所示。
圖3 窗口對象的基本類圖
w_rep為父類,具有一般報表窗口的基本功能,is_parmwindow屬性存儲框架窗口對應(yīng)的參數(shù)選擇窗口對象,istru_parm,istru_pram_old屬性是一個結(jié)構(gòu)對象,存儲報表對象名以及若干個選擇參數(shù)的值,每次打開報表參數(shù)選擇窗口后,只要比較該二個屬性的值就可以判斷用戶是否改變了報表參數(shù),從而決定是否要重新從數(shù)據(jù)庫檢索數(shù)據(jù)。
類w_rep_sale中的屬性io_rep_sale是服務(wù)于該框架窗口的組件代理對象,通過代理對象,客戶端程序可以方便地調(diào)用組件的方法,根據(jù)報表參數(shù)檢索報表數(shù)據(jù)。根據(jù)不同的業(yè)務(wù)報表需要可以從w_rep繼承建立如發(fā)貨、庫存等相應(yīng)類的報表框架窗口類,在實例對象時只要重載wf_retrieve函數(shù)和ue_open事件就可以了,例如w_rep_sale類實例對象的ue_open事件的主要代碼如下:
io_rep = CREATE no_rep_sale
io_rep.of_get_parm_window(gstru_user,this.classname(),is_parmwindow)//取對應(yīng)參數(shù)選擇窗口名,gstru_user為一全局變量。
io_rep.of_get_ddlb_reps(istru_parm.parm4,istru_parm.parm5,this.classname()) //取對應(yīng)框架窗口可以受理的報表對象名及報表標(biāo)題,結(jié)果保存在參數(shù)中,以便在參數(shù)選擇窗口中顯示供選報表。
PostEvent("ue_select") //根據(jù)istru_parm值打開參數(shù)選擇窗口,以便用戶選擇報表參數(shù),確認(rèn)后調(diào)用wf_retrieve()函數(shù)。
wf_retrieve()函數(shù)的主要代碼如下:
long ll_ret
blob lbl_data
ll_ret= io_rep.of_rep_sale(gstru_user,istru_parm,lbl_data)//通過代理對象調(diào)用組件方法
ll_ret = dw_1.SetFullState(lbl_data)//把Blob變量里的內(nèi)容重新填入報表框架的窗口數(shù)據(jù)
//窗口中,顯示報表內(nèi)容和樣式。
用戶查詢和統(tǒng)計銷售數(shù)據(jù)時對應(yīng)報表框架窗口及參數(shù)選擇窗口界面如圖4所示??蛻翡N售統(tǒng)計表框架窗口具有報表的打印、另存、放大、縮小、標(biāo)尺預(yù)覽等常規(guī)操作功能,檢索功能可以打開框架窗口對應(yīng)的報表參數(shù)選擇窗口,以便用戶可以方便地選擇要檢索數(shù)據(jù)的相應(yīng)條件,也可以選擇報表框架窗口可以處理的其他報表對象。用戶對報表的內(nèi)容和格式要求有變化的時候,只要修改對應(yīng)的組件庫中的Datawindow對象就可以,如果用戶要增加一個關(guān)于客戶銷售類的報表,也只要在對應(yīng)的組件庫文件中增加新的DataWindow對象,并在數(shù)據(jù)庫的表sys_ddlb_rep中增加一條跟該報表框架窗口關(guān)聯(lián)的記錄,INSERT語句如下:
INSERT INTO sys_ddlb_rep VALUES (
'd_rep_custdaysale',
//新的datawindow對象名
'客戶日銷售統(tǒng)計表',
//報表的標(biāo)題名稱
'w_rep_sale',
//報表框架窗口對象名
'w_rep_sale_parm_select');
//報表框架窗口對應(yīng)參數(shù)選擇窗口對象名
圖4 運行時銷售報表框架窗口界面
開發(fā)基于網(wǎng)絡(luò)的、具有較高的邏輯獨立性、可擴展性和可復(fù)用性的分布式報表應(yīng)用是企業(yè)信息系統(tǒng)的發(fā)展趨勢。本文介紹了一種基于EAServer應(yīng)用框架的分布式報表系統(tǒng)的開發(fā)技術(shù),相信會給廣大軟件開發(fā)人員提供一個新的報表應(yīng)用的開發(fā)思路。筆者運用該技術(shù)為家紡企業(yè)的銷售與分銷管理開發(fā)了一個報表應(yīng)用軟件,投入使用一年多來,性能穩(wěn)定、運行良好,且易維護,充分體現(xiàn)了分布式應(yīng)用的各種優(yōu)勢。
[1] William Green John D.Olson,李洪發(fā),王海峰,等譯.Power-Builder Internet及分布式應(yīng)用開發(fā)[M].北京:機械工業(yè)出版社,2004.
[2] 華銓平.PowerBuilder程序設(shè)計[M].北京:清華大學(xué)出版社、北方交通大學(xué)出版社,2004.
[3] 白尚旺.PowerDesigner軟件工程技術(shù)[M].北京:電子工業(yè)出版社,2004.
[4] 楊曦.基于組件技術(shù)的信息系統(tǒng)設(shè)計與實現(xiàn)[J].福州大學(xué)學(xué)報(自然科學(xué)版),2006(11).
[5] 劉華成.基于PowerBuilder 10.5數(shù)據(jù)報表系統(tǒng)的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù) 2009.(21).
[6] 海濤.課程管理系統(tǒng)PowerBuilder實現(xiàn)[J].計算機技術(shù)與發(fā)展,2009,(02).