如何在Form中使用描述性弹性域(Descriptive Flexfield)

弹性域包括键弹性域和描述性弹性域,其开发方法和用途均不一样,在此主要介绍描述性弹性域在Form中的开发方法。

描述性弹性域的开发步骤主要包括:

1、创建表,表中包括弹性域结构列和弹性域列
2、创建视图,视图中包括弹性域相关列(非必需)
3、使用AD_DD工具包注册表和表列
4、在Oracle EBS系统中注册描述性弹性域
5、启用描述性弹性域
6、按照一般Form开发的步骤,创建相关对象
  1)、在块中创建一个DF非数据库项,并设置属性
  2)、给DF项和数据块添加必要的触发器和标准代码
  3)、在PRE-FORM触发器中初始化第四步中注册的弹性域
7、登录Oracle EBS系统验证弹性域

一、创建表

    创建的表中必须包括描述性弹性域列:
    ATTRIBUTE_CATEGORY   结构列
    ATTRIBUTE1…N             弹性域列的数据库段

二、创建视图

    略。

三、注册表和列

    使用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)

    --注册列
    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)

注:一、二、三的脚本例子:

CREATE TABLE CUX.CUX_FORM_DFF_TEST(
  ITEM_ID     NUMBER NOT NULL,
  ITEM_NUMBER VARCHAR2(30) NOT NULL,
  ITEM_NAME   VARCHAR2(100) NOT NULL,
  ITEM_DESCRIPTION   VARCHAR2(255),
  START_DATE_ACTIVE  DATE,
  END_DATE_ACTIVE    DATE,
  ATTRIBUTE_CATEGORY VARCHAR2(30),
  ATTRIBUTE1 VARCHAR2(150),
  ATTRIBUTE2 VARCHAR2(150),
  ATTRIBUTE3 VARCHAR2(150),
  ATTRIBUTE4 VARCHAR2(150),
  ATTRIBUTE5 VARCHAR2(150),
  ATTRIBUTE6 VARCHAR2(150),
  ATTRIBUTE7 VARCHAR2(150),
  ATTRIBUTE8 VARCHAR2(150),
  ATTRIBUTE9 VARCHAR2(150),
  ATTRIBUTE10 VARCHAR2(150),
  ATTRIBUTE11 VARCHAR2(150),
  ATTRIBUTE12 VARCHAR2(150),
  ATTRIBUTE13 VARCHAR2(150),
  ATTRIBUTE14 VARCHAR2(150),
  ATTRIBUTE15 VARCHAR2(150),
  CREATED_BY        NUMBER NOT NULL,
  CREATION_DATE     DATE NOT NULL,
  LAST_UPDATED_BY   NUMBER NOT NULL,
  LAST_UPDATE_DATE  DATE NOT NULL,
  LAST_UPDATE_LOGIN NUMBER
);
--Create Index
CREATE UNIQUE INDEX CUX_FORM_DFF_TEST_U1 ON CUX.CUX_FORM_DFF_TEST(ITEM_ID);

--Create Sequence
CREATE SEQUENCE CUX.CUX_FORM_DFF_TEST_S START WITH 1;

--Create Synonym
CREATE SYNONYM CUX_FORM_DFF_TEST FOR CUX.CUX_FORM_DFF_TEST;
CREATE SYNONYM CUX_FORM_DFF_TEST_S FOR CUX.CUX_FORM_DFF_TEST_S;

CREATE VIEW CUX_FORM_DFF_TEST_V
AS
SELECT  ROWID ROW_ID,
        ITEM_ID,
        ITEM_NUMBER,
        ITEM_NAME,
        ITEM_DESCRIPTION,
        START_DATE_ACTIVE,
        END_DATE_ACTIVE,
        ATTRIBUTE_CATEGORY,
        ATTRIBUTE1,
        ATTRIBUTE2,
        ATTRIBUTE3,
        ATTRIBUTE4,
        ATTRIBUTE5,
        ATTRIBUTE6,
        ATTRIBUTE7,
        ATTRIBUTE8,
        ATTRIBUTE9,
        ATTRIBUTE10,
        ATTRIBUTE11,
        ATTRIBUTE12,
        ATTRIBUTE13,
        ATTRIBUTE14,
        ATTRIBUTE15,
        CREATED_BY,
        CREATION_DATE,
        LAST_UPDATED_BY,
        LAST_UPDATE_DATE,
        LAST_UPDATE_LOGIN
FROM CUX_FORM_DFF_TEST;

CREATE SYNONYM CUX_FORM_DFF_TEST_V FOR CUX.CUX_FORM_DFF_TEST_V;

--注册表
EXECUTE AD_DD.REGISTER_TABLE('CUX', 'CUX_FORM_DFF_TEST', 'T', 8, 10, 90);
COMMIT;

--注册列
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ITEM_ID', 1, 'NUMBER', 38, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ITEM_NUMBER', 2, 'VARCHAR2', 30, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ITEM_NAME', 3, 'VARCHAR2', 100, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ITEM_DESCRIPTION', 4, 'VARCHAR2', 255, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'START_DATE_ACTIVE', 5, 'DATE', 9, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'END_DATE_ACTIVE', 6, 'DATE', 9, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE_CATEGORY', 7, 'VARCHAR2', 30, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE1', 8, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE2', 9, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE3', 10, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE4', 11, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE5', 12, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE6', 13, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE7', 14, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE8', 15, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE9', 16, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE10', 17, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE11', 18, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE12', 19, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE13', 20, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE14', 21, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'ATTRIBUTE15', 22, 'VARCHAR2', 150, 'Y', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'CREATED_BY', 23, 'NUMBER', 38, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'CREATION_DATE', 24, 'DATE', 9, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'LAST_UPDATED_BY', 25, 'NUMBER', 38, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'LAST_UPDATE_DATE', 26, 'DATE', 9, 'N', 'N');
EXECUTE AD_DD.REGISTER_COLUMN('CUX', 'CUX_FORM_DFF_TEST', 'LAST_UPDATE_LOGIN', 27, 'NUMBER', 38, 'Y', 'N');
COMMIT;

四、在EBS中注册描述性弹性域

    路径:Application Developer--Flexfield--Descriptive--Register

  

    Application: 弹性域注册的应用名称

    Name:描述性弹性域的名称,必须唯一。一般设置成和表名一样

    Title: 弹性域的标题,在今后的应用中,此说描述性弹性域将会在窗口标题上显示在此定义的标题内容

    Description: 说明

    Table Application: 在(第三步)注册表和列时所指定的应用名称

    Table Name: 注册时的表名称

    Structure Column: 结构列,一般为ATTRIBUTE_CATEGORY,必须是存在于注册过的列。结构列的意义就是存放说明性弹性域上下文提示的值

    Context Prompt: 上下文提示,是在描述性弹性域上下文字段的标题描述

    DFV View Name:

    Reference Fields: 参考字段的主要作用与结构列的作用类似,可以在不选择上下文字段的情况下,系统根据参考字段的含义来对应显示不同的弹性域。举例说明,例如参考字段为 NAME,则在系统中输入NAME信息后,系统会自动根据NAME的信息来确定显示什么样的弹性域,这样就可以避免来选择上下文来显示需要的弹性域。

五、启用描述性弹性域

    路径 Application Developer -- Flexfield -- Descriptive -- Segments

    弹性域设置结束后,需要将Freeze Flexfield Definition冻结才能使设置生效

  

    Application: 弹性域注册的应用名称

    Title: 弹性域标题,打开弹性域窗体时所显示的名称

    Freeze Flexfield Definition: 冻结弹性域定义,修改时需要解除冻结,设置完成之后需要冻结才能生效

    Segment Separator: 段分隔符

    Prompt: 上下文提示

    Value Set: 为上下文内容提供一个LOV值集选择

    Default Value: 上下文默认值

    Reference Field: 参考字段,作用是根据参考字段的值来判断显示哪一中弹性域(上下文)

    Global Data Elements: 每个弹性域的段信息中,都有一个默认的段定义 Global Data Elements。如果我们定义的弹性域只有一种段结构的话,可以直接在  Global Data Elements段中进行定义,如果有多个的话,需要在另创建记录进行段定义的需要,有一点需要说明的是,一旦有注册了的字段在 Global Data Elements中定义了结构的话,那么用户自己在创建其他的段结构,则不会显示在Global Data Elements中使用了的字段

    Parts: 自定义段结构

    Vehicle: 自定义段结构

   设置完成之后注意要冻结弹性域定义并保存

  

六、开发Form

    Form开发的基本步骤不再冗述,仅对开发描述性弹性域需要的操作做说明:

      1)、创建DF

      在Data Block中新增一个Item,命名为”DF”,其Subclass Information设置为TEXT_ITEM_DESC_FLEX,(List of Values设置为ENABLE_LIST_LAMP,Validate from List设置为NO,非必需)Database Item设置为NO

  

     2)、给DF项和数据块添加必要的触发器和标准代码

      为DF项添加WHEN-NEW-ITEM-INSTANCE触发器,并将其Execution Hierarchy属性从Override修改为Before,触发器代码如下

      FND_FLEX.EVENT('WHEN-NEW-ITEM-INSTANCE');

      为DF项添加WHEN-VALIDATE-ITEM触发器,其代码为

      FND_FLEX.EVENT('WHEN-VALIDATE-ITEM');

      在DF项所在Data Block下添加几个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-RECORD:   FND_FLEX.EVENT('WHEN-VALIDATE-RECORD');

      WHEN-VALIDATE-ITEM:   FND_FLEX.EVENT('WHEN-VALIDATE-ITEM');

      3)、在Form级别的触发器PRE-FORM中注册弹性域

      在Form级别的触发器PRE-FORM中使用FND_DESCR_FLEX.DEFINE来初始化描述性弹性域,如

      FND_DESCR_FLEX.DEFINE(block => 'ITEMS',

                                 field => 'DF',

                                 appl_short_name => 'CUX',

                                 desc_flex_name => 'CUX_FORM_DFF_TEST');

      参数说明如下

      block: 弹性域显示项DF所在的Data Block名称

      field: 描述性弹性域显示字段的名称,一般都命名为DF

      appl_short_name: 描述性弹性域注册时的应用简称

      desc_flex_name: 描述性弹性域注册时的名称,一般都与表名一致

    七、验证弹性域

    登录EBS中验证开发的描述性弹性域,最终效果如下

  
    八、扩展

  1. 建表时包含Flexfields segment字段及Flexfields category字段,也可同时包含Global Flexfields segment 及Global Flexfields category字段.
  Attribute1….attribute30.
  Attribute_category_code.
  Global_attribute1….global_attribute20.
  Global_attribute_category.
  2. 注册Descriptive Flexfields
  Structure column 即为上下文字段,用来对segments 进行分组的. Context prompt 为上下文提示.
  一旦你的上下文字段定义为Attribute_category后,oracle 会自动选取相应的attribute字段。
  当然,如果你的上下文字段定义为global_attribute_category, oracle也会自动选取global字段。
  从此可以看出,global attribute 为attribute的补充,可以单独开启,单独在form上调用。
  3. 定义 Descriptive Flexfields segments
  Global data elements 是oracle 默认的弹性域集。可在里面定义需要的segments.当然也以禁用此code,自已定义新的集。这里定义了一个china 集,也就是如果category 为china时,启用china集下的segments.
  如果定义了多个集的话,那么在输入弹性域时,context可以选择多个category.
  如果需要对context 进行控制,有两种方法:
  1. 针对context field定义value set. 此value set 可灵活定义,比如按照用户的职责或从某一张表中提取相应信息,按照一定的逻辑返回相应的context value.
  2. 针对context field定义reference field. 此field应定义为调用此弹性域的form中的某一字段。根据此字段的值来决定context value. 这里看一个很典型的定义(启用value set 值定义中的flexfield).这里的context field的reference field为:GLOBALS.FLEX_VALUE_SET_NAME. 通过对应的form可知,此field里存的是当前的value set 的名字。因此我们在定义code 时,应输入需要的value set 的名字,这样的话,当你在对相应的名字的value set 进行值录入的时候,即可使用对应的flexfields了.

 

 

posted on 2015-04-17 09:45  小林子的烂笔头  阅读(883)  评论(0编辑  收藏  举报

导航