近期由于工作需要,我开始学习PowerBuilder9.0,对PowerBuilder的DataWindow进行了一些研究,特此记录。PowerBuilder对数据库的操作可谓是简单迅速,与Dot Net相比,有过之而不及,开发迅速,不易出错,开发效率高,只需点几下鼠标即可完成一个数据库信息的基本操作或是一个报表。但是对样式的调节相对可能比较复杂。公司提出一个案例,里面涉及到了数据排序,我立马想到的就是Dot Net中DataGrid中点击列表标题进行排序的操作,由于从事Dot Net开发较长时间,因此对PB的某些功能我都尽量模拟Dot Net中的样子,于是立刻进行该功能的开发。看到了网上忘记是哪位大哥介绍了点击列标题进行数据排序的例子,于是我偷懒将代码Copy下来进行了修改。源代码主要是对单列进行数据排序,没有对多列的混合排序,于是我加上了我们通常用的按住Ctrl键进行多列数据标题的选取,进行排序操作。
首先写一个函数f_setsort
参数是:datawindwo ad_dw, dwobject ad_dwo, reference string as_sortcolumn, reference string as_sortorder, reference string ls_sortstring
参数用途:我主要说一下后面三个参数的用途:as_sortcolumn用作存储你点击的列名;as_sortorder用于存储你排序的规则;ls_sortstring用来存储最终的排序规则字符串。
内容如下:
string ls_headername
string ls_colname
integer li_rc
integer li_suffixlen
integer li_headerlen
//string ls_sortstring
string ls_defaultheadersuffix

ls_defaultheadersuffix="_t"

//判断当前ad_dwo是否有效
IF IsNull(ad_dwo) OR NOT IsValid(ad_dwo) THEN
Return -1
END IF

//此处判断是否允许提供点击列头时进行SORT排序
If ad_dwo.Name = 'datawindow' THEN Return 0
IF ad_dwo.Band <> "header" THEN Return 0

//获取列头信息
ls_headername = ad_dwo.Name
li_headerlen = Len(ls_headername)
li_suffixlen = Len(ls_defaultheadersuffix)

//判断是否点击的是列头
IF Right(ls_headername, li_suffixlen) <> ls_defaultheadersuffix THEN
Return -1
END IF
ls_colname = Left (ls_headername, li_headerlen - li_suffixlen)
//判断此列是否有效
If IsNull(ls_colname) or Len(Trim(ls_colname))=0 Then
Return -1
End If


//设置标题排序标志数量
if ls_sortstring = "" or isnull(ls_sortstring) then
f_clearallsign(ad_dw)
// 将未选中的列的标题还原---只根据单列设置
// if not isnull(as_sortcolumn) then
// //string s_text//获取标题文本
// s_text = ad_dw.Describe(as_sortcolumn + "_t.text")
// //清楚标题文本中的排序标志符
// f_clearsign(s_text)
// //修改标题文本
// ad_dw.modify(as_sortcolumn + "_t.text = '" + s_text + "'")
// end if
else

end if
//判断是否点击的是上次点击过的列
IF as_sortcolumn = ls_colname THEN
//如果点的是同一列,则获取上次点击是如何排序,此次进行相反排序
IF as_sortorder = " A" THEN
as_sortorder = " D"
ELSE
as_sortorder = " A"
END IF
ELSE
//如果是不同列,则进行升序
as_sortcolumn = ls_colname
string s_colname
s_colname = ad_dw.Describe(as_sortcolumn + "_t.text")
if match(s_colname,"▲") then//根据标题来设置排序规则
as_sortorder = " D"
else
as_sortorder = " A"
END IF
END IF

//设置排序字符串
if ls_sortstring <> "" then
//校验是否列有重复排序
if match(ls_sortstring, as_sortcolumn) then
string s_sortstringfirst,s_sortstringend,s_sortstringtemp
integer i_posindex, i_sortstringlen
i_posindex = pos(ls_sortstring,as_sortcolumn)//取出列名字符串位置
i_sortstringlen = len(ls_sortstring)//取出排序串长度
//清除充分排序列
s_sortstringfirst = mid(ls_sortstring,0,i_posindex - 1)
//messageshow(s_sortstringfirst)
s_sortstringtemp = mid(ls_sortstring,i_posindex,i_sortstringlen - i_posindex + 1)
//messageshow(s_sortstringtemp)
integer i_postempindex
i_postempindex = pos(s_sortstringtemp,",")
//messageshow(string(i_postempindex))
if i_postempindex <> 0 then
s_sortstringend = mid(s_sortstringtemp,i_postempindex + 1,len(s_sortstringtemp) - i_postempindex)
else
s_sortstringend = ""
end if
//messageshow(s_sortstringend)
//拼接排序串
ls_sortstring = s_sortstringfirst + s_sortstringend
end if
ls_sortstring = ls_sortstring + ", " + as_sortcolumn + as_sortorder
else
ls_sortstring = as_sortcolumn + as_sortorder
end if

//开始排序
li_rc = ad_dw.SetSort (ls_sortstring)
If li_rc < 0 Then Return li_rc

//开始排序
li_rc = ad_dw.Sort()
If li_rc < 0 Then Return li_rc

Return 1
成功之后返回值为1,在form里面添加名为dw_container的数据窗体,定义变量string is_sortcolumn, is_sortorder,ls_sortstring,在dw_container的Clicked事件中添加如下代码 :
integer li_rc
//获取排序方法返回值
li_rc=f_setsort(this,dwo,is_sortcolumn,is_sortorder,ls_sortstring)
//1代表成功
if li_rc = 1 then
//获取标题文本
string s_text
s_text = dwo.text
//清楚标题文本中的排序标志符
f_clearsign(s_text)
//根据排序规则设置标题标志符
if is_sortorder = " A" then
dwo.text = s_text + "▲"
else
dwo.text = s_text + "▼"
end if
end if
//判断是否按下Ctrl
if not keydown(KeyControl!) then
//messageshow(ls_sortstring)
ls_sortstring = ""
end if

在取得返回值之后,根据排序规则设置标题上的上下三角号,然后判断键盘事件将排序最终规则字符串初始化为空,以便后续使用。
该代码存在了一下问题: 1.f_setsort中生成的排序最终规则字符串中会出现空逗号,举例:c_col1 A, c_col2 D, ,,c_col3 A。这是对串的操作不得当引起的。 2.只有按住Ctrl键选取列的时候才会加入关于该列的排序规则,即便是第一次点选列的时候也要按住Ctrl键。
以上便是小弟的修改版DataWindow排序程序,还存在很多不足,希望也能够给大家一些启示,算是一个排序总结吧,望大家看了之后多多指教 哦。