OAF 增删改查/LOV/Button/Sequence 的完整案例开发
开发配置
了解EBS服务器目录
$JAVA_TOP
JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织。OAF开发的文件都放在这里。
$OA_HTML
$COMMON_TOP/_pages/_oa__html
$OA_MEDIA
设置开发环境
设置Windows环境变量JDEV_USER_HOME
N: 我的电脑/右键/属性/高级/环境变量/用户变量的新建
变量名:JDEV_USER_HOME
变量值:随意(JDeveloper主目录\jdevhome\jdev)
下载DBC文件
从服务器$FND_TOP/secure,下载<DB_Host_Name>_.dbc到本地<JDEV_USER_HOME>\dbc_files\secure下。
创建EBS用户和职责
创建EBS用户如HAND_工号,并创建一个职责用于挂OAF功能。
额外设置
设置默认字符集
设置默认Project属性:调试信息
设置默认Project属性:Forgive Duplicate Directive Attributes
需求概述
表数据
create table cux.cux_oaf_employee(emp_id NUMBER NOT NULL,emp_code VARCHAR2(240) NOT NULL,emp_name VARCHAR2(240) NOT NULL,sex VARCHAR2(2),phone NUMBER,email VARCHAR2(240),address VARCHAR2(240),CREATION_DATE DATE DEFAULT SYSDATE NOT NULL,CREATED_BY NUMBER DEFAULT -1 NOT NULL,LAST_UPDATED_BY NUMBER DEFAULT -1 NOT NULL,LAST_UPDATE_DATE DATE DEFAULT SYSDATE 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 unique index cux.cux_oaf_employee_u1 on cux.cux_oaf_employee(emp_id);
create sequence cux.cux_oaf_employee_s start with 10000;
create synonym cux_oaf_employee_s for cux.cux_oaf_employee_s;
create synonym cux_oaf_employee for cux.cux_oaf_employee;
Lov
select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
效果图
基础:创建项目框架
创建基于OA的项目
参数 | 值 |
---|---|
默认目录 | <JDEV_USER_HOME>\myprojects |
Workspace | DEMO.jws |
Project | DEMO.jpr |
Default Package | demo.oracle.apps.cux.emp |
DBC File | <JDEV_USER_HOME>\dbc_files\secure\VIS.dbc |
用户/密码 | HAND_11175/handhand |
应用/职责简称 | CUX/HAND |
Database Connection | Syfdemo.ml.com |
创建BC4J Package
对象 | 类型 |
---|---|
实体对象 | <mycompany>.oracle.apps.<appshortname>.[<modulename>].schema.server |
视图对象 | <mycompany>.oracle.apps.<appshortname>.<modulename>.server |
LOV视图对象 | <mycompany>.oracle.apps.<appshortname>.<modulename>.lov.server |
页面 | <mycompany>.oracle.apps.<appshortname>.<modulename>.webui.XxxxPG |
控制器 | <mycompany>.oracle.apps.<appshortname>.<modulename>.webui.XxxxCO |
所以我们创建如下Business Component Package:
对象 | 类型 |
---|---|
实体对象 | demo.oracle.apps.cux.emp.schema.server |
视图对象 | demo.oracle.apps.cux.emp.server |
LOV视图对象 | demo.oracle.apps.cux.emp.lov.server |
页面 | demo.oracle.apps.cux.emp.lov.webui |
控制器 | demo.oracle.apps.cux.emp.webui |
基础:创建所需M对象
开发之前,应当先规划M对象。
这里我们将创建1个EO、1个基于EO+SQL的VO用于增删改查、1个基于SQL用于LOV的VO、1个用于管理LOV的AM、一个用于管理程序页面的AM。
创建Entity Objects:EmpEO
在demo.oracle.apps.cux.emp.schema.server下创建。
Name: EmpEO
Schema Object: CUX_OAF_EMPLOYEE
设置EmpId为Primary Key。
在产生Java画面,选中Entity Object Class下的所有复选框。
创建View Objects:EmpVO
该VO用来完成增加和修改。在demo.oracle.apps.cux.emp.server下创建。
向导结束后,在EmpVO的Query属性中,启用“Expert”模式,添加表和条件,注意新加的字段放最后:
SELECT * FROM CUX_OAF_EMPLOYEE
创建View Objects:SexLovVO
该VO用于LOV。在demo.oracle.apps.cux.emp.lov.server下创建。
select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
基础:创建V对象之Lov Region
创建Lov OA Components:SexLovRN
Name: SexLovRN
Package: demo.oracle.apps.cux.emp.lov.webui
Style: listOfValues
Scope: Public
AM Definition: demo.oracle.apps.cux.emp.lov.server.LovAM
Adv Search Allowed: True
查:创建V对象之Search Page
创建顶层页面:EmpLookPG
Name: EmpLookPG
Package: demo.oracle.apps.cux.emp.webui
可以考虑加一个页面级别的消息,该消息需要来源AOL Message,以支持多语言。
至此,可以右键EmpLookPG运行。
创建查询区域:EMP_Search
2、在EMP_Search下新建Region Using Wizard
Additional Text: Search Results
Width: 80%
User Personalization: True
而对ResultsTable下的Item,主要关注如下几个属性。
自己实现查询
上面的查询区域,是自动出来的(Search Allowed=True的字段),但比较简单,没有LOV,所以仅适用简单查询,要完成复杂查询,需要继续做些开发。
2、 在Emp_Search建simpleSearchPanel
把默认生成的Header
Region2改为SimpleSearchHdr,Text属性改为Search。
把默认生成的messageComponentLayout
Region1改为CustomSimpleSearch。
3、 在CustomSimpleSearch下创建需要的查询字段,类似在Forms中创建查询块
4、 在query
Components下创建simpleSearchMappings,然后创建查询字段映射
ID: EmpCode Map
Search Item: Code
Results Item: EmpCode
ID: EmpName Map
Search Item: EmpNameInfo
Results Item: EmpName
ID: Sex Map
Search Item: EmpSex
Results Item: Sex
至此,可以右键EmpLookPG运行,效果和自动产生的查询一样!
给查询加Lov
Lov的使用和Forms中类似,需要设置在哪个字段启用Lov,需要设置Return字段。
Style: LovInput
External LOV:/demo/oracle/apps/cux/emp/lov/webui/SexLovRN
ID: lovMap1
Lov Region Item: LookupCode
Return Item: EmpSex
Criteria Item: EmpSex
注:Criteria Item用来提前自动过滤Lov的内容!
至此,可以右键EmpLookPG运行,查询字段可以出来Lov了。
查:如何实现Execute Query
查:修改M对象
修改VO的Java类
public void init()
{ executeQuery();
};
修改AM的Java类
public void initSearch()
{EmpVOImpl empVO=(EmpVOImpl) this.getEmpVO1();if (empVO == null){//Handle error here} empVO. Init();
}
查:创建C对象
创建控制器:EmpSearchCO
给PageLayout或Emp_Info创建控制器,相当于Form中创建触发器。
Package Name: demo.oracle.apps.cux.emp.webui
Class Name: EmpSearchCO
简单理解,自动生成的Java代码中,processRequest是在浏览器初次打开页面时调用,而processFormRequest除此之外,每次用户点击提交按钮时还会再调用。
所以我们应当在processRequest中执行查询。先引用包:
import oracle.apps.fnd.framework.OAApplicationModule;
再在processRequest最后添加:
OAApplicationModule Emp_info = pageContext.getApplicationModule(webBean);
Emp_info.invokeMethod("InitSearch");
至此常规的查询功能已完全实现。运行效果如下:
增:创建V对象之Create Page
创建顶层页面:EmpPG
Name: EmpPG
Package: demo.oracle.apps.cux.emp.webui
创建按钮区域和按钮: ButtonBarPN
ID: ButtonBarPN
Region Style: pageButtonBar
2、 在PageButtons下新建两个按钮,一个CancelBtn,一个SaveBtn
ID: SaveBtn
Item Style: submitButton
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Apply
创建新建区域:MainRN
1、 在PageLayoutRN下新建Region Using Wizard,VO选择EmpVO1
ID: MainRN
Region Style : defaultSingleColumn
向导结束后,将Region Style更改为messageComponentLayout。
3、 在PageLayoutRN下创建一个提示区pageStatus
ID: RequiredKey
Extends: /oracle/apps/fnd/framework/webui/OAReqFieldDescRG
Width: 100%
增:修改M对象
修改AM的Java类
import com.sun.java.util.collections.HashMap;
import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
import oracle.apps.fnd.framework.server.OADBTransaction;
import oracle.jbo.RowSetIterator;
import oracle.jbo.domain.Number;
再加入3个方法,1个是用来初始化1个空行,1个用来提交,1个用来回滚:
public void CreateEmp(){ EmpVOImpl EmpVo = (EmpVOImpl) this.getEmpVO1(); if (!EmpVo.isPreparedForExecution()){ EmpVo.init(); } EmpVORowImpl row=(EmpVORowImpl) EmpVo.createRow(); EmpVo.insertRow(row); row.setNewRowState(EmpVORowImpl.STATUS_INITIALIZED);
}//Save
public void Save(){ this.getOADBTransaction().commit();}//Cancell
public void Cancell(){ OADBTransaction trn=getOADBTransaction(); if(trn.isDirty()) this.getOADBTransaction().rollback(); }
增:创建C对象
创建控制器:EmpCO
给EmpPG的pageLayoutRN创建控制器,相当于Form中创建触发器。
Package Name: demo.oracle.apps.cux.emp.webui
Class Name: EmpSearchCO
1、 在processRequest中初始化,同时,处理浏览器的后退动作
import oracle.apps.fnd.framework.OAApplicationModule;
import oracle.apps.fnd.framework.webui.OADialogPage;
import oracle.apps.fnd.framework.webui.TransactionUnitHelper;
再在processRequest最后添加:
if (!pageContext.isBackNavigationFired(false))
{TransactionUnitHelper.startTransactionUnit(pageContext, "EmpTxn");if (!pageContext.isFormSubmission()){OAApplicationModule Emp_info = pageContext.getApplicationModule(webBean);Emp_info.invokeMethod("CreateEmp");}
} else { if (!TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpTxn",true)){ OADialogPage dialogPage = new OADialogPage(NAVIGATION_ERROR); pageContext.redirectToDialogPage(dialogPage); }
}
2、响应Save、Cancel按钮,注意,如何重定向到查询界面
先引用包:
import oracle.apps.fnd.framework.OAViewObject;
import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
再在processFormRequest最后添加:
OAApplicationModule Emp_Operation = pageContext.getApplicationModule(webBean);
//Save
if (pageContext.getParameter("SaveBtn") != null){ Emp_Operation.invokeMethod("Save");
}
if (pageContext.getParameter("CancellBtn") != null){ Emp_Operation.invokeMethod("Cancell"); pageContext.forwardImmediately("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpLookPG",null, OAWebBeanConstants.KEEP_MENU_CONTEXT, null,null,false,OAWebBeanConstants.ADD_BREAD_CRUMB_YES);}
增:修改查询V对象
添加“Create”按钮
1、 在EmpLookPG中的Emp_Info下,创建tableActions
ID: CreateBtn
Item Style: submitButton
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Create
增:修改查询C对象
修改EmpSearchCO
import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
再在processFormRequest最后加入:
if (pageContext.getParameter("CreateBtn") != null) {pageContext.forwardImmediately("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpPG",null,OAWebBeanConstants.KEEP_MENU_CONTEXT, null, null, false, OAWebBeanConstants.ADD_BREAD_CRUMB_YES);
}
2、 处理浏览器后退按钮
在processRequest最后加入:
if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpTxn",false)){Emp.invokeMethod("Cancell");;TransactionUnitHelper.endTransactionUnit(pageContext,"EmpTxn");
}
增:如何实现Seqence
按照Dev Guide,有两种方式,一是编写数据库表触发器,在插入数据时获得Sequence;二是在EO中实现。推荐后者。
修改EmpEOImp1
注意EO的Java属性中,勾选“Create Method”。
先引用:
import oracle.jbo.domain.Number;
再在create方法最后添加
Number EmpID=Tra.getSequenceValue("CUX_OAF_EMPLOYEE_S");
setEmpId(EmpID);
改:修改M对象
修改VO的Java类
import oracle.jbo.domain.Number;
import oracle.apps.fnd.framework.OAException;
再加入方法:
public void init(String EmpID)
{if ((EmpID != null) && (!("".equals(EmpID.trim())))){ Number EmpId = null; try{EmpId = new Number(EmpID);} catch(Exception e) {throw new OAException("CUX", "CUX_OAF_EMPLOYEE_CHECK_ID");}setWhereClause("SYSTEM_CHECK_ID = :1");setWhereClauseParams(null); // Always resetsetWhereClauseParam(0, EmpId);executeQuery(); }
} // end init()
修改AM的Java类
import oracle.apps.fnd.framework.OAException;
import oracle.apps.fnd.common.MessageToken;
再加入方法,去调用VO:
public void initDetails(String EmpID)
{ EmpVOImpl vo = getEmpVO1();if(vo == null){MessageToken[] errTokens = { new MessageToken("OBJECT_NAME", "EmpVO1")};throw new OAException("AK", "FWK_TBX_OBJECT_NOT_FOUND", errTokens);} vo.setMaxFetchSize(1);vo.init(EmpID);
} // end initDetails()
修改VO:EmpVO
因为我们修改和增加的VO与查询的VO分开了,做修改时,需要和查询一样,将ID字段转换为有意义的Value给用户。
改:创建V对象
拷贝EmpPG.xml为EmpUpdatePG.xml
将文件EmpUpdatePG.xml加到项目中
设置字段的View属性
将原来那些Lov字段的View Instance和View Attribute补上。
改:创建C对象
拷贝EmpCO.java为EmpUpdateCO.java
将文件EmpUpdateCO.java加到项目中
N: File/Import…
并把类名改为EmpUpdateCO。
更改PageLayoutRN的CO
更改为:demo.oracle.apps.cux.emp.webui.EmpUpdateCO
更改EmpUpdateCO
import java.io.Serializable;
1、 processRequest
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{super.processRequest(pageContext, webBean);if (!pageContext.isBackNavigationFired(false)){TransactionUnitHelper.startTransactionUnit(pageContext, "EmpUpdateTxn");if (!pageContext.isFormSubmission()){String EmpID = pageContext.getParameter("EmpID");Serializable[] params = { EmpID };OAApplicationModule am = pageContext.getApplicationModule(webBean);am.invokeMethod("initDetails", params);} }else { if (!TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpUpdateTxn",true)){ OADialogPage dialogPage = new OADialogPage(NAVIGATION_ERROR); pageContext.redirectToDialogPage(dialogPage); } }
}
2、 processFormRequest
将EmpTxn改为EmpUpdateTxn
改:修改查询V对象
需要在查询界面添加一个按钮,链接到修改界面,并把ID传递给修改界面。
添加“Updae”按钮,实际是个图片连接
Name: EmpID
Value: ${oa.EmpVO1.EmpId}
改:修改查询C对象
修改EmpSearchCO
import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
再在processFormRequest最后加入:
else if ("Update".equals(pageContext.getParameter(EVENT_PARAM)))
{ pageContext.setForwardURL("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpUpdatePG",null,OAWebBeanConstants.KEEP_MENU_CONTEXT,null,null,true, // Retain AMOAWebBeanConstants.ADD_BREAD_CRUMB_NO, // Do not display breadcrumbsOAWebBeanConstants.IGNORE_MESSAGES);
}
2、 处理浏览器后退按钮
在processRequest最后加入:
else if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpUpdateTxn", false))
{ Emp.invokeMethod("cancell"); TransactionUnitHelper.endTransactionUnit(pageContext, "EmpUpdateTxn");
}
删:修改M对象
修改AM的Java类
import oracle.jbo.domain.Number;
import oracle.jbo.RowSetIterator;
再加入删除方法:
//Delete public void DeleteEmp(String EmpId){ if ((EmpID != null) && (!("".equals(EmpID.trim())))){ Number sEmpId = null;try{EmpId = new Number(EmpID);} catch(Exception e) {throw new OAException("CUX", "CUX_OAF_EMPLOYEE_CHECK_ID");}EmpVOImpl EmpVo = (EmpVOImpl) this.getEmpVO1();int key=Integer.parseInt(EmpId); EmpVORowImpl row = null; int fetchedRowCount = EmpVo.getFetchedRowCount();RowSetIterator DeleteIter = EmpVo.createRowSetIterator("Delete"); if(fetchedRowCount>0){ DeleteIter.setRangeStart(0); DeleteIter.setRangeSize(fetchedRowCount); for(int i = 0; i<fetchedRowCount; i++){ row = (EmpVORowImpl)DeleteIter.getRowAtRangeIndex(i); Number primarykey = row.getEmpId();if(primarykey.compareTo(key) == 0){ row.remove();getTransaction().commit();break; } } } DeleteIter.closeRowSetIterator();}}
删:修改查询V对象
需要在查询界面添加一个按钮,链接到修改界面,并把ID传递给修改界面。
添加“Delete”按钮,实际是个图片连接
Name: EmpID
Value: ${oa.EmpVO1.EmpId}
删:修改查询C对象
修改EmpSearchCO
import java.io.Serializable;
再在processFormRequest最后加入:
else if ("Delete".equals(event)) {String EmpID = (String)pageContext.getParameter("EMP_ID");Serializable[] ParaS = { EmpID };Emp.invokeMethod("DeleteEmp", EmpID);
}
发布到EBS
编译、上传
把页面定义导入到MDS中
实际上是用oracle.jrad.tools.xml.importer.XMLImporter将webui目录下的xml文件内容上传到数据库中。
cd $JAVA_TOP
java oracle.jrad.tools.xml.importer.XMLImporter
$JAVA_TOP/demo/oracle/apps/cux/hello/webui/SexLovRN.xml -rootdir
$JAVA_TOP -username apps -password apps -dbconnection $AD_APPS_JDBC_URL
验证导入
BEGINjdr_utils.printdocument('/demo/oracle/apps/cux/emp/webui/EmpLookPG');
END;
应该输出XML内容,而不是“Error: Could not find document….”
重启服务
cd $ADMIN_SCRIPTS_HOME
adcgnjar
admanagedsrvctl.sh stop oacore_server1 //输入weblogic密码 停止完毕后
admanagedsrvctl.sh start oacore_server1//输入weblogic密码
定义应用对象
可以参考OA Framework ToolBox Tutorial职责的菜单定义,关键是Function定义,HTML Call中指向xml文件所在路径。实例如下:
参数 | 值 |
---|---|
Function | CUX_OAF_DEMO |
Type | SSWA jsp function |
Html Call | OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpLookPG |
菜单和职责定义这里不再详细说明。
转载于:https://www.cnblogs.com/AI-xiaocai/p/11481928.html
OAF 增删改查/LOV/Button/Sequence 的完整案例开发相关推荐
- Oracle OAF 学习小结(2)- 增删改查/LOV/Button/Sequence 的完整案例开发
开发配置 了解EBS服务器目录 $JAVA_TOP JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织.OAF开发的文件都放在这里. ...
- SQL语句增删改查公司-员工3表典型案例
基础原生SQL增删改查,一般公司业务表,必知必会基础流程! 程序开发之大法,从数据库开始,不管是sqlserver,Oracle数据库还是其他MySQL等等的数据库.都是从写SQL语句开始.需要您必知 ...
- Oracle OAF 学习小结(3)- 字段控制 的完整案例开发
相关开发配置详见 Oracle OAF 学习小结(2)- 增删改查/LOV/Button/Sequence 的完整案例开发 需求概述 需求描述 要点1:页面初始化的时候,获取当前用户,并显示在界面. ...
- 利用koa实现mongodb数据库的增删改查
概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...
- 如何在30分钟完成表格增删改查的前后端框架搭建
30分钟,你可以做什么? 可以风卷残云的饱餐一顿:可以简单地打扫一下房间:或者可以跳10十遍刘畊宏<本草纲目>毽子操. 而今天,本葡萄要带你在30分钟内完成一套拥有增删改查表格系统的前后端 ...
- MongoDB增删改查命令详细手册(持续更新)
目录 目标 特点 使用场景 <操作数据库> 创建&切换数据库 查看数据库 删除数据库 <操作集合> 创建集合 查看集合 删除集合 <操作文档> 新增数据 创 ...
- SpringBoot实战系列1:Spring Boot+Mybatis+MySql实现增删改查
前言 Spring boot项目目前是Java Web开发领域最受市场欢迎的Spring框架之一,也是构建分布式项目.微服务项目重要基础之一,Spring Boot免去了配置繁杂的依赖和配置,使得开发 ...
- Mybatis实现增删改查 -- Mybatis快速入门保姆级教程(二)
文章目录 前言 五.配置文件完成增删改查 1.学习目标 2.入门案例环境准备 3.查询--查询所有 4.查询--根据id查询 5. 查询--条件查询 6.查询--多条件动态查询 7.条件查询--单条件 ...
- python操作Oracle、PostgreSQL,MySql数据库增删改查
python操作Oracle.PostgreSQL,MySql数据库增删改查,工作中可运行案例,直接上代码,供大家参考. # _*_ coding:UTF-8 _*_#import ServerCon ...
最新文章
- JavaWeb总结(九)
- 成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
- MFC中使用SDL播放音频没有声音的解决方法
- Spark Streaming实时数据分析
- 初始activiti工作流引擎
- linux sed
- Spring Boot 分页插件PageHelper
- dxComponentPrinter记录
- mysql 多表连接技巧_【Mysql进阶技巧(1)】 MySQL的多表关联与自连接
- [笔记] 最大权闭合子图最大流最小割相关笔记
- L2TP/L2TP over IPSec
- 生物信息服务器集群,IBM刀片服务器集群推动生物信息研究
- 微信自动发消息机器人实现方法
- 桥梁防撞主动预警系统解决方案-广州泛尔维
- 射频功率dbm-w换算表
- md5是什么,md5的这些作用你都知道吗
- Vivado 自定义暗黑色主题字体、颜色,复用自定义主题。文末附黑色主题设置文件
- 《Python之禅》的翻译和解释
- Qdown:你值得拥有的全功能文件下载工具
- 【大疆智图】| 重建三维模型