关于PowerBuilder中DataWindow的数据排序操作

         近期由于工作需要,我开始学习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排序程序,还存在很多不足,希望也能够给大家一些启示,算是一个排序总结吧,望大家看了之后多多指教 哦。

展开阅读全文

没有更多推荐了,返回首页