27.1 问题描述在做EBS表单开发时,虽然使用folder功能提供了排序功能,对多行数据块可以对前三列进行指定排序,也可以单击前三列的列标题进行排序,但是不能对更多的列进行排序,如果要对更多的列进行排序,需要将要排序的列拖动到前三列才可以进行,限制较大。我们在MRPII系统中一般可以对任何列进行点击列标题进行排序,如何在保证文件夹功能的前提下实现点击列标题自动排序呢?27.2解决方案经过测试,我认为文件夹功能进行排序是通过更改对应的数据块的ORDER BY属性,然后执行查询而实现的,并非在客户端进行排序,而是通过数据库服务器实现排序的,明白这个原理以后就好操作了。我这个点击列标题进行排序功能需要大家使用文件夹功能,具体是指对应数据块需要有个这个数据块名加上_PROMPT的数据块对应,且这个块的项目的Name属性要为对应的列的数据源字段名,如果大家按照规范使用文件夹功能,这个前提已经满足了。情景:有个多行数据块名为BILL_LINES,实现了文件夹功能,其对应的列标题数据块是BILL_LINES_PROMPT,以下是实现部分: 步骤1:新建参数,Name属性为SORT_RULE,Parameter Data Type属性为Char,Maximum Length属性为150,Parameter Initial Value为NO_RULE,也就是做如下图所示设置: 步骤2:创建包BLOCK_SORT,包说明使用的代码如下:PACKAGE BLOCK_SORT IS PROCEDURE GET_SORT(block_item IN VARCHAR2); PROCEDURE CALL_SORT(sort_rule IN VARCHAR2);END;包主体使用的代码如下:PACKAGE BODY BLOCK_SORT IS procedure GET_SORT(block_item IN VARCHAR2) IS block_name varchar2(80); item_name varchar2(80); order_by1 varchar2(80); i number; BEGIN i := INSTR(block_item,"_PROMPT"); IF i>1 THEN item_name := SUBSTR(block_item,i+8); block_name := SUBSTR(block_item,1,i-1); order_by1 :=GET_BLOCK_PROPERTY(block_name,ORDER_BY); IF INSTR(order_by1,item_name)>=1 THEN IF INSTR(UPPER(order_by1),"DESC")>=1 then :PARAMETER.SORT_RULE :="Y" || block_name || "|" || item_name; ELSE :PARAMETER.SORT_RULE :="Y" || block_name || "|" || item_name || " DESC"; END IF; ELSE :PARAMETER.SORT_RULE :="Y" || block_name || "|" || item_name; END IF; Do_Key("Execute_Query"); :PARAMETER.SORT_RULE :="N" || SUBSTR(:PARAMETER.SORT_RULE,2); END IF; END GET_SORT; PROCEDURE CALL_SORT(sort_rule IN VARCHAR2) IS block_name varchar2(80); sort_rule_new varchar2(80); i number; BEGIN 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_SORT;END; 步骤三:在要执行点击列标题进行排序的列标题,比如在BILL_LINES_PROMPT数据块的OSALE_PRICE项目的WHEN-MOUSE-UP触发器中的代码app_folder.event("WHEN-MOUSE-UP"); 后面增加如下代码BLOCK_SORT.GET_SORT(:SYSTEM.TRIGGER_ITEM);如果要对多列进行点击列标题进行排序,多次重复此步骤增加一行代码。 步骤四:在要执行查询的数据块,这里是BILL_LINES的PRE-QUERY事件的app_folder.event("PRE-QUERY"); 代码后增加如下代码即可。:IF SUBSTR(:PARAMETER.SORT_RULE,1,1) = "Y" THEN BLOCK_SORT.CALL_SORT(:PARAMETER.SORT_RULE);END IF; 本例说到的功能完成以上几个步骤后已经实现了,当然可以再扩展,更加方便使用的。Oracle:出错 ORA-12519, TNS:no appropriate service handler foundOracle SQL语句实例相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)