详谈弹性域用法
弹性域的使用弹性域分为键弹性域和说明性弹性域,本文就针对这两种弹性域在二次开发中使用进行举例说明,并附带说明弹性域中经常使用的值集一、弹性域开发中需要做的前期工作1.注册一个可以使用弹性域的表,字段本
弹性域的使用
弹性域分为键弹性域和说明性弹性域,本文就针对这两种弹性域在二次开发中使用进行举例说明,并附带说明弹性域中经常使用的值集
一、弹性域开发中需要做的前期工作
1.注册一个可以使用弹性域的表,字段
本范例全部以如下对象为基础,进行弹性域的说明
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)
);
注册数据库表,列
系统中的数据库表和列的注册旨在支持系统的弹性域和预警系统两个特性如果不需要这些特性不需要注册
表.注册方法: 用如下的过程注册表
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 应用中注册:
EXECUTE ad_dd.register_table('EDV','FLEX_LN','T');
这里说明下,EDV是在系统注册过的一个应用简称,二次开发的程序,最好重新注册一个应用,这样便
于今后的管理。如下图:
(当然注册一个应用的方法本文不在叙述)
注册表中的列(弹性域列)方法如下.
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 中是否存在我们已经注册的表和列,
如果我们想删除我们的注册可以引用下面的相应的过程.
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);
注册说明性弹性域
注册如图所示:
,应用:选择注册的应用
名称:填写注册说明弹性域的名称(必须唯一)
标题:弹性域的标题,在今后的应用中,此说明弹性域将会在窗口标题上显示在此定义的标题内容
说明:
表应用:在注册表,列时指定的应用(appl_short_name)
表名: 选择注册的表名称
结构列:必须也是存在于注册过的列,结构列的意义就是存放说明性弹性域上下文提示的值
上下文提示:是在说明性弹性域上下文字段的标题描述
参考字段BUTTON里,如下界面
上面的界面是输入界面,系统提供输入,这里可以输入多个记录,当然最终只能有一个字段来起作用,需要在段里指定。
字段名:必须与弹性域中选择的表中的字段一致。
说明:对字段的描述性文字
参考字段的含义:
参考字段的主要作用是 与结构列的作用类似,可以在不选择上下文字段的情况下,系统根据参考字段的含义来对应显示不用的弹性域,
举例说明:例如参考字段为 NAME,则在系统中输入NAME信息后,系统会自动根据NAME的信息来确定显示什么样的弹性域,这样就可以避免来选择上下文来显示需要的弹性域。
列BUTTON里,如下界面
这里面显示的是注册后的列字段(如果填写了结构列字段,则这里面将不在显示结构列字段,因为系统认为结构列字段
与弹性字段是不同的)
,如果对某个弹性字段不需要,可以将起用CHECK ED 失效,这样在构造弹性域的时候,此弹性字段不会作用显示系统注册完弹性域的名称后,下一步需要配置弹性域的弹性字段
界面如下:
此处的界面需要重点注意的地方:
上下文字段
->提示:这里的提示是上下文PROMPT的信息,在这里输入信息后,在注册弹性域 “上下文提示” 栏的内容,两者的内容是一致的
->值集:为上下文字段的内容提供一个值的LOV形式选择,
以本例说明:值集SET_VALUE_DESC_FLEX中包括的信息是“弹性一”、“弹性二”,这样,就可以根据选择不同的信息来实现不同的弹性域,而且,选择的上下文字段信息(此处就是弹性域上下文AAAA栏)会保存在结构列中。
->默认值: 设定上下文的默认值
->参考字段:此处系统提供的是一个LOV输入,此处LOV里的数据来源于在注册弹性域里的时候“参考字段:”BUTTON里的输入记录。
参考字段的含义是,可以以其他字段的输入记录来判断是否显示哪种弹性域。
上下文字段值
这里可以定义多个弹性域段:比如 弹性域1=弹性字段1 弹性字段2
弹性域2=弹性字段1 弹性字段2 弹性字段3
弹性域3=弹性字段1 弹性字段2 弹性字段3 弹性字段4
这里需要说明下:每个弹性的段信息中,都有一个默
认的段定义 Global Data Elements
,弹性域Global Data Elements 的段结构如下:
如果我们定义的弹性域只有一种段结构的话,可以直接在 Global Data Elements段中进行定义,如果有多个的话,需要在另创建记录进行段定义的需要,有一点需要说明的是,一旦有注册了的字段在 Global Data Elements中定义了结构的话,那么用户自己在创建其他的段结构,则不会显示在Global Data Elements中使用了的字段
具体定义弹性域中需要那些弹性字段,需要在“段”BUTTON里的界面中进行定义
如 弹性一 的段结构
弹性二 的段结构
,以本文中的为例进行说明: Global Data Elements 段中定义了一个 ATTRIBUTE1字段,那么在弹性一、弹性二中的段定义的时候,无法在选择 ATTRIBUTE1这个字段。
针对此弹性域的配置,在实际使用中的说明:
图中红色框代表的是加载说明性弹性域的字段,点击此处,便可出现弹性域的结构。 由于在系统设置弹性域段的时候,给上下文段一个默认值 = “弹性一” 则系统会自动将弹性一的段结构给显示出来(定义了三个弹性字段TITLE分别为10、15、20),由于此弹性域还定义了一个Global Data Elements 的段结构,则系统会将Global Data Elements 显示在最前面,作为整个弹性域的公共字段(不论弹性域上下文AAAA选择的是“弹性一、弹性二”)
整个弹性域都将会显示 Global Data Elements的段结构。
选择“弹性二”
后的界面如下:
,下面在图文说明下 定义的参考字段“NAME ”的作用
在应用弹性域界面中 在“NAME ”栏输入 “弹性一”,选择弹性栏位 得到的结果如下
如果在“NAME ”栏输入 “弹性二” 选择弹性栏位 得到的结果如下
从以上两个图可以说明 参考字段也可以决定需要显示的弹性结构。
在这里需要提一个:
参考字段 上下文段(不显示 不需要) 这样就可以在界面中动态的控制弹性的结构,而不需要来选择上下文的内容当然,参考字段与上下文段还是有所区别的,在参考字段输入“弹性一”后,虽然显示的是弹性一的段结构,然而也可以在选择上下文段的值来重新选择需要的段结构,这样的话,参考字段的值=弹性一,而上下文的值=弹性二,也就是说,参考字段的作用是在于初始话一个弹性域的结构,一旦该弹性段有值以后,就不在作用了。真正跟弹性结构相关的字段还是结构列字段,也就是上下文段
这里可以看到,虽然参考字段是“弹性二”,但可以在继续
选择上下文来需要相应的段结构。
,编写FORM设置和弹性域
1:加入非基表域用于容纳弹性域,我们做一个ITEM叫DESC_FLEX 注意这个ITEM的CLASS属性为 TEXT_ITEM, LOV处选择ENABLE_LIST_LAMP,并把检查有效性设为NO。
2:FORM中要包含所设置的弹性域如ATTRIBUTE_CATEGORY,ATTRIBUTE1,ATTRIBUTE2…... 注意这些域为基表项, 设置CANVANS为NULL或者显示在画布上都可以
3:把DESC_FLEX放在CANVANS上,弄成弹性域的样子. 设置其属性:值列表=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'); -- 注册弹性域的名称
具体参数及意思.如下
含有弹性域的BLOCK叫FLEX_LN
DESC_FLEX我们命名的那个容纳弹性域的域.
FLEX_LN 我们注册的那个弹性域的名称.
五:加入触发器以支持弹性域.
分别在BLOCK级别加入如下的触发器.
PRE -Q UERY
PRE -UPDATE
PRE -INSERT
POST -Q UERY
其触发器的代码分别对应
FND_FLEX.EVENT('PRE-Q UERY ');
FND_FLEX.EVENT('PRE-UPDATE ');
FND_FLEX.EVENT('PRE-INSERT ');
FND_FLEX.EVENT('POST-Q UERY ');
在容纳弹性域的域ITEM级别加入如下的触发器
W HEN -VALIDATE_ITEM
FND_FLEX.EVENT('W HEN -VALIDATE -ITEM');
至此我们完成了本FORM ,只要打开弹性域我们就可以像用系统弹性域一样用这些弹性域了。
手工删除说明性弹性域脚本:
/* 删除说明性弹性域的段结构 */
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';注册键弹性域
键弹性域的注册如下图
,应用:选择注册的应用
代码:填写注册键弹性域的CODE(必须唯一,最多四个字符,在调用键弹性域必须使用的值) 标题:键弹性域的标题,在今后的应用中,此键弹性域将会在窗口标题上显示在此定义的标题内容 说明:
表应用:在注册表,列时指定的应用(appl_short_name)
表名: 选择注册的表名称
结构列:必须也是存在于注册过的列,结构列的意义就是存放键弹性域使用的是哪个段结构的代码 唯一标识列:是记录键弹性域唯一的值,要找到健弹性域的具体含义,必须通过此唯一标识列 定义键弹性域的段结构,如下图
点击“段”按纽
进行定义:
,此处定义段结构与说明性弹性域一致,在此不再多说。
键弹性域的开发例子:
/***************************在客户化的用户下*******************************/
/* 键应用表 */
CREATE TABLE T_K EY_FLEX
(
K EY_ID NUMBER , /* 键弹性域唯一值 */
AGE NUMBER ,
NAME VARCHAR2(30) ,
DEPT VARCHAR2(30) ,
TYPE VARCHAR2(30)
);
/* 创建存放键弹性域的结构表 */
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)
);
/* 必须要创建一个与键结构表对应的序列 */
CREATE SEQ UENCE FLEX_LN_K EY_S START W ITH 1; --创建存放键弹性域表的对应序列(键弹性域表名 "_S" ) /***************************在公共用户APPS下*******************************/
conn apps/apps@egtc
/* 创建同义词 */
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;
/* 注册键结构表和字段 */
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', -- 创建的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级别加入如下的触发器(可参考说明性弹性域的应用代码).
PRE -Q UERY
PRE -UPDATE
PRE -INSERT
POST -Q UERY
W HEN -NE W-ITEM -INSTANCE
W HEN -VALIDATE -ITEM
W HEN -VALIDATE -RECORD
其触发器的代码分别对应
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设置和弹性域
加入非基表域用于容纳弹性域,我们做一个ITEM叫 K EY_FLEXITEM 注意这个ITEM的CLASS属性为 TEXT_ITEM, LOV处选择ENABLE_LIST_LAMP,并把检查有效性设为NO。
由下图可以看出键弹性域的存放关系,在应用表里存放的是键唯一值,而在键结构表中存放的是键结构值(段结构代码和
键唯一值)