弹性域笔记整理——说明性弹性域(V1.0) 
弹性域在 Oracle 的 EBS 中,是一个非常重要的功能,它允许添加必要和可选择的字段信息。
它是由一个或多个段组成的字段。段在数据库表中以单个列表示;在表单中显示为包含各段提示
的弹出式窗口,可以在自定义弹性域时定义单个段的外观和含义。每个段都有一个名称和一个有
效的值集,最终用户可以在使用应用产品时将段值输入段中。一般来说,弹性域都会根据通常预
先定义的一组有效值(值集)来验证每个段。"值验证"表示弹性域会将用户在此段中输入的值与值
集中该段的值进行比较。 
描述性弹性域的开发步骤主要包括: 
     ①、创建表,表中包括弹性域结构列和弹性域列 
     ②、创建视图,视图中包括弹性域相关列(非必需) 
     ③、使用 AD_DD 工具包注册表和表列(或汉得 HAND_PLSQL_AUTOCREATE 工具) 
     ④、在 Oracle EBS 系统中注册描述性弹性域 
     ⑤、按照一般 Form 开发的步骤,创建相关对象 
         ⑴、在块中创建一个 DESC_FLEX 非数据库项,并设置属性 
         ⑵、给 DESC_FLEX 项和数据块添加必要的触发器和标准代码 
         ⑶、在 PRE-FORM 触发器中初始化第四步中注册的弹性域 
     ⑥、登录 Oracle EBS 系统验证弹性域 
说明性弹性域:  只能作为统计分析,出报表使用,不参与系统业务流程的构建,系统(应用
程序)也不对之在表单之间作跟踪,追溯.字段为 attribute。 
例子以如下表为基础,进行弹性域的说明 
1.  建立表 
创建的表中必须包括描述性弹性域列: 
ATTRIBUTE_CATEGORY      结构列 
ATTRIBUTE1…N          弹性域列的数据库段 
创建表的脚本: 
create table cux_test_om_pop_validity_all( 
    line_id                                                number, 
    inventory_item_id                            number,                  --物料编号 189 
    number_of_day                                number,                  --天数 
    start_date                                        date,                      --开始日期 
    end_date                                          date,                      --结束日期 
    created_by                                        number, 
    creation_date                                    date, 
    last_updated_by                                number, 
    last_update_date                              date, 
    last_update_login                              number, 
    org_id                                                number, 
    attribute_category                            varchar2(30), 
    attribute1                                          varchar2(50), 
    attribute2                                          varchar2(50), 
    attribute3                                          varchar2(50), 
    attribute4                                          varchar2(150), 
    attribute5                                          varchar2(150) 
); 
2.  创建视图(略) 
3.  注册数据库表,列 
方法一: 
1).系统中的数据库表和列的注册旨在支持系统的弹性域和预警系统两个特性如果不需要这些特性不
需要注册表.注册方法:  用如下的过程注册表: 
使用 AD_DD 包来注册表和列 
        注册表 
        AD_DD.REGISTER_TABLE(p_appl_short_name in varchar2, --应用名简称/所有者 
                                                  p_tab_name                in varchar2, --表名 
                                                  p_tab_type                in varchar2, --T 自动扩展/S 非自动扩展/F 
                                                  p_next_extent          in number, --下一区 
                                                  p_pct_free                in number, 
                                                  p_pct_used                in number 
                                                ) 
   
  2).注册表  CUX_TEST_OM_POP_VALIDITY_ALL : 
        AD_DD.REGISTER_COLUMN(p_appl_short_name in varchar2, 
                                                                p_tab_name                in varchar2, --应用名简称/所有者 
                                                                p_col_name                in varchar2, --列名 
                                                                p_col_seq                  in number,      --序号,唯一 
                                                                p_col_type                in varchar2, --类型 
                                                                p_col_width              in number,      --字段宽度 
                                                                p_nullable                in varchar2, --是否为空 
                                                                p_translate              in varchar2, --是否可以转换 
                                                                p_precision              in number default null, 
                                                                p_scale                      in number default null 
                                                  ) 
    ----------------------------- 
begin 
    ad_dd.register_table('APPS','CUX_TEST_OM_POP_VALIDITY_ALL','T');--说明:APPS 为新应用简称。
(可新注册需要的简称) 
    commit; 
end; 
3).注册表中的列(弹性域列): 
begin 
  ad_dd.register_column('APPS','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE1',1, 'VARCHAR2', 50,'N', 'N'); 
  ad_dd.register_column('HEK','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE2',2, 'VARCHAR2', 50,'N', 'N'); 
  ad_dd.register_column('HEK','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE3',3, 'VARCHAR2', 50,'N', 'N'); 
  ad_dd.register_column('HEK','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE3',3, 'VARCHAR2', 50,'N', 'N'); 
  ad_dd.register_column('HEK','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE4',4, 'VARCHAR2', 150,'N', 'N'); 
  ad_dd.register_column('HEK','CUX_TEST_OM_POP_VALIDITY_ALL','ATTRIBUTE_CATEGORY',5, 'VARCHAR2',30,'N', 'N'); 
COMMIT; 
end; 
4).查看是否注册成功: 
select ft.table_id from FND_TABLES ft   
where ft.table_name = 'CUX_TEST_OM_POP_VALIDITY_ALL'; 
select * from FND_COLUMNS fc 
  where fc.table_id in (select ft.table_id from FND_TABLES ft                                                                                                                                                                                           
where ft.table_name = 'CUX_TEST_OM_POP_VALIDITY_ALL'); 
5).如果想删除注册可以引用下面的相应的过程. 
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); 
方法二:    (在 PLSQL 中使用 HAND_PLSQL_AUTOCREATE) 
1).使用汉得 HAND_PLSQL_AUTOCREATE 工具. 
       
      2).填写测试脚本中参数后,再执行。 
       
 
  (第三参数,应用程序简称查找如下:路径:应用开发员\应用产品\注册) 
         
3).复制 DBMS Output 中的内容到 PLSQL 中执行,完成表列注列。 
4).复制以上内容到 command file 中执行,注册表列。 
 
 
 
 
 
4.  注册弹性域列 
1).路径:应用开发员=>弹性域=>说明性=>注册 
应用:选择注册的应用 
名称:填写注册说明弹性域的名称(必须唯一) 
标题:弹性域的标题,在今后的应用中,此说明弹性域将会在窗口标题上显示在此定义
的标题内容 
说明: 
表应用:在注册表,列时指定的应用(appl_short_name) 
表名:    选择注册的表名称 
结构列:必须也是存在于注册过的列,结构列的意义就是存放说明性弹性域上下文提示
的值 
上下文提示:是在说明性弹性域上下文字段的标题描述 
 
2).点击‘参考字段’,填写‘参考字段’资料。 
    字段名:必须与弹性域中选择的表中的字段一致。 
    说明:对字段的描述性文字 
    参考字段的含义: 
    参考字段的主要作用是  与结构列的作用类似,可以在不选择上下文字段的情况下,系统
根据参考字段的含义来对应显示不用的弹性域, 
    举例说明:例如参考字段为  NAME,则在系统中输入 NAME 信息后,系统会自动根据
NAME 的信息来确定显示什么样的弹性域,这样就可以避免来选择上下文来显示需要的弹
性域。 
 
3).回到第一步,再点击‘列(C)’,选择列。 
这里面显示的是注册后的列字段(如果填写了结构列字段,则这里面将不在显示结构
列字段,因为系统认为结构列字段与弹性字段是不同的).如果对某个弹性字段不需要,
可以将起用 CHECKED 失效,这样在构造弹性域的时候,此弹性字段不会作用显示. 
 
4).CTRL+S 保存以上资料。 
5).配置弹性域的弹性字段 
路径:应用开发员=>弹性域=>说明性=>段  (使用 F11 查询出标题为’弹性域 GUD_测试
1’的资料) 
->提示:这里的提示是上下文 PROMPT 的信息,在这里输入信息后,在注册弹性域  “上
下文提示”  栏的内容,两者的内容是一致的 
->值集:为上下文字段的内容提供一个值的 LOV 形式选择, 
6).选择’弹性域一’,然后再点击‘段(M)’,输入以下资料。 
 
 
7).保存后,回到上一画面,再编译。 
增 加 完段 和相 应的 列后 ,然后 回 到前 面的 界面 ,将“冻结 弹 性域 定义 ”复 选框 选上,点 击“ 编
译 ” 按钮 。 
5.  FORM 表单开发 
4.1  先按将相应的 FORM 开发好,然后在 FORM 级的以下 TRIGGER  (BLOCK 级)中加
入 
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-ITEM: FND_FLEX.EVENT('WHEN-VALIDATE-ITEM');