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;
本例說到的功能完成以上幾個步驟後已經實現了,當然可以再擴充,更加方便使用的。