开发配置

了解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 resetsetWhereClauseParam(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 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类

在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验证:

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

菜单和职责定义这里不再详细说明。

Oracle OAF 学习小结(2)- 增删改查/LOV/Button/Sequence 的完整案例开发相关推荐

  1. OAF 增删改查/LOV/Button/Sequence 的完整案例开发

    开发配置 了解EBS服务器目录 $JAVA_TOP JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织.OAF开发的文件都放在这里. ...

  2. Oracle OAF 学习小结(3)- 字段控制 的完整案例开发

    相关开发配置详见 Oracle OAF 学习小结(2)- 增删改查/LOV/Button/Sequence 的完整案例开发 需求概述 需求描述 要点1:页面初始化的时候,获取当前用户,并显示在界面. ...

  3. 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接 ...

  4. oracle 赋予dorp,oracle表空间(tablespace)的增删改查(create/drop/rename,move/select)

    oracle表空间(tablespace)的增删改查(create/drop/rename,move/select) 2013-03-05 oracle维护中经常会对表空间进行操作,整理了一下tabl ...

  5. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] arg ...

  6. mongodb学习笔记之增删改查作指令

    1: mongo入门命令 1.1: show dbs  查看当前的数据库 1.2 use databaseName 选库 1.2 show tables/collections 查看当前库下的coll ...

  7. python输入list_python学习(list增删改查、及常用方法)

    1.Python多条件判断: 多条件判断 if: pass else: pass 循环 while for i = 0 while i > 1: print('hello') else: pri ...

  8. linux系统中mysql表中能添加中文_数据库学习之数据库增删改查(另外解决Mysql在linux下不能插入中文的问题)(二)...

    数据库增删改查 增加 首先我们创建一个数据库user,然后创建一张表employee create table employee( id int primary key auto_increment, ...

  9. javascript基础学习_数组增删改查......_ZHOU125disorder_

    数组的增删改查...... 1. new Array() (增) 定义一个空格数组之后在把元素添加到数组里面 var arr = new Array() arr[0]="卡卡西"; ...

最新文章

  1. Hologres揭秘:如何支持超高QPS在线服务(点查)场景
  2. 未来架构师的平台战略范例(2)_集装箱
  3. 辨异 —— Java 中的抽象类和接口
  4. 双变量空间自相关_【数据分析】变量探索分析
  5. 如何安装matlab?官网下载详细教程
  6. 如何去除数据库中重复的数据
  7. CAN报文解析—案例
  8. 最小生成树 Kruskal
  9. xlsx表格怎么做汇总统计_办公软件excel表格数据统计-如何将多个EXCEL表格的数据进行汇总?...
  10. BasicRF学习心得
  11. 《数据结构》实验——顺序结构与链表
  12. 做销售,换位思考很重要
  13. 关于Catalan数
  14. 程序员自我修养学习笔记
  15. [字符数和标点数] Python
  16. 【PPT】01 插入长图
  17. 2021年学习CV和OpenCV的五个最佳网课
  18. C# Path用法解析
  19. centos7创建python虚拟环境
  20. 【贪婪与非贪婪算法】

热门文章

  1. 米联客FDMA3.1数据缓存方案全网最细讲解,自创升级版,送3套视频和音频缓存工程源码
  2. C++之二叉树的序列化与反序列化
  3. 论售前工程师主要岗位职责及作用(转载)
  4. Tensorflow学习:数据集下载
  5. JSP基础语法(手写笔记)
  6. epub格式怎么转换成mobi?快来看看这些转换方法
  7. List集合,Set集合
  8. 关于c语言rand产生随机数相同的问题(学习笔记)
  9. 吃货疯抢天猫618生鲜产品,菜鸟协同物流业一天发货500吨
  10. 图片服务器是用什么协议,CCO协议是什么意思?CCO协议的图片能商用吗?