码迷,mamicode.com
首页 > 其他好文 > 详细

如何在Form中使用键弹性域(Key Flexfield)

时间:2015-04-11 19:18:43      阅读:1969      评论:0      收藏:0      [点我收藏+]

标签:

在应用弹性域之前必须先定义弹性域,定义之前必须先注册表列。如果你的弹性域已经在Oracle Application Object Library中已经定义和注册了,并且弹性域表和列已经在数据库中存在,则忽略1、2、3步骤,适用于关键性也适用于描述性弹性域。

1.建立相关的数据库表结构、注册表列

关键弹性域COMBINATIONS表必须包括这几个部分:
(1)唯一的ID列
(2)KEY段,SEGMENT1、SEGMENT2、、、SEGMENTn
(3)ENABLED_FLAG和SUMMARY_FLAG列
(4)START_DATE_ACTIVE和END_DATE_ACTIVE列
(5)一些WHO列
(6)结构ID列
(7)一个序列,名为“表名_S”

/***************************在客户化的用户下*******************************/
/* 键应用表 */
create table hek_om_pop_validity_all(
  line_id                        number,
  inventory_item_id              number,      
  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)
);

/* 创建存放键弹性域的结构表 */
CREATE TABLE FLEX_LN_KEY
(
  KEY_FLEX_STRUCTURE_ID  NUMBER , 
  KEY_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 SEQUENCE FLEX_LN_KEY_S   START WITH 1;  --创建存放键弹性域表的对应序列(键弹性域表名+"_S")
 grant all on T_KEY_FLEX to apps;
 grant all on FLEX_LN_KEY to apps;
 grant all on flex_ln_key_s to apps;
 
/***************************在公共用户APPS下*******************************/
conn apps/apps
   
/* 创建同义词 */
   CREATE SYNONYM FLEX_LN_KEY FOR HEK.FLEX_LN_KEY  ;
   CREATE SYNONYM FLEX_LN_KEY_S FOR HEK.FLEX_LN_KEY_S;
     
/* 注册键结构表和字段 */ 
BEGIN
 ad_dd.register_table(HEK, FLEX_LN_KEY, T);
 ad_dd.register_column(HEK, FLEX_LN_KEY, KEY_FLEX_STRUCTURE_ID, 1, NUMBER, 38, Y,N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, KEY_FLEX_ID, 2, NUMBER, 38, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT1, 3, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT2, 4, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT3, 5, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT4, 6, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT5, 7, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT6, 8, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT7, 9, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT8, 10, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT9, 11, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT10,12, VARCHAR2, 30, Y, N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT11, 13, VARCHAR2, 30, Y,N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT12, 14, VARCHAR2, 30, Y,N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT13, 15, VARCHAR2, 30, Y,N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT14, 16, VARCHAR2, 30, Y,N );
 ad_dd.register_column(HEK, FLEX_LN_KEY, SEGMENT15,17, VARCHAR2, 30, Y, N );
COMMIT;
END;

 2.定义键弹性域

进入应用开发员--弹性域--(说明性/键)--注册可新定义一个弹性域

如图所示,只有在步骤1中已注册的Table,Colummn在定义弹性域时才能被选到。

对于同种类型的弹性域,每一个基表应只定义一个,但是一个弹性域可对应多个Structure。

在Form中启用弹性域时,可利用代码指定此弹性域使用的Structure。

技术分享

应用:选择注册的应用
代码:填写注册键弹性域的CODE(必须唯一,最多四个字符,在调用键弹性域必须使用的值
标题:键弹性域的标题,在今后的应用中,此键弹性域将会在窗口标题上显示在此定义的标题内容
说明:
表应用:在注册表,列时指定的应用(appl_short_name)
表名:  选择注册的表名称
结构列:必须也是存在于注册过的列,结构列的意义就是存放键弹性域使用的是哪个段结构的代码
唯一标识列:是记录键弹性域唯一的值,要找到健弹性域的具体含义,必须通过此唯一标识列

3.定义键弹性域的段结构

技术分享

4.在Form中启用弹性域:

(4.1)添加对应的弹性域字段

一般在基表对应的Block下面新建对应的弹性域字段,相关的外观设置可参考Oracle标准系统。

(4.1.1)创建隐藏字段
隐藏弹性域字段是作为从数据库表(或者视图)创建默认form block的一部分。在弹性域字段的canvas属性上设置为Null(这样它们就不会出现在canvas上)
注意:你不应该为隐藏字段写逻辑来直接为这些字段设值。因为弹性域会跟踪是否一个记录正被插入,更新,通过任意方法为这些字段设置值而不是弹性域本身(或者从数据库中查询)的话可能会引起错误和数据错误。

(4.1.2)创建显示字段
创建你的连接分段字段为2000字符的显示的,非数据库文本字段KEY_FLEXITEM,其属性:
Property                   Value  
List of Values            ENABLE_LIST_LAMP  
Database Item          No

(4.2)添加必要的触发器

分别在BLOCK级别加入如下的触发器:

PRE-QUERY
PRE-UPDATE
PRE-INSERT
POST-QUERY
WHEN-NEW-ITEM-INSTANCE
WHEN-VALIDATE-ITEM
WHEN-VALIDATE-RECORD

其触发器的代码分别对应

FND_FLEX.EVENT(PRE-QUERY );
FND_FLEX.EVENT(PRE-UPDATE );
FND_FLEX.EVENT(PRE-INSERT );
FND_FLEX.EVENT(POST-QUERY );
FND_FLEX.EVENT(WHEN-NEW-ITEM-INSTANCE);
FND_FLEX.EVENT(WHEN-VALIDATE-ITEM);
FND_FLEX.EVENT(WHEN-VALIDATE-RECORD);

(4.3)代码定义弹性域字段

在FORM级触发器PRE-FORM内定义键弹性域:

begin
  fnd_key_flex.define(block           => HEK_OM_POP_VALIDITY_V, -- 键弹性域所在的BLOCK
                      field           => KEY_FLEXITEM, -- 键弹性域所在的BLOCK上创建的ITEM,用来容纳键弹性域组合
                      id              => LINE_ID, -- 键弹性域所在的BLOCK上创建的ITEM,保存KEY弹性域的唯一值(block的表)
                      appl_short_name => HEK,  
                      code            => TEST, -- 键弹性域的注册代码 fnd_id_flex_structures.id_flex_code
                      num             => 101 -- fnd_id_flex_structures.id_flex_num
                      );
end;

 5.补充

(5.1)定义会计科目键弹性域

begin
  --会计科目
  select chart_of_accounts_id
    into :parameter.chart_of_accounts_id
    from org_organization_definitions
   where organization_id = :parameter.org_id;

  fnd_key_flex.define(block           => CUX_INV_BCP_GANOH,
                      field           => TO_ACCOUNT,
                      id              => TO_ACCOUNT_ID,
                      appl_short_name => SQLGL,
                      code            => GL#,
                      num             => :PARAMETER.CHART_OF_ACCOUNTS_ID,
                      vrule           => \\nSUMMARY_FLAG\\nI\\nAPPL=SQLGL;NAME=GL_NO_PARENT_SEGMENT_ALLOWED\\nN\\0GL_GLOBAL\\nDETAIL_POSTING_ALLOWED\\nE\\nAPPL=INV;NAME=INV_VRULE_POSTING\\nN,
                      usedbflds       => N,
                      validate        => FULL,
                      required        => N);
  fnd_key_flex.update_definition(block   => CUX_INV_BCP_GANOH,
                                 field   => TO_ACCOUNT,
                                 enabled => N);
end;

 

如何在Form中使用键弹性域(Key Flexfield)

标签:

原文地址:http://www.cnblogs.com/abelwang/p/4417656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!