技術交流

於 EBS 客製 FORM 中引用鍵彈性欄位元

瞭解 EBS 的人都知道,彈性欄位元為 EBS的一大特點,在 EBS 的實施中有著舉足輕重的作用,分為關鍵彈性域(Key Flexfields)和描述性彈性域(Descriptive Flexfields)。

  • 關鍵性彈性域:具有足夠的彈性,容許使用任意代碼組合以描述實體。在實施 EBS 時,顧問會定義所有的關鍵性彈性域,以使用有含義的程式碼片段來說明每個關鍵性彈性域實體。可為每個關鍵性彈性域確定實體具有多少段、每段的含義、每個段具有的值以及每個段值代表的含義。
  • 說明性彈性域:說明性彈性域用來擴充表單,系統可以使用說明性彈性域來獲取業務所特有的重要附加資訊。

根據如上定義,可以簡單理解成 Key Flexfields 中的 segment 是已經有 business 意義的,而 Descritive Flexfields 中的 segment 是還沒定好具體意義,可以讓客戶自己定義的。故在實際的客製化中 Descriptive Flexfields 的應用是比較頻繁的,而 Key Flexfields 於客製化中的應用確實比較少,不過,偶爾還是會有需要於客製 FORM 中引用系統已定義好的鍵彈性欄位元架構來實現。目前這方面的實例比較少,這裡將筆者最近整理的一套實現方法寫出來與大家共用:

  • FORM 版本為 R12 中的 TEMPLATE.fmb。
  • 需要載入與彈性欄位元相關的 Library:FNDSQF。

以 FORM 中引用會計科目架構為例,實現步驟

於 block ‘HEADER’ 中增加兩個欄位‘OTHER_ACCOUNT’ 和 ‘OTHER_ACCT_ID’,分別用於存放會計科目和會計科目的 id,且兩個欄位元的 Database Item 屬性為 ‘Yes’。 OTHER_ACCOUNT 的是否顯示屬性為 ‘YES’, OTHER_ACCT_ID為 ‘NO’。

於 form 的 program units 中創建一 procedure,用於定義會計科目的彈性欄位元。


PROCEDURE ACCOUNT_DEFINE(P_BLOCK_NAME VARCHAR2,
               P_FIELD VARCHAR2,
               P_ID VARCHAR2,
               P_DESCRIPTION VARCHAR2,
               P_ORG_ID NUMBER
              ) IS
 V_COA NUMBER;
BEGIN
 SELECT sob.CHART_OF_ACCOUNTS_ID
 INTO V_COA
 FROM gl_sets_of_books sob
  ,hr_operating_units hou
WHERE hou.set_of_books_id=sob.set_of_books_id
and hou.ORGANIZATION_ID=P_ORG_ID;

FND_KEY_FLEX.Define
 (
     BLOCK => P_BLOCK_NAME,
     FIELD => P_FIELD,
     ID => P_ID,
     description => P_DESCRIPTION,
     APPL_SHORT_NAME => 'SQLGL',----此鍵彈性欄位元對應的模組簡碼
      CODE => 'GL#', -----每個模組有自己的固定值GL為 ‘GL#’,AP為 ‘AP’ 等,具體可參考EBS開發嚮導
     NUM => V_COA, ----彈性欄位元的 STRUCTURE Number
     REQUIRED => 'N',
     VALIDATE => 'FULL',
     USEDBFLDS => 'N',
     DINSERT => 'Y'
     );
END;

於 ‘HEADER’ BLOCK 中的 trigger POST–QUERY, PRE–INSERT, PRE–UPDATE, WHEN–VALIDATE–RECORD WHEN–NEW–ITEM–INSTANCE和item ‘OTHER_ACCOUNT’的WHEN–VALIDATE–ITEM trigger 中增加如下代碼,引用彈性欄位元定義:


ACCOUNT_DEFINE('HEADER' ,
'OTHER_ACCOUNT' ,
'OTHER_ACCT_ID',
NULL, --ACCOUNT DESCRIPTION
:HEADER.ORG_ID
);

於 BLOCK ‘HEADER’ 和 ‘OTHER_ACCOUNT’ 欄位中增加如下 trigger:

Trigger Procedure
PRE–QUERY FND_FLEX.EVENT('PRE-QUERY');
POST–QUERY FND_FLEX.EVENT(’POST–QUERY’);
PRE–INSERT FND_FLEX.EVENT(’PRE–INSERT’);
PRE–UPDATE FND_FLEX.EVENT(’PRE–UPDATE’);
WHEN–VALIDATE–RECORD FND_FLEX.EVENT(’WHEN–VALIDATE–RECORD’);
WHEN–NEW–ITEM–INSTANCE FND_FLEX.EVENT(’WHEN–NEW–ITEM–INSTANCE’);
WHEN–VALIDATE–ITEM FND_FLEX.EVENT(’WHEN–VALIDATE–ITEM’);

至此引用 Key Flexfields 的功能已實現,此方法適用於客製 Form 中引用 EBS 中定義好的任意鍵彈性欄位元架構,引用其它架構時只需修改引用 FND_KEY_FLEX.Define procedure 時參數 ‘APPL_SHORT_NAME’、‘ CODE’、‘NUM’ 的值與被引用的架構進行對應即可。

若您是一位 EBS 的使用者,是否有對 EBS 中的鍵彈性欄位元的實現方法感到好奇?願此篇文章讓您找到答案!如果您是一位 EBS 的維護或開發人員,是否也有過為實現引用 EBS 的 Key Flexfields 而感到苦惱?願此篇文章讓您的苦惱化為烏有!

Tags:OracleEBSERP程式客製
閱讀更多