詳談彈性域用法
彈性域的使用彈性域分為鍵彈性域和說明性彈性域,本文就針對這兩種彈性域在二次開發(fā)中使用進行舉例說明,并附帶說明彈性域中經(jīng)常使用的值集一、彈性域開發(fā)中需要做的前期工作1.注冊一個可以使用彈性域的表,字段本
彈性域的使用
彈性域分為鍵彈性域和說明性彈性域,本文就針對這兩種彈性域在二次開發(fā)中使用進行舉例說明,并附帶說明彈性域中經(jīng)常使用的值集
一、彈性域開發(fā)中需要做的前期工作
1.注冊一個可以使用彈性域的表,字段
本范例全部以如下對象為基礎(chǔ),進行彈性域的說明
CREATE TABLE FLEX_LN(
NAME VARCHAR2(20),
AGE NUMBER,
DEPT VARCHAR2(20),
ATTRIBUTE1 VARCHAR2(250),
ATTRIBUTE2 VARCHAR2(250),
ATTRIBUTE3 VARCHAR2(250),
ATTRIBUTE4 VARCHAR2(250),
ATTRIBUTE_CATEGORY VARCHAR2(250)
);
注冊數(shù)據(jù)庫表,列
系統(tǒng)中的數(shù)據(jù)庫表和列的注冊旨在支持系統(tǒng)的彈性域和預(yù)警系統(tǒng)兩個特性如果不需要這些特性不需要注冊
表.注冊方法: 用如下的過程注冊表
AD_DD.register_table (
p_appl_short_name in varchar2,
p_tab_name in varchar2,
p_tab_type in varchar2,
p_next_extent in number default 512,
p_pct_free in number default 10,
p_pct_used in number default 70);
如我們需要注冊表 FLEX_LN 用如下的語句在EDV 應(yīng)用中注冊:
EXECUTE ad_dd.register_table('EDV','FLEX_LN','T');
這里說明下,EDV是在系統(tǒng)注冊過的一個應(yīng)用簡稱,二次開發(fā)的程序,最好重新注冊一個應(yīng)用,這樣便
于今后的管理。如下圖:
(當(dāng)然注冊一個應(yīng)用的方法本文不在敘述)
注冊表中的列(彈性域列)方法如下.
begin
ad_dd.register_column('EDV','FLEX_LN','ATTRIBUTE1',1, 'VARCHAR2', 250,'Y', 'N');
ad_dd.register_column('EDV','FLEX_LN','ATTRIBUTE2',2, 'VARCHAR2', 250,'Y', 'N');
ad_dd.register_column('EDV','FLEX_LN','ATTRIBUTE3',3, 'VARCHAR2', 250,'Y', 'N');
ad_dd.register_column('EDV','FLEX_LN','ATTRIBUTE4',4, 'VARCHAR2', 250,'Y', 'N');
ad_dd.register_column('EDV','FLEX_LN','ATTRIBUTE_CATEGORY',5, 'VARCHAR2',250,'Y', 'N');
end;
COMMIT;
看我們是否注冊成功可以查看FND_TABLES/FND_COLUMNS 中是否存在我們已經(jīng)注冊的表和列,
如果我們想刪除我們的注冊可以引用下面的相應(yīng)的過程.
procedure delete_table (p_appl_short_name in varchar2,p_tab_name in varchar2);
procedure delete_column (p_appl_short_name in varchar2,
p_tab_name in varchar2,
p_col_name in varchar2);
注冊說明性彈性域
注冊如圖所示:
,應(yīng)用:選擇注冊的應(yīng)用
名稱:填寫注冊說明彈性域的名稱(必須唯一)
標(biāo)題:彈性域的標(biāo)題,在今后的應(yīng)用中,此說明彈性域?qū)诖翱跇?biāo)題上顯示在此定義的標(biāo)題內(nèi)容
說明:
表應(yīng)用:在注冊表,列時指定的應(yīng)用(appl_short_name)
表名: 選擇注冊的表名稱
結(jié)構(gòu)列:必須也是存在于注冊過的列,結(jié)構(gòu)列的意義就是存放說明性彈性域上下文提示的值
上下文提示:是在說明性彈性域上下文字段的標(biāo)題描述
參考字段BUTTON里,如下界面
上面的界面是輸入界面,系統(tǒng)提供輸入,這里可以輸入多個記錄,當(dāng)然最終只能有一個字段來起作用,需要在段里指定。
字段名:必須與彈性域中選擇的表中的字段一致。
說明:對字段的描述性文字
參考字段的含義:
參考字段的主要作用是 與結(jié)構(gòu)列的作用類似,可以在不選擇上下文字段的情況下,系統(tǒng)根據(jù)參考字段的含義來對應(yīng)顯示不用的彈性域,
舉例說明:例如參考字段為 NAME,則在系統(tǒng)中輸入NAME信息后,系統(tǒng)會自動根據(jù)NAME的信息來確定顯示什么樣的彈性域,這樣就可以避免來選擇上下文來顯示需要的彈性域。
列BUTTON里,如下界面
這里面顯示的是注冊后的列字段(如果填寫了結(jié)構(gòu)列字段,則這里面將不在顯示結(jié)構(gòu)列字段,因為系統(tǒng)認為結(jié)構(gòu)列字段
與彈性字段是不同的)
,如果對某個彈性字段不需要,可以將起用CHECK ED 失效,這樣在構(gòu)造彈性域的時候,此彈性字段不會作用顯示系統(tǒng)注冊完彈性域的名稱后,下一步需要配置彈性域的彈性字段
界面如下:
此處的界面需要重點注意的地方:
上下文字段
->提示:這里的提示是上下文PROMPT的信息,在這里輸入信息后,在注冊彈性域 “上下文提示” 欄的內(nèi)容,兩者的內(nèi)容是一致的
->值集:為上下文字段的內(nèi)容提供一個值的LOV形式選擇,
以本例說明:值集SET_VALUE_DESC_FLEX中包括的信息是“彈性一”、“彈性二”,這樣,就可以根據(jù)選擇不同的信息來實現(xiàn)不同的彈性域,而且,選擇的上下文字段信息(此處就是彈性域上下文AAAA欄)會保存在結(jié)構(gòu)列中。
->默認值: 設(shè)定上下文的默認值
->參考字段:此處系統(tǒng)提供的是一個LOV輸入,此處LOV里的數(shù)據(jù)來源于在注冊彈性域里的時候“參考字段:”BUTTON里的輸入記錄。
參考字段的含義是,可以以其他字段的輸入記錄來判斷是否顯示哪種彈性域。
上下文字段值
這里可以定義多個彈性域段:比如 彈性域1=彈性字段1 彈性字段2
彈性域2=彈性字段1 彈性字段2 彈性字段3
彈性域3=彈性字段1 彈性字段2 彈性字段3 彈性字段4
這里需要說明下:每個彈性的段信息中,都有一個默
認的段定義 Global Data Elements
,彈性域Global Data Elements 的段結(jié)構(gòu)如下:
如果我們定義的彈性域只有一種段結(jié)構(gòu)的話,可以直接在 Global Data Elements段中進行定義,如果有多個的話,需要在另創(chuàng)建記錄進行段定義的需要,有一點需要說明的是,一旦有注冊了的字段在 Global Data Elements中定義了結(jié)構(gòu)的話,那么用戶自己在創(chuàng)建其他的段結(jié)構(gòu),則不會顯示在Global Data Elements中使用了的字段
具體定義彈性域中需要那些彈性字段,需要在“段”BUTTON里的界面中進行定義
如 彈性一 的段結(jié)構(gòu)
彈性二 的段結(jié)構(gòu)
,以本文中的為例進行說明: Global Data Elements 段中定義了一個 ATTRIBUTE1字段,那么在彈性一、彈性二中的段定義的時候,無法在選擇 ATTRIBUTE1這個字段。
針對此彈性域的配置,在實際使用中的說明:
圖中紅色框代表的是加載說明性彈性域的字段,點擊此處,便可出現(xiàn)彈性域的結(jié)構(gòu)。 由于在系統(tǒng)設(shè)置彈性域段的時候,給上下文段一個默認值 = “彈性一” 則系統(tǒng)會自動將彈性一的段結(jié)構(gòu)給顯示出來(定義了三個彈性字段TITLE分別為10、15、20),由于此彈性域還定義了一個Global Data Elements 的段結(jié)構(gòu),則系統(tǒng)會將Global Data Elements 顯示在最前面,作為整個彈性域的公共字段(不論彈性域上下文AAAA選擇的是“彈性一、彈性二”)
整個彈性域都將會顯示 Global Data Elements的段結(jié)構(gòu)。
選擇“彈性二”
后的界面如下:
,下面在圖文說明下 定義的參考字段“NAME ”的作用
在應(yīng)用彈性域界面中 在“NAME ”欄輸入 “彈性一”,選擇彈性欄位 得到的結(jié)果如下
如果在“NAME ”欄輸入 “彈性二” 選擇彈性欄位 得到的結(jié)果如下
從以上兩個圖可以說明 參考字段也可以決定需要顯示的彈性結(jié)構(gòu)。
在這里需要提一個:
參考字段 上下文段(不顯示 不需要) 這樣就可以在界面中動態(tài)的控制彈性的結(jié)構(gòu),而不需要來選擇上下文的內(nèi)容當(dāng)然,參考字段與上下文段還是有所區(qū)別的,在參考字段輸入“彈性一”后,雖然顯示的是彈性一的段結(jié)構(gòu),然而也可以在選擇上下文段的值來重新選擇需要的段結(jié)構(gòu),這樣的話,參考字段的值=彈性一,而上下文的值=彈性二,也就是說,參考字段的作用是在于初始話一個彈性域的結(jié)構(gòu),一旦該彈性段有值以后,就不在作用了。真正跟彈性結(jié)構(gòu)相關(guān)的字段還是結(jié)構(gòu)列字段,也就是上下文段
這里可以看到,雖然參考字段是“彈性二”,但可以在繼續(xù)
選擇上下文來需要相應(yīng)的段結(jié)構(gòu)。
,編寫FORM設(shè)置和彈性域
1:加入非基表域用于容納彈性域,我們做一個ITEM叫DESC_FLEX 注意這個ITEM的CLASS屬性為 TEXT_ITEM, LOV處選擇ENABLE_LIST_LAMP,并把檢查有效性設(shè)為NO。
2:FORM中要包含所設(shè)置的彈性域如ATTRIBUTE_CATEGORY,ATTRIBUTE1,ATTRIBUTE2…... 注意這些域為基表項, 設(shè)置CANVANS為NULL或者顯示在畫布上都可以
3:把DESC_FLEX放在CANVANS上,弄成彈性域的樣子. 設(shè)置其屬性:值列表=ENABLE_LIST_LAMP 從列表中驗證=否四:在FORM中注冊彈性域
為了FORM識別彈性域,在FORM級別的W HEN -NE W _FORM_INSTANCE 上加上如下的代碼
FND_DESCR_FLEX.DEFINE('FLEX_LN', -- FORM中的BLOCK NAME
FIELD =>'DESC_FLEX', -- FORM中的彈性域的ITEM NAME
APPL_SHORT_NAME=>'EDV', -- 注冊彈性域在那個USER下
DESC_FLEX_NAME=>'FLEX_LN'); -- 注冊彈性域的名稱
具體參數(shù)及意思.如下
含有彈性域的BLOCK叫FLEX_LN
DESC_FLEX我們命名的那個容納彈性域的域.
FLEX_LN 我們注冊的那個彈性域的名稱.
五:加入觸發(fā)器以支持彈性域.
分別在BLOCK級別加入如下的觸發(fā)器.
PRE -Q UERY
PRE -UPDATE
PRE -INSERT
POST -Q UERY
其觸發(fā)器的代碼分別對應(yīng)
FND_FLEX.EVENT('PRE-Q UERY ');
FND_FLEX.EVENT('PRE-UPDATE ');
FND_FLEX.EVENT('PRE-INSERT ');
FND_FLEX.EVENT('POST-Q UERY ');
在容納彈性域的域ITEM級別加入如下的觸發(fā)器
W HEN -VALIDATE_ITEM
FND_FLEX.EVENT('W HEN -VALIDATE -ITEM');
至此我們完成了本FORM ,只要打開彈性域我們就可以像用系統(tǒng)彈性域一樣用這些彈性域了。
手工刪除說明性彈性域腳本:
/* 刪除說明性彈性域的段結(jié)構(gòu) */
DELETE FND_DESCR_FLEX_COL_USAGE_TL W HERE (APPLICATION_ID=660) and (DESCRIPTIVE_FLEXFIELD_NAME LIK E 'FLEX_LN')
/* 刪除說明性彈性域的段 */
DELETE FND_DESCR_FLEX_CONTEXTS_TL W HERE (APPLICATION_ID=660) and (DESCRIPTIVE_FLEXFIELD_NAME LIK E 'FLEX_LN')
DELETE FND_DESCR_FLEX_COLUMN_USAGES W HERE (APPLICATION_ID=660) and (DESCRIPTIVE_FLEXFIELD_NAME LIK E 'FLEX_LN')
/* 刪除說明性彈性域的注冊信息 */
DELETE FND_DESCRIPTIVE_FLEXS_TL A W HERE A.APPLICATION_ID=660 AND A.DESCRIPTIVE_FLEXFIELD_NAME='FLEX_LN';注冊鍵彈性域
鍵彈性域的注冊如下圖
,應(yīng)用:選擇注冊的應(yīng)用
代碼:填寫注冊鍵彈性域的CODE(必須唯一,最多四個字符,在調(diào)用鍵彈性域必須使用的值) 標(biāo)題:鍵彈性域的標(biāo)題,在今后的應(yīng)用中,此鍵彈性域?qū)诖翱跇?biāo)題上顯示在此定義的標(biāo)題內(nèi)容 說明:
表應(yīng)用:在注冊表,列時指定的應(yīng)用(appl_short_name)
表名: 選擇注冊的表名稱
結(jié)構(gòu)列:必須也是存在于注冊過的列,結(jié)構(gòu)列的意義就是存放鍵彈性域使用的是哪個段結(jié)構(gòu)的代碼 唯一標(biāo)識列:是記錄鍵彈性域唯一的值,要找到健彈性域的具體含義,必須通過此唯一標(biāo)識列 定義鍵彈性域的段結(jié)構(gòu),如下圖
點擊“段”按紐
進行定義:
,此處定義段結(jié)構(gòu)與說明性彈性域一致,在此不再多說。
鍵彈性域的開發(fā)例子:
/***************************在客戶化的用戶下*******************************/
/* 鍵應(yīng)用表 */
CREATE TABLE T_K EY_FLEX
(
K EY_ID NUMBER , /* 鍵彈性域唯一值 */
AGE NUMBER ,
NAME VARCHAR2(30) ,
DEPT VARCHAR2(30) ,
TYPE VARCHAR2(30)
);
/* 創(chuàng)建存放鍵彈性域的結(jié)構(gòu)表 */
CREATE TABLE FLEX_LN_K EY
(
K EY_FLEX_STRUCTURE_ID NUMBER ,
K EY_FLEX_ID NUMBER ,
SUMMARY_FLAG VARCHAR2(1) , /* 必須有此字段 */
ENABLED_FLAG VARCHAR2(1) , /* 必須有此字段 */
START_DATE_ACTIVE DATE , /* 必須有此字段 */
END_DATE_ACTIVE DATE , /* 必須有此字段 */
LAST_UPDATED_BY NUMBER , /* 必須有此字段 */
LAST_UPDATE_DATE DATE , /* 必須有此字段 */
SEGMENT1 VARCHAR2(30) ,
SEGMENT2 VARCHAR2(30) ,
SEGMENT3 VARCHAR2(30) ,
SEGMENT4 VARCHAR2(30) ,
SEGMENT5 VARCHAR2(30) ,
SEGMENT6 VARCHAR2(30) ,
SEGMENT7 VARCHAR2(30) ,
SEGMENT8 VARCHAR2(30) ,
SEGMENT9 VARCHAR2(30) ,
SEGMENT10 VARCHAR2(30) ,
SEGMENT11 VARCHAR2(30) ,
SEGMENT12 VARCHAR2(30) ,
SEGMENT13 VARCHAR2(30) ,
SEGMENT14 VARCHAR2(30) ,
SEGMENT15 VARCHAR2(30)
);
/* 必須要創(chuàng)建一個與鍵結(jié)構(gòu)表對應(yīng)的序列 */
CREATE SEQ UENCE FLEX_LN_K EY_S START W ITH 1; --創(chuàng)建存放鍵彈性域表的對應(yīng)序列(鍵彈性域表名 "_S" ) /***************************在公共用戶APPS下*******************************/
conn apps/apps@egtc
/* 創(chuàng)建同義詞 */
CREATE SYNONYM FLEX_LN_K EY FOR ERP_dev.FLEX_LN_K EY ;
CREATE SYNONYM T_K EY_FLEXFOR ERP_dev.T_K EY_FLEX ;
CREATE SYNONYM FLEX_LN_K EY_SFOR ERP_dev.FLEX_LN_K EY_S;
/* 注冊鍵結(jié)構(gòu)表和字段 */
EXECUTE ad_dd.register_table('EDV', 'FLEX_LN_K EY', 'T');
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'K EY_FLEX_STRUCTURE_ID', 1, 'NUMBER', 38, 'Y','N' );EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'K EY_FLEX_ID', 2, 'NUMBER', 38, 'Y', 'N' );EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT1', 3, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT2', 4, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT3', 5, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT4', 6, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT5', 7, 'VARCHAR2', 30, 'Y', 'N' );
,EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT6', 8, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT7', 9, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT8', 10, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT9', 11, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT10',12, 'VARCHAR2', 30, 'Y', 'N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT11', 13, 'VARCHAR2', 30, 'Y','N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT12', 14, 'VARCHAR2', 30, 'Y','N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT13', 15, 'VARCHAR2', 30, 'Y','N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT14', 16, 'VARCHAR2', 30, 'Y','N' );
EXECUTE ad_dd.register_column('EDV', 'FLEX_LN_K EY', 'SEGMENT15',17, 'VARCHAR2', 30, 'Y', 'N' );
COMMIT;
FORM程序語法:
FND_K EY_FLEX.DEFINE (
BLOC K => 'T_K EY_FLEX', -- 操作的BLOCK
FIELD => 'K EY_FLEXITEM', -- 創(chuàng)建的ITEM,用來容納鍵彈性域
ID => 'K EY_ID', --保存K EY彈性域的唯一值
APPL_SHORT_NAME => 'EDV',
CODE => 'K _LN', -- 鍵彈性域的注冊代碼 fnd_id_flex_structures.id_flex_code
NUM => '101' --fnd_id_flex_structures.id_flex_num
);
分別在BLOCK級別加入如下的觸發(fā)器(可參考說明性彈性域的應(yīng)用代碼).
PRE -Q UERY
PRE -UPDATE
PRE -INSERT
POST -Q UERY
W HEN -NE W-ITEM -INSTANCE
W HEN -VALIDATE -ITEM
W HEN -VALIDATE -RECORD
其觸發(fā)器的代碼分別對應(yīng)
FND_FLEX.EVENT('PRE-Q UERY ');
FND_FLEX.EVENT('PRE-UPDATE ');
FND_FLEX.EVENT('PRE-INSERT ');
FND_FLEX.EVENT('POST-Q UERY ');
FND_FLEX.EVENT('W HEN -NE W-ITEM -INSTANCE');
FND_FLEX.EVENT('W HEN -VALIDATE -ITEM');
FND_FLEX.EVENT('W HEN -VALIDATE -RECORD');
編寫FORM設(shè)置和彈性域
加入非基表域用于容納彈性域,我們做一個ITEM叫 K EY_FLEXITEM 注意這個ITEM的CLASS屬性為 TEXT_ITEM, LOV處選擇ENABLE_LIST_LAMP,并把檢查有效性設(shè)為NO。
由下圖可以看出鍵彈性域的存放關(guān)系,在應(yīng)用表里存放的是鍵唯一值,而在鍵結(jié)構(gòu)表中存放的是鍵結(jié)構(gòu)值(段結(jié)構(gòu)代碼和
鍵唯一值)