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;