TEC1304.值集和弹性域相关技术总结 - 第三章 键弹性域详解

来源:互联网 发布:苹方字体ttf windows 编辑:程序博客网 时间:2024/06/03 18:49

         第三章 键弹性域详解

 

 

第一节   键弹性域的基本概念

clip_image002

1.     ,段是弹性域内的单个子字段。在自定义弹性域时定义单个段的外观和含义。段在数据库中以单个表列表示。

对于键弹性域来说,段通常说明了由弹性域标识的实体的特性。例如,可以建立一个存储部件号的键弹性域,此键弹性域可以包含部件号PAD-YEL-NR-8 1/2 x 14,表示一个大小为 8 1/2"x 14" 的窄方格黄色记事本。部件号内以连字符隔开的每一节均说明了部件的一个特性。第一段说明对象 -记事本;第二段说明对象的颜色 -黄色等等。

2.     值、验证和值集,最终用户可以在使用应用产品时将段值输入段中。一般来说,弹性域都会根据通常预先定义的一组有效值(“值集”)来验证每个段。“验证段”表示弹性域会将用户在此段中输入的值与值集中该段的值进行比较。

设置弹性域以使它根据有效值表自动验证最终用户输入的段值。如果最终用户输入的段值无效,系统就会自动显示一个有效值的列表,以使用户可以选择一个有效值。

可以将值集视为值的“容器”。可选择可放入值集中的值的类型:值的长度、格式等等。

段通常会得到验证,而且指定弹性域中的每个段通常会使用不同的值集。可以将单个值集分配给多个段,甚至可以在不同的弹性域之间共用一个值集。对于大部分值集来说,在弹性域段中输入值时,只能输入分配给段的值集中已存在的值。

3.     结构,弹性域结构是段的一种特定配置。如果在弹性域中添加或删除段,或者将其中的段重新排序,就会得到一个不同的结构。

同一弹性域可以定义多个段结构(如果该弹性域已经创建可支持多个结构)。弹性域可以根据表单或应用数据中的数据条件,针对不同的最终用户显示不同的提示和字段。键弹性域和说明性弹性域都允许有一个以上的结构。

在某些应用产品中,不同的用户可能需要弹性域(键弹性域或说明性弹性域)中的段有不同的排列方式。或者,根据另一个表单或数据库字段的值,希望弹性域中有不同的段。

例如,Oracle General Ledger应用产品为不同帐套的用户提供了不同的会计弹性域(科目表)结构。它会根据“GL帐套名”用户配置文件选项的值来确定要使用的弹性域结构。


 

第二节   智能关键字

智能关键字,是由节组成的代码,这些节中的一个或多个部分可能具有某种含义。智能关键字“代码”仅标识如帐户、部件或任务之类的对象。由于智能关键字比唯一编号更易记易用,因此在应用产品中非常有用。

例如,部件号 PAD-YEL-11x14比唯一部件号57494更容易记住。但是,在关系数据库应用产品中,维护唯一的标识号比维护智能关键字更容易,这是因为标识号只需要一个列,而智能关键字则需要多个列(一列对应代码的一节或一段)。所以,Oracle Applications使用键弹性域来表示具有唯一标识号的智能关键字。也就是说,最终用户能够看到和使用易于记忆的智能关键字。


 

第三节   组合和组合表

组合,是一个特定的完整代码或组成代码的段值组合,它可以唯一标识对象。例如,每个部件号就是一个单一组合,这样,如果有十个部件,则需要定义十个组合。有效组合就是当前可使用的组合(也就是说,没有过期或被禁用)。

请注意,许多 Oracle Applications产品(及其文档)不一定将键弹性域组合称为“组合”。他们可能使用实体名称或键弹性域本身来指组合。例如,Oracle Assets使用称为“资产键弹性域”的键弹性域,并将其中的一个组合称为“资产键”或“资产键弹性域”。又如,Oracle General Ledger和其它 Oracle Applications产品一般使用术语“帐户”或“GL帐户”来指“会计弹性域”组合。

clip_image004

 

每个键弹性域都有一个对应的表,称为组合表,在此表中弹性域可存储完整代码的列表(一列对应一个代码段)以及该代码对应的唯一标识号(代码组合标识号或 CCID),而应用产品中的其它表有一列仅存储代码的唯一标识。例如,如果您有一个部件号代码 PAD-YEL-11x14

则“部件”组合表会存储该代码及其标识 57494。如果应用产品允许您接收部件的订单,则可能要建立一个存储部件订单的“订单”表。此“订单”表将只包含具有部件标识 57494 的单个列,而不会包含具有完整代码PAD-YEL-11x14 的多个列。


 

第四节   键弹性域Form的类型

键弹性域显示在三种不同类型的应用Form中:组合Form、外部关键字Form、范围Form

1.     组合Form

clip_image006

组合Form的唯一用途是维护键弹性域组合。Form的基准表是实际的组合表。该表是对象(部件、项、会计代码等)的实体表。Form包含表中每个段列的隐藏字段,同时还包含级连段值(组合)的显示字段,以及实体所要求的任何其它字段(和列)。组合Form有时也称为维护Form

2.     外部关键字Form

clip_image008

外部关键字Form的基础基准表只包含一个或两个含有键弹性域信息的列。外部关键字Form的用途通常与键弹性域本身关系甚微,并且键弹性域显示在该Form中实际上纯属偶然。例如,如果有一个代表部件号的键弹性域,使用组合Form来定义新部件并维护现有的部件号。这样就会有许多用来处理部件的外部关键字Form。可能具有一个订购部件的表单,一个接收部件的表单,同时还具有一个发运部件的表单。至于部件号碰巧是一个键弹性域,对订购部件并不重要。

3.     范围Form

clip_image010

范围Form显示范围弹性域,它是一个包含两个完整的键弹性域段集的特殊弹出式窗口。范围弹性域支持每个键弹性域段使用上下限值,而非仅支持使用单个值。通常,键弹性域范围在Form上显示为两个相邻的弹性域,其中最左边的弹性域包含范围的下限值,最右边的弹性域包含上限值。用户可以在此弹出式窗口中指定上下限值的范围。例如,您可以选择要为其运行报表的部件号范围。

范围Form使用一个特殊的表作为其基准表。对于显示在组合表中的每个段列,此表均包含它的一个或多个(通常为两个)列。但是,这些列并不一定包含实际段值,表中的行也并不一定包含实际有效组合。通常,此表单的每个段包含两个称为SEGMENTn_LOWSEGMENTn_HIGH(其中 n 表示段列号)的列,它们存储每个段的值范围。


 

第五节   限定词

弹性域限定词标识键弹性域的特定段

通常,出于安全性或计算等应用目的,应用产品需要使用某些方法来标识特定的段。但是,由于可以自定义键弹性域,以便段以及提示能够按某种顺序显示,因此应用产品还需要使用除段名或段顺序以外的其它机制来标识段。弹性域限定词就可以达到这种目的。您可以将弹性域限定词视为段的“识别标记”。

clip_image012

例如,Oracle General Ledger产品需要能够识别“会计弹性域”中哪个段包含余额信息,哪个段包含自然帐户信息。由于可以自定义“会计弹性域”,以便段以及提示能够按某种顺序显示,因此 Oracle General Ledger还需要弹性域限定词来确定使用的哪个段包含自然帐户信息。在定义“会计弹性域”时,必须指定哪些弹性域限定词适用于哪些段。

其它应用产品,如 Oracle Human Resources,也使用弹性域限定词。Oracle Human Resources使用弹性域限定词来控制谁可以访问弹性域段中的机密信息。

段限定词可标识键弹性域单个段中的值的特定类型。在 Oracle Applications 中,只有会计弹性域使用段限定词。您可以将段限定词视为值的“识别标记”。在会计弹性域中,段限定词可以标识自然帐户段值的帐户类型,并确定是否允许对某个特定值进行明细过帐或预算。

这两种类型的限定词很容易混淆。您可以认为整个弹性域使用弹性域限定词来标记弹性域的一小部分,而段使用段限定词来标记段值。


 

第六节   动态插入

clip_image014

动态插入,是指使用组合Form之外的Form,将新的有效组合插入到组合表中。

如果在设置键弹性域时允许动态插入,则用户可以使用外部关键字Form的弹性域窗口来输入新的段值组合。假定新组合符合任何现有的交叉验证规则,则即使组合表不是外部关键字Form的基础表,弹性域也会将此新组合插入组合表。

 

第七节   创建一个键弹性域

创建的健弹性域类似于系统中的ItemCategory Set健弹性域。是要实现按照不同的分组集对 我们自定义的产品或服务从不同的角度、不同的层次进行分组。

1.     创建键弹性域表和注册键弹性域表

CREATE TABLE apps.CUX_TKGP_COMBINATIONS(GROUP_STRUCTURE_ID Number ,GROUP_ID  NUMBER , 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) , SUMMARY_FLAG VARCHAR2(1) ,ENABLED_FLAG VARCHAR2(1) ,START_DATE_ACTIVE date ,END_DATE_ACTIVE date ,CREATED_BY NUMBER ,CREATION_DATE DATE ,LAST_UPDATED_BY NUMBER ,LAST_UPDATE_DATE DATE ,LAST_UPDATE_LOGIN NUMBER);CREATE unique index apps.CUX_TKGP_COMBINATIONS_U1 onapps.CUX_TKGP_COMBINATIONS(GROUP_ID);CREATE sequence apps.CUX_TKGP_COMBINATIONS_S NOCACHE;BEGIN  ad_dd.register_table('ONT', 'CUX_TKGP_COMBINATIONS', 'T', 8, 10, 90);  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'GROUP_STRUCTURE_ID', 1, 'NUMBER', 38, 'Y','N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'GROUP_ID', 2, 'NUMBER', 38, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT1', 3, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT2', 4, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT3', 5, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT4', 6, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT5', 7, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT6', 8, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT7', 9, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT8', 10, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT9', 11, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT10',12, 'VARCHAR2', 30, 'Y', 'N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT11', 13, 'VARCHAR2', 30, 'Y','N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT12', 14, 'VARCHAR2', 30, 'Y','N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT13', 15, 'VARCHAR2', 30, 'Y','N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT14', 16, 'VARCHAR2', 30, 'Y','N' );  ad_dd.register_column('ONT', 'CUX_TKGP_COMBINATIONS', 'SEGMENT15',17, 'VARCHAR2', 30, 'Y', 'N' );END;

2.     注册键弹性域

使用“应用开发员”职责登录EBS,菜单:弹性域 -> ->注册

clip_image016

3.     定义值集和值

l CUX_TKGP_STAND_LEVEL1

使用“应用开发员”职责登录EBS,菜单:应用产品 ->验证 ->值集

clip_image018

使用“应用开发员”职责登录EBS,菜单:应用产品 ->验证 ->clip_image020

l CUX_TKGP_OUTS_LEVEL1

clip_image022

clip_image024

l CUX_TKGP_COMMEC_LEVEL2

clip_image026

clip_image028

4.     添加键弹性域结构

使用“应用开发员”职责登录EBS,菜单:应用产品 ->弹性域 ->

clip_image030

选择结构后,点击“段”按钮,设置结构对应的段

clip_image032

到目前为止,键弹性域已经创建完毕!

 

第八节   FORM开发键弹性域详解

键弹性域通常用来处理有层次结构的编码,比如账户、类别等,极少自行客户化开发,一般都是使用系统标准的键弹性域而已。

1)     基表要求:基表中需含有1ID字段

键弹性域对应的表都有一个ID字段,如果我们在客户化开发中需要使用该表作为外键,当然需要一个外键ID字段,名字根据需要起即可,比如我们的CUX_FLEXFIELD_DEMO.CODE_COMBINATION_ID,实际上将用来保存帐户ID

-- Create tablecreate table apps.CUX_FLEXFIELD_DEMO(  FLEXFIELD_DEMO_ID      NUMBER not null,  CODE_COMBINATION_ID    NUMBER not null,  DESCRIPTION            VARCHAR2(240),  CREATION_DATE          DATE not null,  CREATED_BY             NUMBER not null,  LAST_UPDATED_BY        NUMBER not null,  LAST_UPDATE_DATE       DATE not null,  LAST_UPDATE_LOGIN      NUMBER,  ATTRIBUTE_CATEGORY     VARCHAR2(30),  ATTRIBUTE1             VARCHAR2(240),  ATTRIBUTE2             VARCHAR2(240),  ATTRIBUTE3             VARCHAR2(240),  ATTRIBUTE4             VARCHAR2(240),  ATTRIBUTE5             VARCHAR2(240),  ATTRIBUTE6             VARCHAR2(240),  ATTRIBUTE7             VARCHAR2(240),  ATTRIBUTE8             VARCHAR2(240),  ATTRIBUTE9             VARCHAR2(240),  ATTRIBUTE10            VARCHAR2(240),  ATTRIBUTE11            VARCHAR2(240),  ATTRIBUTE12            VARCHAR2(240),  ATTRIBUTE13            VARCHAR2(240),  ATTRIBUTE14            VARCHAR2(240),  ATTRIBUTE15            VARCHAR2(240));-- Create/Recreate indexescreate unique index apps.CUX_FLEXFIELD_DEMO_U1 on apps.CUX_FLEXFIELD_DEMO (FLEXFIELD_DEMO_ID);-- Create/Recreate sequenceCREATE SEQUENCE apps.CUX_FLEXFIELD_DEMO_S;

2)     字段要求:一个Key代码组合字段 +一个可选的Key描述组合字段

这两个字段可以是数据库项,也可以不是。

代码组合字段子类是Text_Item,描述组合字段子类通常是Text_Item_Display_Only;注意它们的长度要足够,不然可能放不下组合。

clip_image034

3)     触发器要求:

除了在Form级的触发器中定义弹性域的代码外,BlockItem级的触发器与说明性弹性域的一样。

添加Form级触发器WHEN-NEW-FORM-INSTANCE

fnd_key_flex.define(BLOCK           => 'CUX_FLEXFIELD_DEMO',                    field           => 'ACCOUNT_CODE',                    description     => 'ACCOUNT_DESCRIPTION',                    appl_short_name => 'SQLGL',                    code            => 'GL#',                    id              => 'CODE_COMBINATION_ID',                    required        => 'N',                    usedbflds       => 'N',                    validate        => 'FULL',                    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',num             => 101);

添加Block级触发器:

触发器

代码

PRE-INSERT

fnd_flex.event('PRE-INSERT');

PRE-UPDATE

fnd_flex.event('PRE-UPDATE');

PRE-QUERY

fnd_flex.event('PRE-QUERY');

POST-QUERY

fnd_flex.event('POST-QUERY');

WHEN-VALIDATE-RECORD

fnd_flex.event('WHEN-VALIDATE-RECORD');

注:可以把这些触发器写在Form级,这样不需要每个块都写,不过如果为了其它功能在块级写了同名触发器,执行层次需要改为Before

添加Item级触发器:

触发器

代码

WHEN-NEW-ITEM-INSTANCE

fnd_flex.event('WHEN-NEW-ITEM-INSTANCE');

WHEN-VALIDATE-ITEM

fnd_flex.event('WHEN-VALIDATE-ITEM');

注:可以把这些触发器写在Form级,这样不需要每个Item都写,不过如果为了其它功能在块级写了同名触发器,执行层次需要改为Before

4)     上传+编译

clip_image036

 

0 0
原创粉丝点击