EBS OAF开发中的弹性域(Flexfields)(二)--关键性弹性域及其它
(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究) 关键性弹性域
关键性弹性域在OAF中实现为类.
oracle.apps.fnd.framework.webui.beans.OAKeyFlexBean
一个OAKeyFlexBean自动生成用于分段值录入的布局。因为关键性弹性域没有上下文字段,对于特定的结构编码所有的分段都会生成。
每个关键性弹性域都有一个相应的表,被称为组合表,用于存储所有编码的列表(编码的每个分段都有一列),以及相应的唯一ID编号(编码组合或者CCID)。潜在视图对象包含一个引用组合表的页面被称为”外键页”,而潜在实体对象使用组合表的页面被称为”组合页”或者”维护页”.
注意: OAKeyFlexBean目前仅支持”外键页”.
附加信息:更多关于CCID的资料,参考第二章的”组合”和”动态插入” ("Planningand Defining Key Flexfields") of the Oracle ApplicationsFlexfields Guide Release 12.也可以参考"Flexfields" chapter of the Oracle E-Business Suite Developer's Guide.
当你添加OAKeyFlexBean到你的页面,它:
l 显示弹性域分段用于输入或者更新,或者从相应的视图对象为弹性域分段设置数据库值。
l 验证弹性域分段的输入值,且如果这样的组合已经存在,使用当前组合的CCID来更新视图对象.如果这样的组合不存在,将会插入一个新的CCID行到组合表。
l 自动使用CCID来更新视图对象的CCID属性,这样如果没有错误,调用页面可以访问这些值。如果有错误,OAF框架会重画页面并显示错误消息。 表中的关键弹性域UI
注意:OAF框架不支持连接分段的范围或者单个分段的查询,如果指定的话就会返回一个开发模式错误。参考第二章的”Range form”标题("Planning and Defining KeyFlexfields") of the Oracle E-Business Suite Flexfields Guide Release 12。
注意:向后兼容性-新的关键性弹性域组合LOV UI为关键性弹性域生成一个LOV web bean,而不是为每个关键性弹性域分段生成多个子web bean。一些控制器可能依赖于旧的关键性弹性域UI。为修复向后兼容的问题,你需要设置FND_FWK_COMPATIBILITY_MODEprofile 为 11.5.9或者使用下面的JavaAPI来关闭新关键性弹性域UI.
你也应该考虑下面这些关键性弹性域运行时控制:
l 合并关键性弹性域分段到父布局
l 处理动态插入
l 只读和生成绑定值
l 添加VRule到关键性弹性域WebBean 把关键性弹性域分段合并到父布局
默认,弹性域分段是在弹性域内对齐的,但是在整个父区域内是不对齐的。如果你想要合并关键性弹性域到父布局,你必须通过属性名找到OAKeyFlexBean并调用OAKeyFlexBean的方法mergeSegmentsWithParent.
下面的代码示例把关键性弹性域分段合并到父布局中,在这个示例中,KeyFF是你的区域中item名称(类型为flex):
public class RegionCO extends OAControllerImpl
{
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
//find the flexfield that is defined in this region as item "KeyFF" and merge each
//individual segment to the outside layout
处理动态插入
如果你希望自己处理动态插入,你必须调用OAKeyFlexBean的方法setDynamicInsertion(false)来禁用动态插入。另外,包含关键性弹性域的页面的submitButton必须禁用验证.
注意:关于动态插入的额外信息,请参考"Dynamic Insertion"section of Chapter 2 ("Planning and Defining Key Flexfields") in the Oracle E-Business Suite Flexfields GuideRelease 12.
只读和生成绑定值
如果你在表中实现弹性域,且弹性域是只读或者在一些行中生成,而在其它行中不生成,你可以使用绑定值来编程实现.现在没有对这个声明式实现.
public void processRequest(OAPageContextpageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
...
OAWebBean rootBean = pageContext.getRootWebBean();
OAWebBean referenceBean =rootBean.findIndexedChildRecursive("referenceItem");
OAFlexMaps flexMaps = flexBean.getFlexMaps();
if (flexMaps == null) flexMaps = new OAFlexMaps();
OAFlexMap map = new OAFlexMap("flexMap", newOABoundValueFlexReference(referenceBean), "*paramName");
flexMaps.add(map);
flexBean.setFlexMaps(flexMaps);
...
}
注意下面重要的限制:
l OABoundValueFlexReference和SPEL${oa.page.<id>}绑定是一样的。OAFlexMap可以使用可选择的第四个Boolean类型参数.true值表明这个字段的值改变将会触发上下文的改变.请参考Javadoc中关于OAFlexMaps的更多细节.
l 当为上下文引用字段(描述性弹性域)定义flex映射并且在弹性域定义中选择了同步上下文标志,那么在UI中上下文字段会被禁用,因为上下文引用web bean就作为上下文中的单一来源。
l 当flexitem在更新模式,并且从关联弹性域的视图对象行得到的值和引用web bean中得到的值不同,那么下面的消息就会显示
"The value in flexfield contextreference web bean does not match with the value in the context of theDescriptive flexfield web bean PermitFlex. If this is not intended, please goback to correct the data or contact your Systems Administrator for assistance."
l OAF框架会关联一个标准的名为” FlexReferenceUpdate” flex事件到任意引用webbean。如果引用web bean已经关联了一个事件,一个错误就会抛出来,表明这个web bean不能作为一个引用web bean。 使用限制
1.如果引用web bean有一个默认值,那么这个应该声明式实现,或者在flex web bean的任意容器区域的控制器的processRequest实现.
2.引用web bean不能设置在Table,高级Table或者HGrid下面。
3.其它的限制,参考弹性域已知问题. 个性化考虑
l 参看OracleApplication Framework Personalization Guide中关于弹性域个性化考虑总结。
l 系统管理员可以使用个性化UI创建flexMaps. 值和值集
通常来说,在关键性或者描述性弹性域分段输入的值是由预定义的有效值集来验证的(一个值集).当定义你的值集时,你可以指定值的类型,并通过设置格式规则来符合值集。你为值集指定的验证类型会决定用户如何输入或者使用弹性域中的分段,验证类型如下:
l 没有(None)-没有验证,因此只要满足格式规则的值都可以输入。
l 独立(Independent)-为分段提供了一个预定义的存储于Oracle Application Object Library表中的值列表.
l 表(Table)-提供了一个就像独立值集的预定义的值列表,但是它的值是存储在应用表中的。你指定的表中定义的值和where 条件限制值集中使用的值。你可以在WHERE条件使用如$FLEX$和$PROFILES$绑定值来基于其它的值来创建可能的值列表。比如,$PROFILES$可以绑定值到特定的profile选项,$FLEX$让你绑定值到前面分段的值。
额外信息:关于如何使用这些绑定值的更多细节,请参考"Bind Variables" inChapter 4 ("Values and Value Sets") of the Oracle E-Business Suite Flexfields GuideRelease 12。
l 依赖(Dependent)-提供了一个预定义的值列表,但是这些值依赖于弹性域结构中前一个分段中独立的值。
l 可翻译的独立值和可翻译的依赖值-类似于独立和可依赖的值集,不同是的,除了可以使用翻译的值。
l 特殊和值对集合-这些值集提供了能够把关键性弹性域分段值或者组合作为标准报表提交的报表查询条件的机制(也被称为”弹性域内的弹性域”)。”特别”和”对”验证类型在OAF中是不支持的,如果指明这种类型的话会报开发模式错误.
额外信息:要了解更多关于用于标准请求提交的定义报表参数窗口(描述性弹性域),或者关于”特别”和”对”值集,请参考第七章("Standard RequestSubmission") in the Oracle E-Business SuiteFlexfields Guide Release 12.
当值集的列表类型为”Poplist”或者”List of Values”, OAF框架自动为弹出式列表或者LOV分别生成分段。
额外信息:要了解关于值集的更多信息,请参考第4章- "Values and ValueSets", in the Oracle ApplicationsFlexfields Guide Release 12. 弹性域验证
但你实现了一个包含提交按钮的页面时,当选择这个按钮时,你可以选择设置页面的提交为验证或者未验证。在这个页面中的弹性域的行为依赖于你是否设置submitButton的Disable Server Side Validation 和Disable Client Side Validation属性为true或者false.
注意:对于弹性域,为向后兼容,设置DisableServer Side Validation 或Disable Client Side Validation属性为true会禁用所有验证,既包含客户端也包含服务端的验证。
下面的表描述了当客户端和服务端都禁用或启用时弹性域的行为.
当你在查询区域有描述性弹性域时,就是一个你可能想要未验证提交的例子。
弹性域和标准请求提交
标准请求提交(SRS)的报表参数窗口,其允许用户为他们的报表输入查询条件,这个窗口就是一个特别的弹性域。其中,多数报表参数的设置步骤和描述性弹性域类似,主要的区别是你使用Concurrent Programs窗口来定义你的分段而不是使用描述性弹性域分段窗口,而且为SRS报表参数定义和使用值集的方式要复杂多了。
额外信息:请参考Chapters 7 ("Standard RequestSubmission") and 8 ("Reporting on Flexfields Data") in the Oracle E-Business Suite Flexfields GuideRelease 12.
如果你想使用弹性域作为报表参数(请参考弹性域中的弹性域),你可以使用弹性域程序来指明哪种类型的弹性域你想作为报表参数的值。
额外信息:关于关键性弹性域routine的语法,请参考Chapter 9 ("Key FlexfieldRoutines for Special Validation") in the OracleE-Business Suite Flexfields Guide Release 12 开发模式错误
如果检测到下面之一的弹性域实现,Oracle E-Bussiness Suite就会抛出开发模式错误:
l 弹性域中使用了引用字段
l 弹性域中使用了"对”(pair)值集
l 弹性域中使用了特殊(special)值集.
l 弹性域在表中表布局中.
l 弹性域直接放在MessageLayout中
l 弹性域在查询bean布局中 弹性域的问题处理
如果你的弹性域不像期望的那样工作,或者弹性域上有错误,你可以按照下面的故障解决步骤来分析引起问题的根源。
步骤1:检查弹性域设置
作为应用开发人员登陆基于Forms 的Oracle E-Business Suite 环境,导航到分段窗口(Flexfield->Descriptive/Key->Segments)。找到你使用的弹性域,确认这个弹性域的FreezeFlexfield Definition选框选上了.再次编译这个弹性域,如果你的弹性域使用了OAF页面不支持的功能,警告消息就会出现。
步骤2:在你的支持代表的指导下运行弹性域测试工具。
作为应用开发人员登陆基于Forms的Oracle E-Business Suite,导航到Flexfiled Test窗口(Flexfield->FlexfiledTest).找到你再使用的弹性域,并按钮支持代表的说明使用弹性域测试窗口。
步骤3:在OAF页面上检查你的弹性域是否有开发模式错误。
在运行时,OAF检查弹性域是否被合适的配置和使用。如果它找到弹性域的任何错误,OAF会在页面生成开发模式错误。如果有,在About Page.要启用开发测试模式调试,你必须设置profile选项FND: Developer Mode / FND_DEVELOPER_MODE为Yes.要在每个OAF页面的底部生成”Aboutthis page”链接,你必须设置profileFND: Diagnostics / FND_DIAGNOSTICS为Yes。
步骤4:使用”About”页面得到关于这个弹性域的更多信息。
在每个OAF页面的底部,有一个”About this page”的链接(如果profile FND: Diagnostics / FND_DIAGNOSTICS设置为Yes)。当你打开”About”页面,你可以在页面的tab中看到页面的结构,也包含弹性域的详细信息。所有的弹性域信息列在弹性域引用部分,包括:
l 弹性域名称和应用ID
l 关于每个分段的详细信息,比如分段名和分段值集。
l 是否弹性域有开发模式错误 已知问题
l 参考已知的弹性域问题列表极其建议的变通方法如果有的话。
l 在当前OAF页面存在指定的引用字段。
l 一个名为"FlexReferenceUpdate"标准flex事件应该关联到指定的引用bean。如果引用bean已经关联到一个动作,就会抛出一个表明指定的bean不能作为引用字段的错误。
l 当一个flex item在更新模式,并且从关联这个弹性域的视图行中得到的值和从引用的web bean的值不同的时候,下面的消息就会显示出来
"The value in flexfield contextreference web bean does not match with the value in the context of theDescriptive flexfield web bean PermitFlex. If this is not intended, please goback to correct the data or contact your Systems Administrator for assistance."
l 如果一个字段的同一个属性有多个引用字段,那么所使用的引用字段是顺序是不确定的。
l 引用字段不能放在Table或者AdvancedTable或者HGrid下面。