壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2682|回复: 2

[OAF] OAF数据的读与写-part2:数据的写入

[复制链接]
发表于 2008/9/30 02:54:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
写入Model数据
每当浏览器处理一个Post请求,OAF自动地把用户的输入值写入相应的VO,再而更新相应的EO
下图为Http Post 数据流

Http Post 数据流

Http Post 数据流

注:下面步骤已经假定EO的行已成功的实现和初始化
1. UIX进行onSubmit Javascript验证(比如必填信息,数据类型,格式),验证成功后,提交Post请求
2. 浏览器发送Post请求,OAF沿着结构树的级别调用每个WebBeanprocessFormData方法
3. processFromData方法里,OAF为每个VO的当前Row自动执行setAttribute(String Name, Object value)方法。 这个方法会执行在VO行里的Attribute-level验证
4. setAttribute方法里,VO的行自动调用相应EOset<AttributeName>方法。从而在EO里执行attribute-level验证
5. 一旦所有的变量被赋值(set),OAF调用VOvalidate进行所有被赋值的row-level验证
6. 最后,在validate方法里,VO的行调用EOvalidateEntity方法执行entity-level验证
注:OAF自动显示在各模块层(model layer)processFormData方法里异常抛出的错误信息,此时不并不会调用下一步的processFormRequest方法。

避免验证

如上所述,对于每次表的提交(form submit)OAF需要对所有的attribute-levelentity-level验证后才写入Model Data. 但有时我们需要绕过验证来避免一些不合时宜的错误信息。

默认化

当你在创建页(create page)添加数据行时,可以在以下三处指定默认值:
  • [Model]如果你的VO基于多个EO,你可以用编译的方式给变量赋默认值来覆盖create()方法
  • [Model]你可以在建立EO时用BC4J EO Wizard 直接给EO 的变量赋值(非编译手段)。注意Oracle EBS内部Developer不应该选用此法
  • [View]View层,你可以直接设定你需要的网页上的每个个体的初始值(property inspector). 这个方法的好处(静态值在design time就被确定)是用户可以很容易的改变这些初始值。不论网页上个体与VO变量对不对应,这个方法都适用。例如,你可以初始化搜索栏里搜索选项的初始值,而这个搜索选项不需要有VO支持。

OAF11.5.10, 默认化缺省是关掉的。你必须设置选项FND:OA:Enable Defaults/FND OA ENABLE DEFAULT Y来开启。

如果默认选项设置为开启,而默认值在View(property inspector)设定,如果表的类型不是messageChoicemessageRadioGroup,那么OAF有如下规则:
  • 如果网页个体不与VO数据相关,那这个开启选项起不到什么作用,OAF在显示页面时会直接使用所设的初始值
  • 如果网页个体与VO数据关联,当你调用VOcreateRow()方法时,OAF才使用所设定的初始值

如果默认选项设置为开启,而默认值在View(property inspector)设定,如果表的类型messageChoicemessageRadioGroup,那么OAF有如下规则:
如果VO当前行的设定值不是空值,所设初始值即是默认值
如果VO当前行的设定值是空值,默认值由所设初始值决定且会实施到VO
注:如果默认选项设置为关闭,且当前VO行的值为空,默认值由所设初始值决定但不会实施到VO

下面是典型的创建新行的Code:
public void createSupplier(){
OAViewObject vo = getSuppliersVO();

// The OA Framework applies UI defaults during the scope of this

// method call.

Row row = vo.createRow();

vo.insertRow();

// As specified in OA Framework Model Coding Standards,

// always set the new row state to STATUS_INITIALIZED

// after you create it.


row.setNewRowState(Row.STATUS_INITIALIZED);
}
特别地,createRow()方法调用每个ViewRowImplcreate()方法。在调用create()时,OAF设定每个被初始化的UI单位的变量值。这就保证了任一“行变量的验证”(和相应的实体变量验证)的执行,如上图所示。然后OAF把每行重新设定为STATUS_INITIALIZED以至于看起来BC4J没有被改动。这就保证了用户可以浏览到网页而保留当前网页的初始值设置而不被警告。任何验证异常在此时都不会被抛出。

技巧:当行被创建时初始值有且只有一次被设定。如果有多页面的区域用到同一个VO(每个页面为同一个VO的变量设定不同的初始值),那么行被创建时只有第一个被显示的页面的初始值被写入Model. 其他的则被忽略。同样地,如果你在Page A创建一行,然后浏览到Page B 在那里有初始值的设定,那么这个初始值也不会被写入,因为你在Page B出现前就创建了该行。

下面3个初始值设定的方法,在OAF中他们的优先顺序是:
  • (最高)在网页个体属性栏里设定
  • 以编译的方式设定EO变量的初始值(必须通过VOvo.create()方法,它在调用EOcreate()方法)
  • (最低)在创建EO直接设定初始值

如果不论初始值怎么设,你要确保它被设定,你可以用下面的code覆盖VO insertRow()方法:

public void EmployeesVOImpl extends OAViewObjectImpl
{


...



public void insertRow(Row row)


{


// Always call super.insertRow() first.


super.insertRow();




// Now call whatever attribute setters you need to call to ensure


// that your defaults always take precedence.


row.setAttribute("<attributeName>", <attributeValue>);


...



}
}






Create Example

processFormRequest(OAPageContext pageContext, OAWebBean webBean){
OAApplicationModule am = pageContext.getApplicationModule(webBean);

am.invokeMethod("create", null);
}

Delete Example

This example illustrates invoking a delete method on a nested application module associated with a shared region as opposed to the page's root application module.



processFormRequest(OAPageContext pageContext, OAWebBean webBean){
if (pageContext.getParameter("DeleteYesButton") != null)
{
// User has confirmed that she wants to delete this purchase order.

// Invoke a method on the AM to set the current row in the VO and

// call remove() on this row.


String poHeaderId = pageContext.getParameter("poHeaderId");

Serializable[] parameters = { poHeaderId };

OAApplicationModule am = pageContext.getApplicationModule(webBean);


am.invokeMethod("delete", parameters);

}
...


Custom Action Example ("Approve")

processFormRequest(OAPageContext pageContext, OAWebBean webBean){
if (pageContext.getParameter("Approve") != null)

{

OAApplicationModule am = pageContext.getApplicationModule(webBean);

am.invokeMethod("approve");

}
}



Commit Example

processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
// Simply telling the transaction to commit will cause all the
//Entity Object validation to fire.

// Note: there's no reason for a developer to perform a rollback. //This is handled by the OA Framework if errors are encountered during //the processFormData phase.

OAApplicationModule am = pageContext.getApplicationModule(webBean);


am.invokeMethod("apply");

}

[ 本帖最后由 iamji 于 2008-9-30 02:56 编辑 ]

评分

参与人数 1努力值 +5 收起 理由
atomic79 + 5 内容不错,支持一下!

查看全部评分

 楼主| 发表于 2008/10/3 04:20:15 | 显示全部楼层


[ 本帖最后由 iamji 于 2008-10-3 22:16 编辑 ]
发表于 2008/10/3 12:06:36 | 显示全部楼层
国庆期间,大家都休息了啊,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 06:26 , Processed in 0.020101 second(s), 19 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表