Oracle OAF 学习小结- 增删改查/LOV/Button/Sequence 的完整案例开发
Posted Jane Chiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle OAF 学习小结- 增删改查/LOV/Button/Sequence 的完整案例开发相关的知识,希望对你有一定的参考价值。
开发配置
了解EBS服务器目录
$JAVA_TOP
JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织。OAF开发的文件都放在这里。
$OA_html
$OA_HTML是所有EBS Web文件所在目录,最常见的是HTML文件、图片文件、JSP文件、Applet对应的Jar文件。
我们开发的jsp等相关文件要用ftp上传到这里;通常我们会再创建一个客户化文件夹,比如cux,方便文件管理。
$COMMON_TOP/_pages/_oa__html
第一次运行,Jserv自动将JSP转成Servlet,然后Cache到内存。
首先是转成Java源文件,然后编译成Class文件,都放在$COMMON_TOP/_pages/_oa__html
下,当然如果jsp放在$OA_HTML
的子目录下,这里也有子目录。
一个执行过的jsp文件会对应这里的一个java文件和一个class文件,有时候查错会把这里的java文件拿下来看,因为如果报错,出错行指的是java文件的行,而不是jsp文件的行。
$OA_MEDIA
$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功能。
额外设置
设置默认字符集
N: Tools/Preferences/Environment
要根据EBS字符集修改;这里我改成UTF-8。我们新建的jsp页面,头部的charset将默认取这个值,如<%@ page contentType=“text/html;charset=GB2312”%>。
设置默认Project属性:调试信息
N: Project/Default Project Settings…/Common/Oracle Applications/Run Options
添加OA Diagnostic、OADeveloperMode
设置默认Project属性:Forgive Duplicate Directive Attributes
N: Project/Default Project Settings…/Configurations/Development/Compiler/JSP
如果JSP页面包含另外一个JSP页面,这两个页面中都Import了某个相同的类,则Build该JSP页面会报“Error(XXX): 错误, 属性定义了两次: language”。解决办法是选中Forgive Duplicate Directive Attributes (Helps JSP 1.1 Compatability)。
需求概述
表数据
OAF的实体表,必须要有5个Who字段,主表SQL:
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
Sex 来自如下SQL:
select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
效果图
查询/修改入口(Update)/删除界面
修改界面:
基础:创建项目框架
创建基于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
BC4J包需要遵循如下格式要求:
对象 | 类型 |
---|---|
实体对象 | <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下创建。
Name: EmpVO
Entity Object,选EmpEO,并选所有字段。
向导结束后,在EmpVO的Query属性中,启用“Expert”模式,添加表和条件,注意新加的字段放最后:
SELECT * FROM CUX_OAF_EMPLOYEE
创建View Objects:SexLovVO
该VO用于LOV。在demo.oracle.apps.cux.emp.lov.server下创建。
Name: SexLovVO
一直Next,直接输入SQL:
select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
基础:创建V对象之Lov Region
创建Lov OA Components:SexLovRN
1、 新建OA
Components/Region
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
2、 新建table
选中SexLovRN,新建table Using Wizard,选择LovAM下的SexLovVO1,Resion名字为LovTable,选出所有字段,根据实际需要修改Prompt。
向导完成后继续设置如下属性,所有Item都可以设。
Search Allowed: True
查:创建V对象之Search Page
创建顶层页面:EmpLookPG
1、 新建OA
Components/Page
Name: EmpLookPG
Package: demo.oracle.apps.cux.emp.webui
向导完成后继续设置如下属性
Scope: PageLayout
AM Definition: demo.oracle.apps.cux.emp.server.Emp AM
Windows Title: OA_EMP_INFO
Titile: OA_EMP_INFO
2、 (可选)页面级消息
可以考虑加一个页面级别的消息,该消息需要来源AOL Message,以支持多语言。
至此,可以右键EmpLookPG运行。
创建查询区域:EMP_Search
1、 在PageLayout下新建Region
ID: EMP_Search
Region Style: Query
Construction Mode: resultsBasedSearch
Include Simple Panel: True
Include Views Panel: True
Include Advanced Panel:True
2、在EMP_Search下新建Region Using Wizard
选择EmpVO1,Region ID设置为Emp_Info,Style选择Table,显示字段:EmpCode,EmpName,Sex,Phone,Email,不显示字段:EmpId。根据需要修改Prompt,Style则要全部改为messageStyledText!
向导结束后针对Emp_Info的属性设置如下。
Additional Text: Search Results
Width: 80%
User Personalization: True
而对ResultsTable下的Item,主要关注如下几个属性。
Search Allowed: 是否允许查询,建议设置必要的字段为True即可
Sort Allowed: 是否允许排序,建议设置必要的字段为True即可
Initial Sort Sequence: 对于允许排序的字段,可设置初始排序方法
Selective Search Criteria:查询是否不允许空查询,数据量大才需要设置为True
User Personalization: 建议都设置为True
至此,可以右键EmpLookPG运行,可以执行查询了。
自己实现查询
上面的查询区域,是自动出来的(Search Allowed=True的字段),但比较简单,没有LOV,所以仅适用简单查询,要完成复杂查询,需要继续做些开发。
1、 修改Emp_Search
Construction Mode: autoCustomizationCriteria
Include Views Panel: False
Include Advanced Panel: False
2、 在Emp_Search建simpleSearchPanel
把默认生成的Header
Region2改为SimpleSearchHdr,Text属性改为Search。
把默认生成的messageComponentLayout
Region1改为CustomSimpleSearch。
3、 在CustomSimpleSearch下创建需要的查询字段,类似在Forms中创建查询块
建三个字段:Code、EmpNameInfo、EmpSex。类型都是messageTextInput,设置CSS Class属性为OraFieldText,其他属性如Selective Search Criteria、Data Type 、Maximum
Length、Prompt、Length根据需要设置。
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字段。
升级EmpSex为Lov字段
Style: LovInput
External LOV:/demo/oracle/apps/cux/emp/lov/webui/SexLovRN
并创建如下Lov Mapping:
ID: lovMap1
Lov Region Item: LookupCode
Return Item: EmpSex
Criteria Item: EmpSex
注:Criteria Item用来提前自动过滤Lov的内容!
至此,可以右键EmpLookPG运行,查询字段可以出来Lov了。
查:如何实现Execute Query
对于数据量不大的查询或者报表,希望一打开页面就执行查询。根据MVC的关系,用户通过V(Page及其Layout)——UI界面与系统交互,系统通过CO控制页面响应和页面流转,适当时候调用M完成逻辑处理,M(AM、EO、CO)负责和数据库打交道。按照OAF规范,需要在VO中实现查询,AM中编写调用VO的方法,CO中调用AM的方法。
查:修改M对象
修改VO的Java类
在EmpVOImpl.java中加入方法:
public void init()
executeQuery();
;
修改AM的Java类
在EmpAMImpl.java中加入方法,去调用VO:
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
新建OA Components/Page
Name: EmpPG
Package: demo.oracle.apps.cux.emp.webui
向导完成后继续设置如下属性
ID: PageLayoutRN
AM Definition: demo.oracle.apps.cux.emp.server.EmpAM
Windows Title: ADD_OAF_INFO
Titile: ADD_OAF_INFO
Warn About Changes: True
创建按钮区域和按钮: ButtonBarPN
1、 在PageLayoutRN下新建Region
ID: ButtonBarPN
Region Style: pageButtonBar
2、 在PageButtons下新建两个按钮,一个CancelBtn,一个SaveBtn
ID: CancelBtn
Item Style: submitButton
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Cancel
Disable Server Side Validation: True
Disable Client Side Validation: True
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
选择所有Item,各字段Prompt根据需要修改。
向导结束后,将Region Style更改为messageComponentLayout。
2、 设置各个字段的属性
先说通常设置:
Required: 根据需要设置
Search Allowed: 是否允许查询,建议设置必要的字段为True即可
Sort Allowed: 是否允许排序,建议设置必要的字段为True即可
Initial Sort Sequence: 对于允许排序的字段,可设置初始排序方法
Selective Search Criteria:查询是否不允许空查询,数据量大才需要设置为True
User Personalization: 建议都设置为True
再说关键属性:
Item Style: 想包含在UI中又不显示则用formValue,其他都可顾名思义
View Instance: 类似Form中的Block_Name,非数据库字段放空
View Attribute: 类似Form中的Item_Name,非数据库字段放空
CSS Class: 显示的字段,只读用OraDataText,其他用OraFieldText
Tip type: 日期字段用dateFormat,其他根据需要设置
3、 在PageLayoutRN下创建一个提示区pageStatus
ID: RequiredKey
Extends: /oracle/apps/fnd/framework/webui/OAReqFieldDescRG
Width: 100%
至此,运行效果如下:
要实际完成新增记录,还得写点代码。
增:修改M对象
修改AM的Java类
在EmpAMImpl.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: ButtonBtnBar
2、 在ButtonBtnBar下,创建Item
ID: CreateBtn
Item Style: submitButton
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Create
增:修改查询C对象
修改EmpSearchCO
1、响应Create按钮
先引用:
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类
在EmpVOImpl.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 reset
setWhereClauseParam(0, EmpId);
executeQuery();
// end init()
修改AM的Java类
在EmpAMImpl.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
在Windows资源管理器中使用复制、粘贴。
将文件EmpUpdatePG.xml加到项目中
N: File/Import…
设置字段的View属性
将原来那些Lov字段的View Instance和View Attribute补上。
改:创建C对象
可以从头创建,也可以拷贝。
拷贝EmpCO.java为EmpUpdateCO.java
在Windows资源管理器中使用复制、粘贴。
将文件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”按钮,实际是个图片连接
在EmpLookPG中的Emp_Info下,创建Item
ID: Update
Item Style: image
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Update
Image URI: updateicon_enabled.gif
Height: 24
Width: 24
Action Type: fireAction
Event: Update
Parameter如下:
Name: EmpID
Value: $oa.EmpVO1.EmpId
改:修改查询C对象
修改EmpSearchCO
1、 响应Update按钮
先引用:
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 AM
OAWebBeanConstants.ADD_BREAD_CRUMB_NO, // Do not display breadcrumbs
OAWebBeanConstants.IGNORE_MESSAGES);
2、 处理浏览器后退按钮
在processRequest最后加入:
else if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpUpdateTxn", false))
Emp.invokeMethod("cancell");
TransactionUnitHelper.endTransactionUnit(pageContext, "EmpUpdateTxn");
删:修改M对象
修改AM的Java类
在EmpAMImpl.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”按钮,实际是个图片连接
在EmpLookPG中的Emp_Info下,创建Item
ID: Delete
Item Style: image
Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Delete
Image URI: deleteicon_enabled.gif
Height: 24
Width: 24
Action Type: fireAction
Event: Delete
Parameter如下:
Name: EmpID
Value: $oa.EmpVO1.EmpId
删:修改查询C对象
修改EmpSearchCO
1、 响应Delete、以及“删除确认”按钮
先引用:
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
编译、上传
1、 右键Demo.jws或Demo.jpr,Rebuild
2、 将<JDEV_USER_HOME>\\myclasses\\demo上传到服务器$JAVA_TOP/demo
3、 修改目录属性,cd $JAVA_TOP后运行:chmod -R 775 hand
把页面定义导入到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
验证导入
用如下SQL验证:
BEGIN
jdr_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 |
菜单和职责定义这里不再详细说明。
以上是关于Oracle OAF 学习小结- 增删改查/LOV/Button/Sequence 的完整案例开发的主要内容,如果未能解决你的问题,请参考以下文章