婁七明,楊波,李穎芳
(紅河學院工學院,云南蒙自661100)
數據窗口顯示欄目通用定制窗口的設計及應用
婁七明,楊波,李穎芳
(紅河學院工學院,云南蒙自661100)
首先討論了PowerBuilder中如何根據用戶需求實現數據窗口中顯示列的動態(tài)控制方法,然后結合實例設計了一個界面友好、通用的數據窗口顯示欄目定制窗口。
PowerBuilder;數據窗口;數據存儲;信息系統(tǒng)
通常一個信息系統(tǒng)的用戶來自不同的工作崗位和工作部門,這些用戶在查詢信息或制作報表時的需求也不盡相同。這就要求開發(fā)人員必須為信息系統(tǒng)提供一些可定制的功能,比如可以任意設置窗口中要顯示的欄目,任意調整這些欄目的顯示順序。
PowerBuilder是一個非常優(yōu)秀的基于數據庫的應用程序開發(fā)工具,其數據的編輯、查詢等都可以使用數據窗口來完成。本文首先就如何控制數據窗口中列顯示與否的相關技術進行了探討,然后設計了一個通用的數據窗口顯示欄目定制窗口,很好的解決了上面的問題。
通常,控制數據窗口中的列是否顯示,有以下三種方法。
方法一:修改數據窗口對象SQL語句的SELECT子句,把要顯示的列加入,不顯示的列刪除,以建立新的查詢語句,重新從數據庫檢索數據,從而實現列的顯示定制。采用這種方法分如下三個步驟:
①獲得數據窗口對象的SQL代碼,可以使用GetSQLSelect方法來實現,語法如下:
strsql=dwcontrol.GetSQLSelect()
②對獲得的SQL代碼(變量strsql中)進行相應的修改,修改后和相應數據窗口對象進行綁定,可以使用SetSQLSelect方法實現,語法如下:
dwcontrol.SetSQLSelect(strsql)
③使用Retrieve方法重新檢索數據。
這種方法一方面必須從數據庫重新檢索數據,效率較低;另一方面要保證數據窗口中各列的顯示屬性相同,需要編寫大量的代碼,且代碼的通用性較差。
方法二:通過設置數據窗口對象的列及其標題的visible屬性來實現[3]。需顯示的列及其標題的visible屬性設置為true,不需顯示的列及其標題的visible屬性設置為false??梢允褂胢odify方法實現,語法格式如下:
dwcontrol.modify(c_name+’_t.visible=true’)//設置列標題可見
dwcontrol.modify(c_name+’.visible=true’)//設置列可見
dwcontrol.modify(c_name+’_t.visible=false’)//設置列標題不可見
dwcontrol.modify(c_name+’.visible=true’)//設置列不可見
采用這種方法不需要從數據庫重新檢索數據,效率較高,但是會打亂數據窗口對象中列的顯示順序,尤其是當設置數據窗口對象中包含第一列在內的數列不可見時,將會出現一些空位,很難控制。
方法三:通過設置數據窗口對象列的width屬性來實現。修改不需要顯示列的width屬性值為0,其他字段的width屬性不變,可以使用modify方法實現,語法格式如下:
dwcontrol.modify(c_name+’.width=’+string (wid))//設置列的寬度為wid
使用這種方法不需要從數據庫重新檢索數據,效率較高,因而在應用程序中經常被使用。下面將結合這種方法,設計一個通用的數據窗口顯示欄目定制窗口。
圖1 數據窗口d_itemselect
2.1 數據窗口對象的設計
設計基于外部數據源的Grid風格的數據窗口d_ itemselect,如圖1所示。其中check列用于讓用戶選擇要顯示的字段,設置其顯示風格為checkbox,屬性為3D look;c_name列是字段名,設置其visible屬性為false。
2.2 顯示欄目定制窗口界面設計
設計Response類型的窗口w_itemset,在窗口上放置一個數據窗口控件(dw_1)和兩個命令按鈕(cb_ok和cb_cancel),然后設置dw_1的dataobject屬性為d_ itemselect。如圖2所示。
圖2 顯示欄目設置窗口w_itemset
2.3 窗口編碼實現
(1)w_itemset的open事件的主要功能是接收從父窗口傳來的待排序的數據窗口對象,并取出該數據窗口對象的所有列的列名、列標題及其寬度,把它們插入到dw_1中,以供用戶選擇要顯示的欄目,代碼如下:datawindow dw//定義數據窗口對象
dw=message.powerobjectpar m//取得從父窗口傳來的數據窗口對象
int i,row
string c_name,c_head,wid,sel
dw_1.settransobject(sqlca)
for i=1 to integer(dw.object.datawindow.column. count)
c_name=dw.describe(’#’+string(i)+’.name’)//取列名
c_head=dw.describe(c_name+’_t.text’)//取列標題
wid=dw.describe(c_name+’.width’)//取列寬
ifwid=’0’then sel=’0’else sel=’1’//寬度為0不選擇,否則選中
row=dw_1.insertrow(0)//插入新行
dw_1.setitem(row,’c_name’,c_name)
dw_1.setitem(row,’c_head’,c_head)
dw_1.setitem(row,’check’,sel)
next
(2)cb_ok的clicked事件的主要功能是根據用戶設置生成不顯示欄目對應的字符串,然后返回給父窗口,以便在父窗口中實現顯示欄目的動態(tài)控制,代碼如下:
string ret,c_name,sel
int i
for i=1 to dw_1.rowcount()
c_name=dw_1.getitemstring(i,’c_name’)
sel=dw_1.getitemstring(i,’check’)
if sel=’0’then ret+=c_name+’.width=0’+’~t’
next
closewithreturn(parent,ret)
(3)cb_cancel的clicked事件是關閉窗口并返回-1,代碼如下:
closewithreturn(parent,’-1’)
至此,一個界面友好、通用的數據窗口顯示欄目定制窗口設計完畢。
這里以一個進銷存系統(tǒng)為例,介紹上面設計的數據窗口顯示欄目定制窗口在產品信息查詢中的應用。第一步,設計基于產品信息表(products)的grid風格的數據窗口對象d_products,如圖3所示。
第二步,設計popup風格的窗口w_query,在窗口上放置一個數據窗口控件(dw_1),設置其dataobject屬性為d_products;一個命令按鈕(cb_setitem),設置其text屬性為"欄目設置"。該窗口運行時效果如圖4中箭頭1所指窗口所示。
第三步:分別為窗口w_query的open、close事件及按鈕cb_setitem的clicked事件編寫如下代碼。
(1)w_query的open事件的功能是檢索數據,并把數據窗口對象的列名和列寬存入數據存儲對象,以便改變顯示欄目時使用。其中ds是一個實例變量,定義為:datastore ds。代碼如下:
dw_1.settransobject(sqlca)dw_1.retrieve()
圖3 數據窗口對象d_products
ds=create datastore
ds.dataobject=’d_cnamewidth’//設計數據存儲的數據對象
ds.settransobject(sqlca)
string c_name
int i,row
dec wid
for i=1 to integer(dw_1.object.datawindow.column.count)
c_name=dw_1.describe(’#’+string(i)+’.name’)//取列名
wid=dec(dw_1.describe(c_name+’.width’))//取列寬
row=ds.insertrow(0)
ds.setitem(row,’c_name’,c_name)
ds.setitem(row,’width’,wid)
next
(2)w_query的close事件的功能是釋放數據存儲ds,代碼如下:
destroy ds
圖4 產品信息查詢窗口w_query
(3)cb_setitem的clicked事件的主要功能是打開顯示欄目設置窗口,并把要設置顯示欄目的數據窗口傳給w_itemset。用戶設置完顯示欄目后,接收傳回的顯示欄目定制信息,并根據該信息修改相應欄目的列寬,然后重畫數據窗口對象,實現顯示欄目的動態(tài)控制。代碼如下:
openwithpar m(w_itemset,dw_1)//打開欄目設置窗口,進行設置
string ret,c_name
dec wid
int i
ret=message.stringpar m//返回顯示欄目定制信息
if ret<>’-1’then
dw_1.setredraw(false)//關閉數據窗口對象的重畫功能
for i=1 to ds.rowcount()
c_name=ds.getitemstring(i,’c_name’)
wid=ds.getitemdecimal(i,’width’)
dw_1.modify(c_name+’.width=’+string(wid))//修改相應欄目的寬度
next
dw_1.modify(ret)
dw_1.setredraw(true)//打開數據窗口對象的重畫功能,重畫數據窗口
end if
openwithparm(w_itemset,dw_1)//打開欄目設置窗口,進行設置
string ret,c_name
dec wid
int i
ret=message.stringparm//返回顯示欄目定制信息
if ret<>’-1’then
dw_1.setredraw(false)//關閉數據窗口對象的重畫功能
for i=1 to ds.rowcount()
c_name=ds.getitemstring(i,’c_name’)
wid=ds.getitemdecimal(i,’width’)
dw_1.modify(c_name+’.width=’+string(wid))//修改相應欄目的寬度
next
dw_1.modify(ret)
dw_1.setredraw(true)//打開數據窗口對象的重畫功能,重畫數據窗口
end if
至此,代碼設計完畢。運行時單擊"欄目設置"按鈕,彈出顯示欄目設置窗口,效果如圖4中箭頭2指示所示。若按圖4進行設置,不顯示品種、型號、產地,則單擊"確定"按鈕后,運行結果如圖5所示。
圖5 運行結果
該工作完成后,可以將d_itemwidth、d_itemselect、w_itemset、w_query放入一個PBL庫中。使用PB開發(fā)應用程序時,只需要包含該PBL庫,然后創(chuàng)建繼承于w _query的窗口,修改數據窗口控件dw_1的dataobject屬性,不需要額外編寫代碼,就可以實現相關數據窗口對象顯示欄目的定制,實現了代碼的重用,提高了應用程序的開發(fā)效率。
[1]李群先.一種在Power Builder數據窗口中實現字段名稱動態(tài)顯示的方法[J]現代計算機,2005(04):98-100.
[2]楊昭.PowerBuilder9.0數據窗口技術[M]北京:中國水利水電出版社,2004.
[3]柯建勛,張濤,邵亮.PowerBuilder9.0進階開發(fā)篇[M]北京:清華大學出版社,2003.
[責任編輯 張燦邦]
Design and Application of a GeneralD isplayColumn Custom ization W indow for DataW indow
LOU Q i-m ing,YANG Bo,LI Ying-fang
(Department of Engineering,Honghe University,Mengzi 661100,China)
First discussed the methods of control display columns ofDataW indow dynamically in PowerBuilder to user requirements,then designed a generalwindow to customize display columns of DataW indow with user-friendly interface.
Power Builder;DataW indow;DataStore;Infor mation System
book=8,ebook=190
TP31
A
1008-9128(2010)04-0063-04
2010-06-17
婁七明(1976-),男,云南石林人,講師,主要從事M IS系統(tǒng)應用研究.