加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

EBS 开发添加弹性域到form中

发布时间:2020-12-15 03:50:40 所属栏目:百科 来源:网络整理
导读:EBS 开发添加弹性域到form中 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究) 在Oracle Forms窗口中调用弹性域有4个基本的部分。这些步骤假设你的弹性域已经在Oracle Application Object Librar

EBS 开发添加弹性域到form中

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)

在Oracle Forms窗口中调用弹性域有4个基本的部分。这些步骤假设你的弹性域已经在Oracle Application Object Library中已经注册和定义了,并且弹性域表和列已经在数据库中存在。这些步骤即适用于关键性也适用于描述性弹性域。

在form上使用弹性域:

l? 创建隐藏字段

l? 创建显示字段

l? 创建弹性域定义

l? 在几个事件触发器中调用弹性域定义

创建隐藏字段

通常,创建隐藏弹性域字段是作为从数据库表(或者视图)创建默认form block的一部分。在弹性域字段的canvas属性上设置为Null(这样它们就不会出现在canvas上)。

隐藏ID(仅适用于关键性弹性域),结构字段和分段或者属性等canvas属性为null的字段都必须是文本items。注意这些字段必须是文本items而不是显示items,并且它们必须使用TEXT_ITEM属性类。对于大多数字段设置其查询长度为255,而对于隐藏的ID字段设置其查询长度为2000.

注意:你不应该为隐藏字段写逻辑来直接为这些字段设值。因为弹性域会跟踪是否一个记录正被插入,更新得到,通过任意方法为这些字段设置值而不是弹性域本身(或者从数据库中查询)的话可能会引起错误和数据错误。

在关键性弹性域的一些外键form中,你可能需要创建额外的非数据库字段来代表组合表中的分段列(SEGMENT1到SEGMENTn).把这些从SEMENG1到SEGMENTn的分段字段放到null canvas(字段长度和数据库中的SEGMENTn列一样)。这些字段帮助Oracle Application Object Library在你的form创建新的带外键引用的编码组合(使用动态插入)。通常,Oracle Application Object Library可以在你的带有外键引用的form上仅使用连接的分段值字段来创建新的编码组合。但是,如果你期望你的弹性域的连接后的长度大于2000(定义的分段的值集的最大值和分段的分隔符的总和),那么你应该在你的form上创建这些非数据库字段来支持动态插入创建新的组合。

如果你没有这些字段并且用户想定义长的弹性域(>2000字符),那么当用户尝试去创建新的组合时,会感觉到关键性弹性域的数据被截断了。

如果关键性弹性域注册时Dynamic Inserts Feasible属性设成了No,那么你不需要添加这些字段,即使建议去添加它们。如果你不创建这些字段,那么用户第一一个长的弹性域的时候,用户在查询之后进入弹性域弹出窗口时,可能会看到空的弹性域分段。这些空的分段即不会影响实际的数据,并且当用户在查询后更新这些分段时也不会影响弹性域的修改。

如果你使用这些字段并且你在同一行(在block上)上有多于一个的关键性弹性域,那么你应该为每个弹性域创建一系列非数据库分段字段。因此,如果你在block上有三个外键引用的弹性域,你应该有4付分段字段(比如,SEGMENT1到SEGMENTn作为主分段集合;以及SEGMENT1_A到SEGMENTn_A,SEGMENT1_B到SEGMENTn_B,和SEGMENT1_C到SEGMENTn_C作为额外的集合)。而且,你在定义你的弹性域的方法中应使用USEDDBFLDS=”Y”参数。当你这么做时,你必须写触发器逻辑在弹性域方法调用之前来明确拷贝合适的值到这些字段,或者从这些字段中拷贝值出去。你必须WHEN-NEW-ITEM-INSTANCE,PRE-INSERT和PRE-UPDATE弹性域事件调用之前,从额外集合拷贝值到主集合。必须在POST_QUERY,WHEN-NEW-ITEM-INSTANCE,WHEN-VALIDATE-ITEM,PRE-INSERT或者PRE-UPDATE调用之后从主集合中拷贝值到合适的额外集合中。

对于一个描述性弹性域,可以创建这样的一个form,其中包含描述性弹性域列的表不是这个form的基础表(或者在基础视图所包含的表)。要做么做的话,你要在null canvas上创建所有隐藏字段(Attributen字段和结构定义字段)为非数据库字段。然后,编写触发器和表处理逻辑用于保持两个表的数据同步。比如,当你的form更新你的基础表时,你的ON_UPDATE的表处理逻辑应该更新描述性弹性域表中的ATTRIBUTEn和结构定义列。同样,当你的form插入新记录时,你应该在ON_INSERT表处理器中有逻辑去插入数据到描述性弹性域表中。描述性弹性域从不直接写数据到一个表中(基础表或者其它);它们一般写数据到隐藏分段字段。

创建显示字段

对于关键性弹性域或者描述性弹性域,创建你的连接分段字段为2000字符的显示的,非数据库文本字段。对于范围弹性域,你需要创建两个非数据库字段,且它们用户相同的名称,但是不同的后缀_LOW和_HIGH。

为关键性或者范围弹性域使用TEXT_ITEM属性类。对于描述性弹性域,使用TEXT_ITEM_DESC_FLEX属性类,并且字段名称为DESC_FLEX.

你必须从TEMPLATE上附加一个假的LOV,ENABLE_LIST_LAMP,到要显示的关键性或者描述性弹性域字段。确保”Validate from List”属性(之前为”Use LOV for Validation”)为No。这保证List lamp为你的弹性域能够正常工作。

如果你遇到奇怪的LOV行为(LOV提供”null”作为唯一有效的选择)或者弹性域不能更新和/或有无效的值,检查下”Validation from list”属性是否为No.

创建弹性域定义

在form的WHEN-NEW-FORM-INSTANCE触发器中调用弹性域定义方法来建立弹性域。使用这个方法,你需要为你的弹性域指定block和字段,及其相关字段,你需要的弹性域,和其它参数。参考弹性域定义方法。

你可能需要根据form上的条件启用,禁用,或者修改你的弹性域定义。比如,你可能想让弹性域在某些条件下可以被更新但是在某些其它情况下不能。在这种情况下,你在调用合适的DEFINE方法之后,也应该调用一个叫做UPDATE_DEFINITION的方法在做这种处理。

在几个事件触发器中调用弹性域定义

把对特殊方法的处理放到几个form级别的触发器中.这些方法在特定的事件比如WHEN-NEW-ITEM-INSTANCE,WHEN-VALIDATE-ITEM和PRE-INSERT事件触发你的弹性域。

你可以在form级别的触发器中使用FND_FLEX.EVENT(EVENT)方法来调用你的弹性域。你也可以在你自己的方法中使用这个方法来调用触发器。这个方法使用事件的名称作为参数。调用FND_FLEX.EVENT并传递下面表列出的触发器名称:

触发器

方法

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-NEW-ITEM-INSTANCE

FND_FLEX.EVENT(‘WHEN-NEW-ITEM-INSTANCE’);

WHEN-VALIDATE-ITEM

FND_FLEX.EVENT(‘WHEN-VALIDATE-ITEM’);

?

这些调用通常应该作为form级别的触发器编码到你的form中。如果你定义任何这些触发器在block或者字段级别,你需要确保block或者字段级别的触发器的运行方式设置为”Before”这样form级别的弹性域调用还会被运行,或者你也应该包含这些方法调用到这些触发器。

虽然为方便和连贯性,我们建议你在form级别编码这些弹性域触发器,但是form级别的触发器对于非常大的或者复杂的forms可能引起性能问题。在这种情况下,你可以在所有有弹性域block的block级别上(关键性或者描述性弹性域)PRE-QUERY,POST-QUERY,PRE-INSERT,PRE-UPDATE和WHEN-VALIDATE-RECORD触发器编码。然后你可以在定义弹性域的item的item级别的WHEN-NEW-ITEM-INSTANCE和WHEN-VALIDATE-ITEM的触发器上进行编码。

你仅需要在这些触发器集合中编码,不论在你的form上有多少弹性域(假设这些触发器在form层)。

3个在TEMPLATEform上 form级别的触发器,EKY-EDIT,KEY-LISTVAL和POST-FORM,已经有通过作为APPCORE库部分的APP_STANDARD.EVENT(‘trigger_name’)方法来进行的FND_FLEX.EVENT调用。你必须表中这些APP_STANDARD.EVNET调用不会被block或者item级别的触发器所覆盖。

注意:如果你有一个block或者item级别的POST_QUERY触发器,其重设了记录的查询状态,你必须设置block或者item级别的POST-QUERY触发器的执行方式为‘之后’(After).因为弹性域POST-QUERY逻辑会为弹性域更新字段值,记录必须在那个逻辑触发之后重新设置查询状态。

自动打开弹性域窗口

默认,描述性弹性域不需要特殊编码就会自动打开窗口,只要profile Flexfields:Open Descr Window设置成了No.

正常地,关键性弹性域不会自动打开窗口。但是,用户可以设置profile Flexfields:Open Key Window为Yes来自动打开所有关键性弹性域。在你的form上不必编写任何代码来自动打开弹性域窗口,因为窗口会再次被强制打开。

你应该移除任何用于自动打开关键性弹性域窗口的代码。这样的代码可能存在于你的包含弹性域的字段的字段级别的WHEN-NEW-ITEM-INSTANCE触发器中,而不是在form级别。你应该移除所有会自动打开弹性域的”FND_FLEX.EVENT(‘KEY-EDIT’);”调用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读