在EBS Form中实现强大的排序效果

 

EBS Form中实现强大的排序效果

所有的Item都可以自由排序,组合排序的效果

整理by sam.t in 2012.9.27

E-mail:samt007@163.com

 

前言:

在EBS的Form中,排序功能一直是不够人性化。强如文件夹的开发的Form,最多也只可以实现Top3位Item的排序。如果您想实现每个Item都可以自由排序,或者灰常强大的自由组合排序的效果,那标准的是无能为力了。

这个文档就是可以很完美解决这个问题!通过调用客制化的pll过程,就可以自由实现这个效果。

但是,毕竟Form中的排序是一种“假象”排序;就是说,无论是怎么样的排序,从根本来说,都是根据您要排序的栏位,然后重新查询得出的效果。这里必须要做重新查询的动作!那就比较郁闷了。如果一个查询N久才出来的,被你重新排序了,那可能又要等N久了。所以这个自由排序的功能一定要慎用!否则系统被查询Form给拖慢了可别怪我。

所以,个人比较建议用的两种情况是:

1.   如果你的查询的Form是用临时表技术开发的,那你可以放心用。因为结果都已经在一个临时表格里面了,如何重新查询都没关系。

2.   如果是Master-Detail的Form,在Detail里面应该是可以任意重新查询排序的。

 

别的情况自己可以衡量一下。

 

一、      Form实现过程:

首先,该Form必须是Folder开发的。

其次,如果Form没有XYGPUBCORE.pll,则必须增加!

1.   增加Form参数:SORT_RULE(字节型的,目的是传递要排序的一个或者多个Item给对应的Block)

  另外,如果要实现多项排序的效果,那必须要增加check box Item.例如:CONTROL.MULT_ORDER_BY

  增加触发器:WHEN-CHECKBOX-CHANGED

  增加代码:XYG_FLODER_ACTION.MULT_ORDER_BY('WHEN-CHECKBOX-CHANGED');

2.   在WHEN-NEW-FORM-INSTANCE增加代码,定义是否需要实现所有的Item都排序。

    XYG_FLODER_ACTION.define_SORT(

    'DETAIL'--p_folder_block IN VARCHAR2

    ,'DETAIL_PROMPT'--p_prompt_block IN VARCHAR2

    ,'CONTROL.MULT_ORDER_BY'--p_muti_check_box_item in varchar2 default null

    ,'PARAMETER.G_QUERY_FIND'--p_query_find_para in varchar2 default null

    );

    其中p_folder_block是必须输入的,就是文件夹查询结果的数据块。

    p_muti_check_box_item是可选输入。这个Item是属于CHECK_BOX的,实现多项排序的效果。

3.   在对应的查询的Block的PRE-QUERY触发器增加红色的代码:

    app_folder.event('PRE-QUERY');

    --注意:必须增加在app_folder.event('PRE-QUERY');之后!

XYG_FLODER_ACTION.sort_action_event('PRE-QUERY');

4.   在对应的全排序的Block触发器 WHEN-NEW-BLOCK-INSTANCE/ POST-BLOCK分别增加:

WHEN-NEW-BLOCK-INSTANCE :XYG_FLODER_ACTION.sort_action_event('WHEN-NEW-BLOCK-INSTANCE');

POST-BLOCK :XYG_FLODER_ACTION.sort_action_event('POST-BLOCK');

5.   特别说明:一个Form最多只可以让一个Folder Block实现全排序的效果,目前程序不支持一个Form多个Folder Block都可以实现全排序,这个是必须注意的。

完工!开发过程是不是很简单?因为复杂的都封装到pll里面了。

这个可以说是一个非常完美的全排序效果!

 

 

二、      源代码开发实现过程:

1.  增加客制化的pll(XYGPUBCORE.pll),控制整个全排序的过程

 

2.   修改标准的APPFLDR.pll

主要目的是修改每个Item的触发器:app_folder.event('WHEN-MOUSE-UP');

备注说明:

其实我一直考虑一个问题,这个问题困扰了我好几天:标准的文件夹的PLL我究竟应不应该改。

改了标准的东西,特别是pll,隐含问题是会有。因为N多Form都会调用这个Pll。

但是,如果我不改,那我要实现全排序的效果,那我必须在每个文件夹的Item级触发器的WHEN-MOUSE-UP下面增加我自己的代码才可以实现这个效果。一旦这样子的Form多,栏位多,那开发起来是很费力的。而且,万一以后要修改我开发的过程,那修改量是很恐怖的。

所以,综合考虑,我决定改标准的pll!而且我这个修改是很简单的,只是增加一小段代码,别的都是统一在自己开发的pll实现!

细心的人还有一点疑问:你改了标准的pll,那一定会影响所有调用这个pll的Form,换句话说,那所有文件夹的Form是否都要客制修改才可以用?!那工作量有多大啊!

这个考虑是必须的。别担心,我也考虑到了。所以,为了不影响现有的所有文件夹的Form(很多标准的Form是不需要全排序的),所以我特定增加了一个XYG_FLODER_ACTION.SORT_ALLOW的参数。该参数默认是N。当您有定义了要使用全排序的效果,它才会是Y。所以,只有这个参数为Y的条件下,才会触发全排序的代码!否则是直接跳过去,这样子就100%不会影响之前的所有Floder的Form(特别是标准的Floder的Form)的正常使用。

 

具体修改地方:

1)标准的Pll增加我自己开发的pll:XYGPUBCORE.pll

2)在app_folder_fldr_handler

增加下图的那段代码:

    ---2012.9.27 modiby by sam.t for add sort功能!

    IF NVL(XYG_FLODER_ACTION.SORT_ALLOW,'N') = 'Y' THEN

       XYG_FLODER_ACTION.GET_BLOCK_SORT(NAME_IN('SYSTEM.TRIGGER_ITEM'));

    END IF;

4)在APP_FOLDER_DRAG_AND_DROP增加红色的代码:

目的是为了不让重复查询。因为前3个Item标准的Folder功能是会自动查询的。

    copy('Y', 'global.appfldr_sort_mode');

    ---2012.9.27 modiby by sam.t for add sort功能!

    IF NVL(XYG_FLODER_ACTION.SORT_ALLOW,'N') = 'N' THEN

       do_key('execute_query');

    END IF;

    copy('N', 'global.appfldr_sort_mode');

即可!

 

三、      测试全排序的效果:

实现例子:XYG_STANDARD_SAMPLE.fmb

1.  单项的排序,所有Item都可以作为排序条件:

当我点击使用数量题头栏位的时候(”使用数量”明显不是前3个Item之内的。。。)

所有Item的都可以排序效果已经达到!!

 

2.  多项自由排序

必须要勾上多项排序 的勾勾。

刚刚勾上多项排序的时候,注意左下角的提示:

然后,我希望可以实现:

先按使用数量排序,再按照使用日期排序:

先鼠标点击“使用数量”,再点“开始使用日期”,即可!

如果要实现:

先按使用数量排序,再按照使用日期 降序 排序:

这时候,您只需要再点一下“开始使用日期”,即可!

别的排序您也可以自由组合。非常方便!

 

 

-------END

 老规矩,图片不贴,要看图请去百度文库:

 http://wenku.baidu.com/view/8429aa7aa26925c52cc5bf9b.html?st=1

 

 

 

---------------代码部分

----代码可能写得不是很整齐;因为测试了,没什么bug,而且是封装在PLL的代码,所以我没怎么后期整理了。可以保证的是,代码是OK的。

---另外还有一点要说明的是,里面调用的一个包: XYG_PUB_ACTION_CTL.hint_message,其实就是将信息提示在EBS的左下角而已。

代码如下:


   --*******************************************************************************
  --          公用处理过程
  --    程序名称  : hint_message
  --    中文名称  : 提示信息给User
  --    功能概要  : 提示消息给User P_HINT_TYPE:WINDOWS(弹出窗口提示)/HINT(左下角提示)   P_RAISE:是否Raise异常
  --    版本      : V 1.0
  --    程序员&创建日期  :  Sam.T   & 2012/09/10
  --********************************************************************************
  procedure hint_message(P_MESSAGE VARCHAR2,P_HINT_TYPE VARCHAR2 DEFAULT 'WINDOWS',P_RAISE BOOLEAN DEFAULT TRUE)
  is
  begin
   if UPPER(P_HINT_TYPE) = 'WINDOWS' THEN
      FND_MESSAGE.DEBUG(P_MESSAGE);
   ELSE
    ---只是左下角跳出提示:
    FND_MESSAGE.SET_STRING(P_MESSAGE);
    FND_MESSAGE.HINT;
   END IF;
   
   IF P_RAISE THEN
      RAISE FORM_TRIGGER_FAILURE;
      END IF;
  end hint_message;

 

-------------------------------------------------------------------------------------------------

---文件夹排序控制包头:

PACKAGE XYG_FLODER_ACTION IS
  SORT_ALLOW VARCHAR2(1):= 'N';
  folder_block varchar2(150);
  prompt_block varchar2(150);
  muti_check_box_item varchar2(150);
  query_find_para varchar2(80);
  go_new_block boolean; ---是否切换block
  PROCEDURE define_SORT(p_folder_block IN VARCHAR2,p_prompt_block IN VARCHAR2,p_muti_check_box_item in varchar2 default null,p_query_find_para in varchar2 default null);
  PROCEDURE GET_BLOCK_SORT(block_item IN VARCHAR2);
  PROCEDURE CALL_BLOCK_SORT(sort_rule IN VARCHAR2); 
  PROCEDURE MULT_ORDER_BY(m_event in varchar2);
  FUNCTION GET_MUTI_SORT_COLNAME(P_MUTI_SORT_RULE IN VARCHAR2) RETURN VARCHAR2;
  PROCEDURE sort_action_event(p_event in varchar2);
END;

 

 

----包主体:

PACKAGE BODY XYG_FLODER_ACTION IS
/*
整理by sam.t in 2012.9.27
实现所有的Item都可以自动排序的效果
实现过程:
1 增加参数:SORT_RULE(字节型的,目的是传递要排序的Item给对应的Block)
  如果要实现多项排序的效果,那必须要增加check box Item.例如:CONTROL.MULT_ORDER_BY
  增加触发器:WHEN-CHECKBOX-CHANGED
  增加代码:XYG_FLODER_ACTION.MULT_ORDER_BY('WHEN-CHECKBOX-CHANGED');
2 在WHEN-NEW-FORM-INSTANCE增加代码,定义是否需要实现所有的Item都排序。
 XYG_FLODER_ACTION.define_SORT(
 'DETAIL'--p_folder_block IN VARCHAR2
 ,'DETAIL_PROMPT'--p_prompt_block IN VARCHAR2
 ,'CONTROL.MULT_ORDER_BY'--p_muti_check_box_item in varchar2 default null
 ,'PARAMETER.G_QUERY_FIND'--p_query_find_para in varchar2 default null
 );
 其中p_folder_block是必须输入的,就是文件夹查询结果的数据块。
 p_muti_check_box_item是可选输入。这个Item是属于CHECK_BOX的,实现多项排序的效果。
3 在对应的查询的Block的PRE-QUERY触发器增加代码:
 app_folder.event('PRE-QUERY');
 --注意:必须增加在app_folder.event('PRE-QUERY');之后!
  XYG_FLODER_ACTION.sort_action_event('PRE-QUERY');
4 在对应的全排序的Block触发器 WHEN-NEW-BLOCK-INSTANCE/ POST-BLOCK分别增加:
  WHEN-NEW-BLOCK-INSTANCE :XYG_FLODER_ACTION.sort_action_event('WHEN-NEW-BLOCK-INSTANCE');
  POST-BLOCK :XYG_FLODER_ACTION.sort_action_event('POST-BLOCK');

完工!可以说是一个非常完美的全排序效果!


---------下面是历史版本!不再使用下面的办法!已经有更新!---------------
整理by sam.t in 2012.9.12
实现特定的Item的排序效果。
实现过程:
1 增加参数:SORT_RULE(字节型的,目的是传递要排序的Item给对应的Block)
2 在对应的PROMPT Item的WHEN-MOUSE-UP增加代码:XYG_FLODER_ACTION.GET_BLOCK_SORT(:SYSTEM.TRIGGER_ITEM,folder_block);
3 在对应的查询的Block的PRE-QUERY触发器增加代码:
app_folder.event('PRE-QUERY');
--注意:必须增加在app_folder.event('PRE-QUERY');之后!
IF SUBSTR(:PARAMETER.SORT_RULE,1,1) = 'Y' THEN
       XYG_FLODER_ACTION.CALL_BLOCK_SORT(:PARAMETER.SORT_RULE);
END IF;

具体实现效果请参考Form:XYG_ONT_STATISTICSQ_SP
2012.9.25支持增加选中check box可以多项目排序
写法:
1 在某一个特定的块增加一个check box。
例如:CONTROL.MULT_ORDER_BY
触发器:WHEN-CHECKBOX-CHANGED
代码:
SET_BLOCK_PROPERTY('DETAIL', ORDER_BY, '');
:PARAMETER.SORT_RULE := NULL;
2 然后在每个显示的Item最下面增加下面的语句:
XYG_FLODER_ACTION.GET_BLOCK_SORT(:SYSTEM.TRIGGER_ITEM,'DETAIL','CONTROL.MULT_ORDER_BY');
---
然后就可以实现这种效果:
当我勾上多项排序的勾选框,每点下一个Item,会自动累加排序条件。
----------------历史版本 END-------------------
*/

  PROCEDURE define_SORT(p_folder_block IN VARCHAR2,p_prompt_block IN VARCHAR2,p_muti_check_box_item in varchar2 default null,p_query_find_para in varchar2 default null) is
  begin
    if p_folder_block is not null then
     XYG_FLODER_ACTION.SORT_ALLOW := 'Y';
     XYG_FLODER_ACTION.folder_block := p_folder_block;
     XYG_FLODER_ACTION.prompt_block := p_prompt_block;
     XYG_FLODER_ACTION.muti_check_box_item := p_muti_check_box_item;
     XYG_FLODER_ACTION.query_find_para := p_query_find_para;
     DEFAULT_VALUE('','GLOBAL.XYG_SORT_QUERY_TYPE');
     XYG_FLODER_ACTION.go_new_block := TRUE;
    end if;
  end define_SORT;

  procedure GET_BLOCK_SORT(block_item IN VARCHAR2) IS
   prompt_block_name varchar2(80);
   item_name  varchar2(80);
   muti_check boolean;
   order_by1  varchar2(500);
   i          number;
   MULT_I NUMBER;
   ---
   item_name3 VARCHAR2(50);
   curr_item_id ITEM;
   slot NUMBER;
   column_can_be_sorted BOOLEAN;
    mx           number;
    l_sort_rule_cn varchar2(4000);
    --
    --l_G_QUERY_FIND ITEM;
 BEGIN 
  IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN;
  END IF;
   i := INSTR(block_item, '.');
   if i > 1 then
     item_name  := UPPER(SUBSTR(block_item, i + 1));
     prompt_block_name := SUBSTR(block_item, 1, i - 1);
   else
    return;
   end if;
  
  --FND_MESSAGE.DEBUG('app_folder:'||app_folder.folder_block||CHR(10)||'XYG_FLODER_ACTION:'||XYG_FLODER_ACTION.folder_block);
  IF prompt_block_name = XYG_FLODER_ACTION.prompt_block THEN
      XYG_FLODER_ACTION.SORT_ALLOW := 'Y';
  ELSE
     XYG_FLODER_ACTION.SORT_ALLOW := 'N';
     XYG_PUB_ACTION_CTL.hint_message('您切换到一个非全排序的数据块!','HINT',FALSE);
     return;
  END IF;
   --i := INSTR(block_item, '_PROMPT');
  
    --FND_MESSAGE.DEBUG(item_name||':'||get_item_property(item_name, BASE_TABLE));
    IF get_item_property(XYG_FLODER_ACTION.folder_block||'.'||item_name, BASE_TABLE) = 'TRUE'
     AND get_item_property(XYG_FLODER_ACTION.folder_block||'.'||item_name, COLUMN_NAME) IS NOT NULL THEN
      NULL;
    ELSE
     XYG_PUB_ACTION_CTL.hint_message('非数据库栏位,不可以作为排序条件!','HINT',FALSE);
     RETURN;
    END IF;
    
    ---如果是改变Item的X和Y坐标,还有宽度等,或者拖动Item,是不需要排序的
    mx := to_number(name_in('system.mouse_x_pos'));
    if (mx <= 1.5) then
       return;
   elsif (mx <= 2.5) then
       return;
   elsif (mx <= 3.5) then
       return;
   elsif (mx <= 4.5) then
     --
     -- Sorting
     --
     if (name_in('system.mode') = 'ENTER-QUERY') then
       -- not allowed in Enter Query mode
       return;
     end if;
     --
     --
     app_folder_drag_block_switch('TO');
     --
     if not app_folder.orderby_allowed then
       app_folder_drag_block_switch('RETURN');
       return;
     end if;
     --
     -- Do not sort if there are no queried records in the block
     --
     if get_block_property(app_folder.folder_block_id,STATUS) = 'NEW' then
       app_folder_drag_block_switch('RETURN');
       return;
     end if;
   end if;
  
  
   ---检查是否前三个Item
   ---因为前面三个Item不需要客制排序的!
   column_can_be_sorted := FALSE;
    for i in 1..3 loop
      item_name3 := get_group_char_cell(app_folder.active_name_id, i);
      --FND_MESSAGE.DEBUG('item_name3:'||item_name3);
      curr_item_id := find_item(XYG_FLODER_ACTION.folder_block||'.'||item_name3);
      if (get_item_property(curr_item_id, ITEM_TYPE) != 'BUTTON') then
        if (get_item_property(curr_item_id, BASE_TABLE) = 'TRUE') then
          slot := slot + 1;
          if (item_name3 = item_name) then
            column_can_be_sorted := TRUE;
            EXIT;
          end if;
        end if;
      end if;
      exit when (slot = 3);
    end loop;

    ----------整理排序的Item
   IF i > 1 THEN
     --item_name  := UPPER(SUBSTR(block_item, i + 1));
     order_by1  := UPPER(GET_BLOCK_PROPERTY(XYG_FLODER_ACTION.folder_block, ORDER_BY));
     --FND_MESSAGE.DEBUG('order_by1:'||order_by1);
     IF XYG_FLODER_ACTION.muti_check_box_item IS NOT NULL THEN
       muti_check := CHECKBOX_CHECKED (XYG_FLODER_ACTION.muti_check_box_item);
     ELSE
      muti_check := FALSE;
     END IF;
    
     IF muti_check THEN
      ---当User是希望多项排序的时候,永远以参数的排序为主!
     MULT_I := INSTR(NAME_IN('PARAMETER.SORT_RULE'), '|');
     IF MULT_I > 1 THEN
       order_by1 := SUBSTR(NAME_IN('PARAMETER.SORT_RULE'), MULT_I + 1);
     ELSE
      order_by1 := NULL;
     END IF;
     --FND_MESSAGE.DEBUG('SORT_RULE:'||NAME_IN('PARAMETER.SORT_RULE')||CHR(10)||'order_by1:'||order_by1);
    
      IF NVL(INSTR(UPPER(','||order_by1||','), ','||item_name||','),0) >= 1
       OR NVL(INSTR(UPPER(','||order_by1||','), ','||item_name||' DESC,'),0) >= 1 THEN ---本来就有这个Item作为排序,则将这个Item由没有倒序改为倒序
        IF INSTR(UPPER(','||order_by1||','),','||item_name|| ' DESC,') >= 1 then
          COPY('Y' || XYG_FLODER_ACTION.folder_block || '|'
          ||RTRIM(LTRIM( REPLACE(','||order_by1||',' , ','||item_name||' DESC,' , ','||item_name||','),','),','),'PARAMETER.SORT_RULE');
        ELSE
          COPY('Y' || XYG_FLODER_ACTION.folder_block || '|'
          ||RTRIM(LTRIM(  REPLACE(','||order_by1||',' , ','||item_name||',' , ','||item_name||' DESC,'),','),','),'PARAMETER.SORT_RULE');
        END IF;
      ELSE
        IF order_by1 IS NOT NULL THEN
            COPY('Y' || XYG_FLODER_ACTION.folder_block || '|' || order_by1||','||item_name,'PARAMETER.SORT_RULE');
        ELSE
            COPY('Y' || XYG_FLODER_ACTION.folder_block || '|' ||item_name,'PARAMETER.SORT_RULE');
        END IF;
      END IF;
       --FND_MESSAGE.DEBUG('MULT SORT_RULE:'||NAME_IN('PARAMETER.SORT_RULE'));
     ELSE
       /*IF column_can_be_sorted THEN
        order_by1 := NULL;
       end if;*/
      IF INSTR(order_by1, item_name) >= 1 THEN
        IF INSTR(UPPER(order_by1), ' DESC') >= 1 then
          COPY('Y' || XYG_FLODER_ACTION.folder_block || '|' || item_name,'PARAMETER.SORT_RULE');
        ELSE
          COPY('Y' || XYG_FLODER_ACTION.folder_block || '|' || item_name ||' DESC','PARAMETER.SORT_RULE');
        END IF;
      ELSE
        COPY('Y' || XYG_FLODER_ACTION.folder_block || '|' || item_name,'PARAMETER.SORT_RULE');
      END IF;
       --FND_MESSAGE.DEBUG('SORT_RULE:'||NAME_IN('PARAMETER.SORT_RULE'));
     END IF;
    
     COPY( 'BLOCK_ITEM','GLOBAL.XYG_SORT_QUERY_TYPE');
     if XYG_FLODER_ACTION.query_find_para is not null then
       copy('TRUE',XYG_FLODER_ACTION.query_find_para);
     end if;
    
     GO_BLOCK(folder_block);
    Do_Key('Execute_Query');
   
     if XYG_FLODER_ACTION.query_find_para is not null then
       copy('FALSE',XYG_FLODER_ACTION.query_find_para);
     end if;
     IF NOT column_can_be_sorted or muti_check THEN
      --XYG_FLODER_ACTION.query_type := 'BLOCK_ITEM';
      --fnd_message.debug('1');
      --GO_BLOCK(folder_block);
      --Do_Key('Execute_Query');
      --fnd_message.debug('2');
      --XYG_FLODER_ACTION.query_type := 'QUERY_ITEM';
      NULL;
    ELSE
      --fnd_message.debug('3');
       COPY( 'N' ||XYG_FLODER_ACTION.folder_block ||'|'|| UPPER(GET_BLOCK_PROPERTY(XYG_FLODER_ACTION.folder_block, ORDER_BY)),'PARAMETER.SORT_RULE');
     END IF;
     COPY( 'N' || SUBSTR(NAME_IN('PARAMETER.SORT_RULE'), 2),'PARAMETER.SORT_RULE');
     Go_Item(XYG_FLODER_ACTION.folder_block || '.' || item_name);
     l_sort_rule_cn := GET_MUTI_SORT_COLNAME(NAME_IN('PARAMETER.SORT_RULE'));
     IF XYG_FLODER_ACTION.muti_check_box_item IS NOT NULL THEN
      SET_ITEM_PROPERTY(XYG_FLODER_ACTION.muti_check_box_item,TOOLTIP_TEXT,'排序条件为:'||l_sort_rule_cn);
      END IF;
    XYG_PUB_ACTION_CTL.hint_message('您的排序条件为:'||l_sort_rule_cn,'HINT',FALSE);
     --FND_MESSAGE.DEBUG(GET_MUTI_SORT_COLNAME(NAME_IN('PARAMETER.SORT_RULE')));
   END IF;
   COPY( 'QUERY_ITEM','GLOBAL.XYG_SORT_QUERY_TYPE');
 END GET_BLOCK_SORT;
 
 PROCEDURE CALL_BLOCK_SORT(sort_rule IN VARCHAR2) IS
   block_name    varchar2(80);
   sort_rule_new varchar2(500);
   i             number;
 BEGIN
  IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN;
  END IF;
   i := INSTR(sort_rule, '|');
   IF i > 1 THEN
     block_name    := SUBSTR(sort_rule, 2, i - 2);
     sort_rule_new := SUBSTR(sort_rule, i + 1);
     SET_BLOCK_PROPERTY(block_name, ORDER_BY, sort_rule_new);
   END IF;
 END CALL_BLOCK_SORT;
 
  PROCEDURE MULT_ORDER_BY(m_event in varchar2) is
  begin
   IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN;
  END IF;
   IF m_event = 'WHEN-CHECKBOX-CHANGED' THEN
   SET_BLOCK_PROPERTY(XYG_FLODER_ACTION.folder_block, ORDER_BY, '');
   COPY('','PARAMETER.SORT_RULE');
   IF XYG_FLODER_ACTION.muti_check_box_item IS NOT NULL THEN
   SET_ITEM_PROPERTY(XYG_FLODER_ACTION.muti_check_box_item,TOOLTIP_TEXT,'');
   END IF;
    XYG_PUB_ACTION_CTL.hint_message('请注意:系统已经自动将排序条件初始化!','HINT',FALSE);
    /*elsif event = 'PRE-QUERY' THEN
   --SET_BLOCK_PROPERTY(XYG_FLODER_ACTION.folder_block, ORDER_BY, '');
   COPY('','PARAMETER.SORT_RULE');
   SET_ITEM_PROPERTY(XYG_FLODER_ACTION.muti_check_box_item,TOOLTIP_TEXT,'');*/
  ELSE
    XYG_PUB_ACTION_CTL.hint_message('unable to pass even1:'||m_event,'HINT',FALSE);
  END IF;
  exception
   when others then
    XYG_PUB_ACTION_CTL.hint_message(SQLERRM,'HINT',FALSE);
  end MULT_ORDER_BY;
 
 FUNCTION GET_MUTI_SORT_COLNAME(P_MUTI_SORT_RULE IN VARCHAR2)
 RETURN VARCHAR2 IS
   i number;
   n number;
   n_prever number; ---记录上次截断到哪里
   n_spe number; ---第几个逗号
   l_muti_order_by varchar2(4000);
   item_name VARCHAR2(150);
   l_desc boolean; --是否含有desc
    recnum         INTEGER;
    app_folder_def_prompt VARCHAR2(80);
   l_return varchar2(4000);
 BEGIN
  IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN null;
  END IF;
   i := INSTR(P_MUTI_SORT_RULE, '|');
   IF i > 1 THEN
     l_muti_order_by := UPPER(SUBSTR(P_MUTI_SORT_RULE, i + 1));
   ELSE
     l_muti_order_by := UPPER(P_MUTI_SORT_RULE);
   END IF;
   l_muti_order_by := l_muti_order_by||',';
  
  n_spe := 1;
  n_prever := 1;
  l_return := NULL;
  for m in 1..lengthb(l_muti_order_by) loop
   n := instr(l_muti_order_by,',',1,n_spe);
     exit when n = 0;
   item_name := substr(l_muti_order_by,n_prever,n-n_prever);
   if INSTR(item_name, ' DESC') >= 1 then
    l_desc:= true;
    item_name := replace(item_name, ' DESC',null);
   else
    l_desc := false;
   end if;
   item_name := TRIM(item_name);
   
    recnum := get_group_record_number(app_folder.master_name_id, item_name);
   
    if recnum != 0 then
      app_folder_def_prompt := get_group_char_cell(app_folder.master_prompt_id, recnum);
      --copy(app_folder_def_prompt, app_folder.control_block||'.new_prompt');
      IF l_desc THEN
        l_return := l_return||','||app_folder_def_prompt||'(降序)';
      else
        l_return := l_return||','||app_folder_def_prompt;
      end if;
    end if;
   n_spe := n_spe + 1;
   n_prever := n+1;
  end loop;
  
  return LTRIM(l_return,',');
 EXCEPTION
  WHEN OTHERS THEN
  RETURN SQLERRM;
 END GET_MUTI_SORT_COLNAME;
 
  --做的时候遇到一个非常奇怪的问题:想整合PRE-QUERY的代码到这里,但是一旦移到define_SORT下面,就会出问题!现象是,p_event居然是点击的Item的名称,不知道何解20120927
  --解决:将这个代码(sort_action_event)放到最后就可以。
  PROCEDURE sort_action_event(p_event in varchar2) is
    l_system_item varchar2(80);
  begin
   IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN;
  END IF;
    --fnd_message.debug('p_event:'||p_event);
   IF p_event = 'PRE-QUERY' THEN
    IF XYG_FLODER_ACTION.folder_block IS NULL OR XYG_FLODER_ACTION.prompt_block IS NULL THEN
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       RETURN;
   END IF;
   --fnd_message.debug('query_type from:'||NAME_IN('GLOBAL.XYG_SORT_QUERY_TYPE'));
   IF NVL(NAME_IN('GLOBAL.XYG_SORT_QUERY_TYPE'),'QUERY_ITEM') = 'QUERY_ITEM' THEN ---当点查询按钮QUERY_ITEM的时候,自动将所有的东西都清空
     COPY('','PARAMETER.SORT_RULE');
     IF XYG_FLODER_ACTION.muti_check_box_item IS NOT NULL THEN
     SET_ITEM_PROPERTY(XYG_FLODER_ACTION.muti_check_box_item,TOOLTIP_TEXT,'');
     END IF;
     --fnd_message.debug('query_type from:'||NAME_IN('GLOBAL.XYG_SORT_QUERY_TYPE'));
    --XYG_PUB_ACTION_CTL.hint_message('请注意:系统已经自动将排序条件初始化!','HINT',FALSE);
   ELSE
    NULL;
   END IF;
   --fnd_message.debug('SORT_RULE from:'||NAME_IN('PARAMETER.SORT_RULE'));
   IF NVL(SUBSTR(NAME_IN('PARAMETER.SORT_RULE'),1,1),'N') = 'Y' THEN
      XYG_FLODER_ACTION.CALL_BLOCK_SORT(NAME_IN('PARAMETER.SORT_RULE'));
   END IF;
  ELSIF p_event = 'WHEN-NEW-BLOCK-INSTANCE' THEN
   IF app_folder.folder_block = XYG_FLODER_ACTION.folder_block THEN
        XYG_FLODER_ACTION.SORT_ALLOW := 'Y';
   ELSE
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
   END IF;
  ELSIF p_event = 'POST-BLOCK' THEN
   IF app_folder.folder_block = XYG_FLODER_ACTION.folder_block THEN
        XYG_FLODER_ACTION.SORT_ALLOW := 'Y';
   ELSE
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
   END IF;
  ELSIF p_event = 'PRE-WHEN-MOUSE-UP' THEN
   --FND_MESSAGE.DEBUG('TRIGGER_ITEM:'||NAME_IN('SYSTEM.TRIGGER_ITEM')||chr(10)||'app_folder:'||app_folder.folder_block||CHR(10)||'XYG_FLODER_ACTION:'||XYG_FLODER_ACTION.folder_block);
   IF SUBSTR(NAME_IN('SYSTEM.TRIGGER_ITEM'), 1, INSTR(NAME_IN('SYSTEM.TRIGGER_ITEM'), '.') - 1) = XYG_FLODER_ACTION.prompt_block THEN
        XYG_FLODER_ACTION.SORT_ALLOW := 'Y';
        /*IF XYG_FLODER_ACTION.go_new_block THEN
         --l_system_item := NAME_IN('SYSTEM.TRIGGER_ITEM');
        GO_BLOCK(app_folder.folder_block);
        --app_folder.event('WHEN-NEW-BLOCK-INSTANCE');
        --go_item(l_system_item);
        XYG_FLODER_ACTION.go_new_block := FALSE;
       END IF;*/
   ELSE
       XYG_FLODER_ACTION.SORT_ALLOW := 'N';
       --XYG_PUB_ACTION_CTL.hint_message('您切换到一个非全排序的数据块!','HINT',FALSE);
       XYG_FLODER_ACTION.go_new_block := TRUE;
   END IF;
  ELSIF p_event = 'WHEN-MOUSE-UP' THEN
   --FND_MESSAGE.DEBUG('app_folder:'||app_folder.folder_block||CHR(10)||'XYG_FLODER_ACTION:'||XYG_FLODER_ACTION.folder_block);
     IF NVL(XYG_FLODER_ACTION.SORT_ALLOW,'N') = 'Y' THEN
        XYG_FLODER_ACTION.GET_BLOCK_SORT(NAME_IN('SYSTEM.TRIGGER_ITEM'));
     END IF;
  ELSE
    XYG_PUB_ACTION_CTL.hint_message('unable to pass even2:'||p_event,'HINT',FALSE);
  END IF;
  exception
   when others then
   null;
  end sort_action_event;
 
END;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值