Oracle EBS Form中實現點擊欄位標題進行排序

來源:互聯網
上載者:User

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;

 本例說到的功能完成以上幾個步驟後已經實現了,當然可以再擴充,更加方便使用的。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.