Retek中Form实现排序的操作

现在有一个小需求,就是对Form中的某一个字段做一些设置,使得点击这个字段的时候,可以使得记录结果集随着该字段做出相应的排序,我是在Retek系统中做的,实现效果如下图1所示:

点击普通特殊可按该字段对结果集排序

图1:点击普通特殊可按该字段对结果集排序

实现的时候,上图中“普通特殊”这个按钮名字为GENERAL_SPECIAL,并且在B_COL_HEAD块下,按钮下面的显示明细行名为TI_GENERAL_SPECIAL_DESC,明细行所属的数据块为B_REQ_DETAIL,我这里设置的都不是数据库项。那么我给GENERAL_SPECIAL这个按钮写个when-button-pressed触发器,代码如下:

DECLARE
  l_order_by VARCHAR2(8000);
BEGIN
  IF :b_req_head.status IN ('AI', 'AS') AND
     :parameter.pm_mode IN ('NEW', 'EDIT') THEN
    post;
  END IF;
  IF :B_REQ_DETAIL.req_no IS NOT NULL THEN
    go_block('B_REQ_DETAIL');
    Clear_Block(NO_VALIDATE);
  
    l_order_by := ' ,line_num';
  
    IF :b_req_head.ti_order_by =
       '(SELECT uil.uda_value FROM uda_item_lov uil WHERE uil.item = cmx_wh_req_detail.item AND uil.uda_id = 11 AND rownum = 1) asc' THEN
      :b_req_head.ti_order_by := '(SELECT uil.uda_value FROM uda_item_lov uil WHERE uil.item = cmx_wh_req_detail.item AND uil.uda_id = 11 AND rownum = 1) desc';
    ELSE
      :b_req_head.ti_order_by := '(SELECT uil.uda_value FROM uda_item_lov uil WHERE uil.item = cmx_wh_req_detail.item AND uil.uda_id = 11 AND rownum = 1) asc';
    END IF;
  
    SET_BLOCK_PROPERTY('b_req_detail',
                       ORDER_BY,
                       :b_req_head.ti_order_by || l_order_by);
    Execute_Query;
  END IF;

END;

上面的那段排序代码,最终实现的效果与下面的类似:

SELECT *
  FROM cmx_wh_req_detail
 ORDER BY (SELECT uil.uda_value
             FROM uda_item_lov uil -- 注意这里不能再加上cmx_wh_req_detail
            WHERE uil.item = cmx_wh_req_detail.item
              AND uil.uda_id = 11
              AND ROWNUM = 1) DESC;

如果上面的还不清楚,也可以理解成下面这样:

SELECT cmx_wh_req_detail.*,
       (SELECT uil.uda_value
          FROM uda_item_lov uil
         WHERE uil.item = cmx_wh_req_detail.item
           AND uil.uda_id = 11
           AND ROWNUM = 1)
  FROM cmx_wh_req_detail
 ORDER BY (SELECT uil.uda_value
             FROM uda_item_lov uil
            WHERE uil.item = cmx_wh_req_detail.item
              AND uil.uda_id = 11
              AND ROWNUM = 1) ASC;

不过,可以很明显的看出,上面的代码在实现的时候有一定的不合理性,其实,可以考虑创建一个视图,将“普通特殊”字段也放进视图中,这样要用到的字段都可以直接从视图中取得,也就可以将“普通特殊”设置为数据库项,如果在这里我们建了一个名为cmx_wh_req_detail_v的视图,其中存有“普通特殊”字段(general_special),那么我们可以直接将form中的“普通特殊”item设置为数据库项,按钮的when-button-pressed的代码改为如下:

DECLARE
  l_order_by VARCHAR2(8000);
BEGIN
  IF :b_req_head.status IN ('AI', 'AS') AND
     :parameter.pm_mode IN ('NEW', 'EDIT') THEN
    post;
  END IF;
  IF :B_REQ_DETAIL.req_no IS NOT NULL THEN
    go_block('B_REQ_DETAIL');
    Clear_Block(NO_VALIDATE);
  
    l_order_by := ' ,line_num';
  
    IF :b_req_head.ti_order_by = 'general_special asc' THEN
      :b_req_head.ti_order_by := 'general_special desc';
    ELSE
      :b_req_head.ti_order_by := 'general_special asc';
    END IF;
  
    SET_BLOCK_PROPERTY('b_req_detail',
                       ORDER_BY,
                       :b_req_head.ti_order_by || l_order_by);
    Execute_Query;
  END IF;
END;

我觉的这个功能的实现挺有参考意义的,故而收藏在这里。

2014年11月13日补充:

在后面的一个开发中我发现,在开发retek form的时候,如果你在该form中的块使用了multiview,那么在实现排序的时候,你可以在字段列加一个为“按钮”类型的字段头按钮,并且设置字段头按钮的subclass为pc_multisort_button,在multiview_default_45表中做好了相关的配置以后,就可以直接在前面添加的字段头按钮中添加when-bottom-pressed触发器,并且在里面直接使用multiview的sort排序(好像方法名也不是sort,记不清了,开发的时候查下),大概的实现方法就是这样,不过这种方法有毛病是比较死,如果你设置了subclass,那么when-bottom-pressed中就一定要有代码,不然就报错,而且也只能对数据库项这样做,所以,一般我还是喜欢使用本文前面提供的几种方法。

本文标题:Retek中Form实现排序的操作

本文链接:http://yedward.net/?id=107

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章