蔣玉芳
摘 要: 利用PowerBuilder的數(shù)據(jù)窗口,設(shè)計(jì)一個(gè)數(shù)據(jù)管理信息系統(tǒng)通用的排序模塊,發(fā)揮對(duì)數(shù)據(jù)窗口任意字段組合的排序功能。利用此排序模塊,可極大地提高管理信息系統(tǒng)的編程效率,具有很強(qiáng)的實(shí)用性。
關(guān)鍵詞: Powerbuilder 數(shù)據(jù)窗口 字段 排序 通用模塊設(shè)計(jì)
引言
在利用Powerbuilder開(kāi)發(fā)的數(shù)據(jù)庫(kù)信息管理系統(tǒng)中,用戶常常有按某種順序查看數(shù)據(jù)的要求,而這種要求是會(huì)動(dòng)態(tài)改變的,這就要求開(kāi)發(fā)者不能將查詢出來(lái)的數(shù)據(jù)以固定的順序展示給用戶 ,而必須提供按用戶要求對(duì)數(shù)據(jù)進(jìn)行靈活多變的排序功能。因此,為了節(jié)約開(kāi)發(fā)時(shí)間,提高開(kāi)發(fā)效率,設(shè)計(jì)一種通用的排序程序模塊顯得非常有必要。
把要排序的數(shù)據(jù)窗口作為參數(shù)傳遞給此通用排序模塊,然后獲取列名,通過(guò)訪問(wèn)數(shù)據(jù)窗口的屬性,組合成排序字符串,即可實(shí)現(xiàn)排序功能。
一、創(chuàng)建一個(gè)Tabular類型的數(shù)據(jù)窗口對(duì)象,選擇Exteral數(shù)據(jù)源,取名為:d_columns_dddw。
該數(shù)據(jù)窗口作為下拉子數(shù)據(jù)窗口用于存儲(chǔ)要排序的表的列號(hào)和字段名。
表1 d_columns_dddw的各字段
二、創(chuàng)建一個(gè)Tabular類型的數(shù)據(jù)窗口對(duì)象,選擇Exteral數(shù)據(jù)源,取名為d_sort。
該數(shù)據(jù)窗口對(duì)象的外觀如圖1所示。該數(shù)據(jù)窗口對(duì)象用于輸入要排序的表的字段名、優(yōu)先級(jí)和升降序,各字段如表2所示。
表2 d_sort的各字段
圖1 d_sort的設(shè)計(jì)效果
(一)grade字段屬性。Style Type:Edit。
(二)column_number字段屬性。Style Type:DropDownDW;DataWindow:d_columnsdddw;Display Column:column_name;Data Column:column_number。
(三)sort_order字段屬性。Style Type:CheckBox;Text:升序;Data Value for on:A;Data Value for off:D。
三、創(chuàng)建一個(gè)UserObject用戶對(duì)象數(shù)據(jù)窗口uo_dw_sort。
Standard Visual;Types:datawindow;DataObject:d_sort,如圖2所示:
圖2 用戶對(duì)象數(shù)據(jù)窗口uo_dw_sort
四、創(chuàng)建一個(gè)response類型的窗口w_sort),添加相關(guān)控件。
具體如表3和圖3所示,功能是設(shè)置組合排序的條件,得出排序結(jié)果。數(shù)據(jù)窗口控件dw_sort的創(chuàng)建方法是:?jiǎn)螕艄ぞ邫谏系腢serObject圖標(biāo),在彈出式窗口中選擇已經(jīng)創(chuàng)建好的uo_dw_sort對(duì)象。
表3 窗口w_sort上的控件
圖3 排序條件設(shè)置窗口w_sort
(一)聲明窗口w_sort的實(shí)例變量
Private:DataWindow idw_ToSortOn //用來(lái)接收傳遞過(guò)來(lái)的要排序的數(shù)據(jù)窗口對(duì)象
(二)數(shù)據(jù)窗口dw_sort中的事件函數(shù)
通過(guò)數(shù)據(jù)窗口dw_sort的用戶自定義事件來(lái)實(shí)現(xiàn)對(duì)排序條件的組合設(shè)置,主要有增加、插入、刪除記錄和高亮顯示記錄行等功能。
1.constructor事件。
This.SetRowFocusIndicator(Hand!) //記錄行前面設(shè)置為手形
2.用戶自定義事件。
(1)ue_addrow()。功能:在記錄末增加一行過(guò)濾條件記錄,并調(diào)用wf_setgrade()設(shè)置優(yōu)先級(jí)。腳本略。
(2)ue_insertrow()。功能:在當(dāng)前行之后插入一行記錄,并調(diào)用wf_setgrade()設(shè)置優(yōu)先級(jí)。腳本略。
(3)ue_deleterow()。功能:刪除一行過(guò)濾條件,并調(diào)用wf_setgrade()設(shè)置優(yōu)先級(jí)。腳本略。
(4)ue_dddw_mousemove()。功能:捕捉下拉數(shù)據(jù)窗口事件,高亮顯示鼠標(biāo)經(jīng)過(guò)的記錄行。腳本略。
(三)窗口w_ sort中的事件函數(shù)
1.wf_strip()。功能:用空格替換特殊字符,去掉非法字符。
//Function Name:wf_strip;Access:private;Return Type:None
//Argument Name:as_arg;Argument Type:string; Pass By:reference
Integer li_length,li_pos
li_length=Len(as_arg)
Forli_pos=1 To li_length
Choose Case Mid(as_arg,li_pos,1)
Case ?謖~t?謖,?謖~r?謖,?謖~n?謖,?謖"?謖
as_arg=Trim(Replace(as_arg,li_pos,1,?謖))
End Choose
Next
2.wf_buildsortstring()。功能:構(gòu)造排序表達(dá)式字符串。
//Function Name:wf_buildsortstring;Access:private;Return Type:string
String ls_colname,ls_order,ls_expression
Integer li_i,li_rowcount
Long ll_columnno
dw_sort.AcceptText() //接收數(shù)據(jù)窗口改變
li_rowcount=dw_sort.RowCount() //獲取記錄行的總數(shù)
For li_i=1 To li_rowcount
ll_columnno=dw_sort.GetItemNumber(li_i,?謖column_number?謖) //獲取列號(hào)
If IsNull(ll_columnno) Then
Continue;
Else
ls_colname=?謖#?謖+String(ll_columnno) //獲取列名
ls_order=dw_sort.GetItemString(li_i,?謖sort_order?謖) //獲取排序類型(升序A,降序D)
End If
//組合排序表達(dá)式字符串
If Trim(ls_colname)<>?謖?謖 Then ls_expression=ls_expression + ls_colname + ?謖 ?謖 +ls_order+ ?謖 ?謖
Next
Return ls_expression
3.wf_setgrade()。功能:設(shè)置字段排序的優(yōu)先級(jí)別。
//Function Name:wf_setgrade;Access:private;Return Type:None
Long ll_row,ll_i
ll_row=dw_sort.RowCount() //總行數(shù),即排序的條件個(gè)數(shù)
If ll_row>0 Then
dw_sort.SetRedraw(False)
For ll_i=1 To ll_row
dw_sort.SetItem(ll_i,1,ll_i) //按順序設(shè)置優(yōu)先級(jí)
Next
dw_sort.SetRedraw(True)
End If
4.窗口open事件。功能:初始化數(shù)據(jù)窗口dw_sort。
Integer li_columncount,li_columnindex //數(shù)據(jù)窗口的總列數(shù)和列的序號(hào)
String ls_column,ls_display //下拉子數(shù)據(jù)窗口的列名和顯示名
Long ll_row
Pointer lp_oldpointer
DataWindowChild ldwc_columns
idw_ToSortOn=Message.PowerObjectParm //獲取要排序的數(shù)據(jù)窗口對(duì)象
lp_oldpointer=SetPointer(HourGlass?。?/p>
dw_sort.SetRedraw(False)
li_columncount=Integer(idw_ToSortOn.Describe(?謖DataWindow.Column.Count?謖)) //數(shù)據(jù)窗口列數(shù)
dw_sort.GetChild(?謖column_number?謖,ldwc_columns) //獲取下拉子數(shù)據(jù)窗口
//把要排序的數(shù)據(jù)窗口的列號(hào)和列名填充到下拉子數(shù)據(jù)窗口
For li_columnindex=1 To li_columncount
ls_column=idw_ToSortOn.Describe(?謖#?謖+String(li_columnin-
dex)+?謖.Name?謖) //字段名
ls_display=idw_ToSortOn.Describe(ls_column+?謖_t.Text?謖) //顯示名
If ls_display<>?謖!?謖 Then
wf_strip(ls_display) //去掉非法字符
ll_row=ldwc_columns.InsertRow(0) //在下拉子數(shù)據(jù)窗口中增加一條記錄
ldwc_columns.SetItem(ll_row,?謖column_number?謖,li_columnindex) //填充列號(hào)
ldwc_columns.SetItem(ll_row,?謖column_name?謖,ls_display) //填充列名
End If
Next
dw_sort.Event ue_addrow()
dw_sort.SetRedraw(True)
SetPointer(lp_oldpointer)
(四)窗口w_ sort中的按鈕控件
1.cb_add(增加):dw_sort.Event ue_addrow()
2.cb_insert(插入):dw_sort.Event ue_insertrow()
3.cb_delete(刪除):dw_sort.Event ue_deleterow()
4.cb_ok(確定):
String ls_sortstring
Pointer lp_oldpointer
ls_sortstring=wf_buildsortstring() //獲取排序字符串
lp_oldpointer=SetPointer(HourGlass?。?/p>
If ls_sortstring=?謖???謖 Then ls_sortstring=?謖?謖
//對(duì)數(shù)據(jù)窗口進(jìn)行排序
idw_ToSortOn.SetSort(ls_sortstring)
idw_ToSortOn.SetRedraw(False)
idw_ToSortOn.Sort()
idw_ToSortOn.SetRedraw(True)
SetPointer(lp_oldpointer)
Close(Parent)
5.cb_cancel(取消):Close(Parent)。關(guān)閉排序窗口。
(五)排序模塊的調(diào)用方法
如果要排序的數(shù)據(jù)窗口為dw_1,只要在排序按鈕的clicked事件中添加代碼“OpenWithParm(w_ sort,dw_1)”就可以實(shí)現(xiàn)排序,運(yùn)行效果如圖4所示。
圖4 調(diào)用排序模塊
結(jié)語(yǔ)
通用排序模塊的設(shè)計(jì)可以節(jié)約系統(tǒng)開(kāi)發(fā)的時(shí)間,提高開(kāi)發(fā)效率,更好地滿足用戶要求對(duì)數(shù)據(jù)進(jìn)行靈活多變的排序的要求。模塊可以單獨(dú)存儲(chǔ)到一個(gè)PBL文件當(dāng)中,如果在應(yīng)用程序的開(kāi)發(fā)過(guò)程中需用到某些功能,只要把PBL文件加到庫(kù)的搜索路徑當(dāng)中即可。
參考文獻(xiàn):
[1]陳永強(qiáng),李茜.SQL Server 2005+PowerBuilder 11高級(jí)開(kāi)發(fā)指南.清華大學(xué)出版社,2008,第一版.
[2]樊金生,張翠肖. PowerBuilder 10.5實(shí)用教程.科學(xué)出版社,2009,第一版.
[3]向隅.新編PowerBuilder程序設(shè)計(jì)實(shí)例教程.清華大學(xué)出版,2009,第一版.