瞭解 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 而感到苦惱?願此篇文章讓您的苦惱化為烏有!