(这里有两个方法是例外,setValue()和setText(),因为Value并不影响控件树)为什么把LOV设为只读会出错呢?这是因为OAF在运行时,表现为一棵控件树。

当进入页面时,控件树被初始化创建,而当用户事件触发POST请求时,控件树并不会被重新生成(提高性能),要改变控件的属性只有两个办法,一个是重新生成控件树,二是使用PPR。

方法一:重构控件树

重构控件树就意味着在processFormRequest()方法处理事件时,需要Forward到本页,并通过参数控制来设置Approver LOV只读,这样会刷新整个页面,而且对编码也带来困难。

方法二:使用PPR

实现方法是利用OAF数据绑定机制,将Approver LOV的ReadOnly属性绑定到视图对象的属性,通过改变视图对象属性的值来控制Approver LOV的只读。

这里又引出第2个技术要点:

2,动态创建视图对象

创建视图对象需要首先创建OAViewDef对象,然后利用OAViewDef对象来创建视图对象。

这里谈一下Oracle的一个开发规范,OAViewDef接口在oracle.apps.fnd.framework.server包下,按照Oracle的规范,任何webui下的类不允许import任何server下的类。我是一个规范的严格遵守者,这样就会使开发变得更复杂。

要在server包下引用OAViewDef接口,就必须创建应用程序模块,将动态创建视图对象的代码移到应用程序模块中实现。在客户化控制器类中,动态创建应用程序模块,然后调用应用程序模块的方法。

实现步骤

假设开发人员对Oracle标准的页面结构都已经非常了解了,包括需要集成哪个标准的控制器,页面上所使用的视图对象。

1、创建客户化应用程序模块cux.oracle.apps.ap.oie.entry.server.CuxPVOAM

2、创建视图对象cux.oracle.apps.ap.oie.entry.server.CuxPVO,视图对象中只有一个临时属性ReadOnlyFlag,类型为Boolean(此步可选)

3、创建客户化控制器类,继承标准的控制器类

4、在CuxPVOAMImpl.java中创建两个方法:

import oracle.apps.fnd.framework.OAViewObject;

import oracle.apps.fnd.framework.server.OAViewDefImpl;

import oracle.jbo.AttributeDef;

import oracle.jbo.Row;

……

public void initPVO()

{

OAApplicationModuleImpl rootAM = (OAApplicationModuleImpl)getRootApplicationModule();

// 创建视图对象

OAViewDefImpl viewDef = (OAViewDefImpl viewDef)getOADBTransaction().createViewDef();

viewDef.setFullName("CuxPVODef");

viewDef.setViewObjectClass("oracle.apps.fnd.framework.server.OAViewObjectImpl ");

viewDef.addTransientAttrDef("ReadOnlyFlag",

"java.lang.Boolean",

null,

false,

AttributeDef.UPDATEABLE);

OAViewObject pvo = (OAViewObject)rootAM.createViewObject("CuxViewPVO", viewDef);

// 初始化PVO

if (!pvo.isPreparedForExecution())

{

pvo.executeQuery();

}

pvo.setMaxFetchSize(1);

Row row = pvo.createRow();

pvo.insertRow(row);

row.setAttribute("ReadOnlyFlag", .FALSE);

}

public void handleTemplateChange()

{

OAApplicationModuleImpl rootAM = (OAApplicationModuleImpl)getRootApplicationModule();

OAViewObject vo = (OAViewObject)rootAM.findViewObject("XxxVO1"); //标准的VO

OAViewObject pvo = (OAViewObject)rootAM.findViewObject("CuxViewPVO");

if ()

{

pvo.first().setAttribute("ReadOnlyFlag", .TRUE);

vo.first().setAttribute("Xxx", ); // 设置Approver LOV绑定的视图对象属性值

}

else

{

pvo.first().setAttribute("ReadOnlyFlag", .FALSE);

}

}

}

5、在客户化控制器中添加相应代码

processRequest代码:public void processRequest(OAPageContext pageContext, OAWebBean webBean)

{

super.processRequest(pageContext, webBean);

// 启用Expense Template的FireAction功能

OAMessageChoiceBean choiceBean = (OAMessageChoiceBean)webBean.findChildRecursive("ExpenseTemplate");

choiceBean.setFireActionForSubmit("change",

null,

null,

true);

// 创建客户化应用程序模块

OAApplicationModule rootAM = pageContext.getRootApplicationModule();

OAApplicationModule pvoAM = (OAApplicationModule)rootAM.findApplicationModule("CuxPVOAM");

if(pvoAM == null)

{

rootAM.createApplicationModule("CuxPVOAM","cux.oracle.apps.ap.oie.entry.server.CuxPVOAM");

pvoAM = HssCustomizeHelper.getNestedAMInstance(rootAM, "CuxPVOAM");

}

pvoAM.invokeMethod("initPVO");

// 将ReadOnly属性绑定到视图对象属性

OAMessageLovBean approverLov = (OAMessageChoiceBean)webBean.findChildRecursive("Approver");

approverLov.setAttributeValue(READ_ONLY_ATTR, new OADataBoundValueViewObject(approverLov,"ReadOnlyFlag","CuxPVO"));

}

将开发测试后的代码发布到服务器。(测试可以在本地,将页面上的控制器类替换成客户化的控制器来进行)

processFormRequest代码:public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)

{

super.processFormRequest(pageContext, webBean);

OAApplicationModule rootAM = pageContext.getRootApplicationModule();

OAApplicationModule pvoAM =

(OAApplicationModule)rootAM.findApplicationModule("CuxPVOAM");

if(pvoAM == null)

{

rootAM.createApplicationModule(

"CuxPVOAM","cux.oracle.apps.ap.oie.entry.server.CuxPVOAM");

pvoAM = HssCustomizeHelper.getNestedAMInstance(rootAM, "CuxPVOAM");

}

if ("change".equals(pageContext.getParameter(EVENT_PARAM)))

{

pvoAM.invokeMethod("handleTemplateChange");

}

}

HssCustomizeHelper.getNestedAMInstance()的代码如下:public static OAApplicationModule getNestedAMInstance(OAApplicationModule parentAM, nestedAMName)

{

OAApplicationModule am = null;

[] amNames = parentAM.getApplicationModuleNames();

for (int i=0; i< amNames.length; i++)

{

if (amNames[i].endsWith(nestedAMName))

{

return (OAApplicationModule)parentAM.findApplicationModule(amNames[i]);

}

else

{

am = getNestedAMInstance((OAApplicationModule)parentAM.findApplicationModule(amNames[i]),nestedAMName);

if (am != null)

{

return am;

}

}

}

return am;

}

7、重启Apache

8、进入页面,设置个性化,替换标准的控制器类为客户化控制器类。

oracle oaf界面个性化,OAF个性化开发实例(转)相关推荐

  1. php 微信开发 菜单,微信公众号中个性化菜单的开发实例

    微信公众号中个性化菜单的开发实例 个性化菜单让公众号的不同用户群体看到不一样的自定义菜单.该接口开放给已认证订阅号和已认证服务号,个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Andro ...

  2. oracle oaf界面个性化,OAF个性化开发实例

    需求 下图是Oracle标准页面,有一个简单的开发需求,当Expense Template等于"管理费用"时,Approver的LOV输入框默认为"XXX",并 ...

  3. oracle oaf结构,解析OAF页面元数据结构((转自Oracle 探索者)

    在 Oracle E-Business Suite的二次开发中,基于OAF的开发在JDeveloper OA Extension中进行,完成后使用XMLImporter工具导入页面定义到数据库中, 之 ...

  4. python简单编程例子-中文方便就用中文编程!Python图形界面开发实例

    原标题:中文方便就用中文编程!Python图形界面开发实例 之前做的一个Python小程序,功能很简单,面对用户群也很窄,是五笔编码编.校人员使用的五笔编码编辑器. 这样的"周末" ...

  5. linux oracle新建监听,linux 下 oracle图形界面(需配置监听,创建实例)

    摘要:oracle 图形界面配置监听,创建实例,以下都是我安装是的截图,按步骤一定可以安装成功! CentOS6.7_x64_minimal_desktop的虚拟机一台(安装oracle需要图形界面, ...

  6. Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...

  7. 在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户、物品的协同过滤推荐算法 个性化推荐算法开发 机器学习、人工智能、大数据分布式开发

    在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户.物品的协同过滤推荐算法 个性化推荐算法开发 机器学习.人工智能.大数据分布式开发 Mo ...

  8. 如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 组合、混合推荐算法FoodRecommendSystem

    如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 组合.混合推荐算法FoodRecommendSystem ...

  9. oracle如何设置将菜单个性化,Oracle EBS Form个性化

    ? 活动Tab页的属性值为 序号 10 类型 消息 消息类型 显示 消息文本 Hello world! ? 然后保存,关闭Form,再打开Form,就会看到效果了 个性化属性设置 个性化定义头部 ? ...

  10. 简单在线音乐推荐网 基于用户、物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能、大数据分布式、机器学习开发

    简单在线音乐推荐网 基于用户.物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能.大数据分布式.机器学习开发S ...

最新文章

  1. 不懂装饰器,就不是真正会 Python
  2. 自己开发的MarkDown在线编辑器越来越完善了,心里感到高兴。
  3. 2017年深度学习优化算法最新进展:如何改进SGD和Adam方法?
  4. 睡觉时憋气发出“嗯嗯”的声音?
  5. html中img引入git动画,用Github五万颗星的css动画库, 为网页增添趣味性
  6. datatables data bind json
  7. 图文上下切换代码_Java核心知识 多线程并发 线程上下文切换(二十一)
  8. Mysql缺少可执行的命令
  9. 2021-05-12
  10. 运营书籍:从零开始做
  11. 南京大学Sweeper(2000)原创:地理系在哈佛的灭亡与计量革命
  12. 网页制作语言HTML5的应用
  13. Kubeadm介绍与使用Kubeadm搭建kubernetes集群环境
  14. IE不能上网浏览的问题
  15. android视频播放异常,Android 播放视频常见问题小结
  16. 人与人之间的交往艺术
  17. 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)
  18. 苹果手机量体温_手机记录西藏之旅和美食
  19. linux系统下安装pfam数据库中hmmer软件以及python3非root用户的安装
  20. 什么牌子的无线耳机最好?最好的蓝牙耳机排行榜

热门文章

  1. LimeSDR Mini 安装教程
  2. 跨境电商ERP中的自动化 3.平台订单自动发货
  3. 新用户注册及判断手机号是否重复
  4. 1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
  5. 改造Benchmark SQL适配OceanBase开源版数据库跑TPC-C查看执行计划
  6. Sonarqube的搭建和使用入门
  7. 阿里巴巴面试常用问题
  8. 2022年危险化学品经营单位安全管理人员考试练习题模拟考试平台操作
  9. win10怎么打开计算机服务,Win10如何打开系统服务?Win10打开系统服务的方法
  10. Android异常-android5.0以上网络请求失败-retry error, curr request is null