基于Powerbuilder的通用排序模块设计与实现
2013-04-29蒋玉芳
蒋玉芳
摘 要: 利用PowerBuilder的数据窗口,设计一个数据管理信息系统通用的排序模块,发挥对数据窗口任意字段组合的排序功能。利用此排序模块,可极大地提高管理信息系统的编程效率,具有很强的实用性。
关键词: Powerbuilder 数据窗口 字段 排序 通用模块设计
引言
在利用Powerbuilder开发的数据库信息管理系统中,用户常常有按某种顺序查看数据的要求,而这种要求是会动态改变的,这就要求开发者不能将查询出来的数据以固定的顺序展示给用户 ,而必须提供按用户要求对数据进行灵活多变的排序功能。因此,为了节约开发时间,提高开发效率,设计一种通用的排序程序模块显得非常有必要。
把要排序的数据窗口作为参数传递给此通用排序模块,然后获取列名,通过访问数据窗口的属性,组合成排序字符串,即可实现排序功能。
一、创建一个Tabular类型的数据窗口对象,选择Exteral数据源,取名为:d_columns_dddw。
该数据窗口作为下拉子数据窗口用于存储要排序的表的列号和字段名。
表1 d_columns_dddw的各字段
二、创建一个Tabular类型的数据窗口对象,选择Exteral数据源,取名为d_sort。
该数据窗口对象的外观如图1所示。该数据窗口对象用于输入要排序的表的字段名、优先级和升降序,各字段如表2所示。
表2 d_sort的各字段
图1 d_sort的设计效果
(一)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。
三、创建一个UserObject用户对象数据窗口uo_dw_sort。
Standard Visual;Types:datawindow;DataObject:d_sort,如图2所示:
图2 用户对象数据窗口uo_dw_sort
四、创建一个response类型的窗口w_sort),添加相关控件。
具体如表3和图3所示,功能是设置组合排序的条件,得出排序结果。数据窗口控件dw_sort的创建方法是:单击工具栏上的UserObject图标,在弹出式窗口中选择已经创建好的uo_dw_sort对象。
表3 窗口w_sort上的控件
图3 排序条件设置窗口w_sort
(一)声明窗口w_sort的实例变量
Private:DataWindow idw_ToSortOn //用来接收传递过来的要排序的数据窗口对象
(二)数据窗口dw_sort中的事件函数
通过数据窗口dw_sort的用户自定义事件来实现对排序条件的组合设置,主要有增加、插入、删除记录和高亮显示记录行等功能。
1.constructor事件。
This.SetRowFocusIndicator(Hand!) //记录行前面设置为手形
2.用户自定义事件。
(1)ue_addrow()。功能:在记录末增加一行过滤条件记录,并调用wf_setgrade()设置优先级。脚本略。
(2)ue_insertrow()。功能:在当前行之后插入一行记录,并调用wf_setgrade()设置优先级。脚本略。
(3)ue_deleterow()。功能:删除一行过滤条件,并调用wf_setgrade()设置优先级。脚本略。
(4)ue_dddw_mousemove()。功能:捕捉下拉数据窗口事件,高亮顯示鼠标经过的记录行。脚本略。
(三)窗口w_ sort中的事件函数
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()。功能:构造排序表达式字符串。
//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() //接收数据窗口改变
li_rowcount=dw_sort.RowCount() //获取记录行的总数
For li_i=1 To li_rowcount
ll_columnno=dw_sort.GetItemNumber(li_i,?謖column_number?謖) //获取列号
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
//组合排序表达式字符串
If Trim(ls_colname)<>?謖?謖 Then ls_expression=ls_expression + ls_colname + ?謖 ?謖 +ls_order+ ?謖 ?謖
Next
Return ls_expression
3.wf_setgrade()。功能:设置字段排序的优先级别。
//Function Name:wf_setgrade;Access:private;Return Type:None
Long ll_row,ll_i
ll_row=dw_sort.RowCount() //总行数,即排序的条件个数
If ll_row>0 Then
dw_sort.SetRedraw(False)
For ll_i=1 To ll_row
dw_sort.SetItem(ll_i,1,ll_i) //按顺序设置优先级
Next
dw_sort.SetRedraw(True)
End If
4.窗口open事件。功能:初始化数据窗口dw_sort。
Integer li_columncount,li_columnindex //数据窗口的总列数和列的序号
String ls_column,ls_display //下拉子数据窗口的列名和显示名
Long ll_row
Pointer lp_oldpointer
DataWindowChild ldwc_columns
idw_ToSortOn=Message.PowerObjectParm //获取要排序的数据窗口对象
lp_oldpointer=SetPointer(HourGlass!)
dw_sort.SetRedraw(False)
li_columncount=Integer(idw_ToSortOn.Describe(?謖DataWindow.Column.Count?謖)) //数据窗口列数
dw_sort.GetChild(?謖column_number?謖,ldwc_columns) //获取下拉子数据窗口
//把要排序的数据窗口的列号和列名填充到下拉子数据窗口
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) //在下拉子数据窗口中增加一条记录
ldwc_columns.SetItem(ll_row,?謖column_number?謖,li_columnindex) //填充列号
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!)
If ls_sortstring=?謖!?謖 Then ls_sortstring=?謖?謖
//对数据窗口进行排序
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)。关闭排序窗口。
(五)排序模块的调用方法
如果要排序的数据窗口为dw_1,只要在排序按钮的clicked事件中添加代码“OpenWithParm(w_ sort,dw_1)”就可以实现排序,运行效果如图4所示。
图4 调用排序模块
结语
通用排序模块的设计可以节约系统开发的时间,提高开发效率,更好地满足用户要求对数据进行灵活多变的排序的要求。模块可以单独存储到一个PBL文件当中,如果在应用程序的开发过程中需用到某些功能,只要把PBL文件加到库的搜索路径当中即可。
参考文献:
[1]陈永强,李茜.SQL Server 2005+PowerBuilder 11高级开发指南.清华大学出版社,2008,第一版.
[2]樊金生,张翠肖. PowerBuilder 10.5实用教程.科学出版社,2009,第一版.
[3]向隅.新编PowerBuilder程序设计实例教程.清华大学出版,2009,第一版.