开发配置

了解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

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

转载于:https://www.cnblogs.com/AI-xiaocai/p/11481928.html

OAF 增删改查/LOV/Button/Sequence 的完整案例开发相关推荐

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

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

  2. SQL语句增删改查公司-员工3表典型案例

    基础原生SQL增删改查,一般公司业务表,必知必会基础流程! 程序开发之大法,从数据库开始,不管是sqlserver,Oracle数据库还是其他MySQL等等的数据库.都是从写SQL语句开始.需要您必知 ...

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

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

  4. 利用koa实现mongodb数据库的增删改查

    概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...

  5. 如何在30分钟完成表格增删改查的前后端框架搭建

    30分钟,你可以做什么? 可以风卷残云的饱餐一顿:可以简单地打扫一下房间:或者可以跳10十遍刘畊宏<本草纲目>毽子操. 而今天,本葡萄要带你在30分钟内完成一套拥有增删改查表格系统的前后端 ...

  6. MongoDB增删改查命令详细手册(持续更新)

    目录 目标 特点 使用场景 <操作数据库> 创建&切换数据库 查看数据库 删除数据库 <操作集合> 创建集合 查看集合 删除集合 <操作文档> 新增数据 创 ...

  7. SpringBoot实战系列1:Spring Boot+Mybatis+MySql实现增删改查

    前言 Spring boot项目目前是Java Web开发领域最受市场欢迎的Spring框架之一,也是构建分布式项目.微服务项目重要基础之一,Spring Boot免去了配置繁杂的依赖和配置,使得开发 ...

  8. Mybatis实现增删改查 -- Mybatis快速入门保姆级教程(二)

    文章目录 前言 五.配置文件完成增删改查 1.学习目标 2.入门案例环境准备 3.查询--查询所有 4.查询--根据id查询 5. 查询--条件查询 6.查询--多条件动态查询 7.条件查询--单条件 ...

  9. python操作Oracle、PostgreSQL,MySql数据库增删改查

    python操作Oracle.PostgreSQL,MySql数据库增删改查,工作中可运行案例,直接上代码,供大家参考. # _*_ coding:UTF-8 _*_#import ServerCon ...

最新文章

  1. JavaWeb总结(九)
  2. 成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
  3. MFC中使用SDL播放音频没有声音的解决方法
  4. Spark Streaming实时数据分析
  5. 初始activiti工作流引擎
  6. linux sed
  7. Spring Boot 分页插件PageHelper
  8. dxComponentPrinter记录
  9. mysql 多表连接技巧_【Mysql进阶技巧(1)】 MySQL的多表关联与自连接
  10. [笔记] 最大权闭合子图最大流最小割相关笔记
  11. L2TP/L2TP over IPSec
  12. 生物信息服务器集群,IBM刀片服务器集群推动生物信息研究
  13. 微信自动发消息机器人实现方法
  14. 桥梁防撞主动预警系统解决方案-广州泛尔维
  15. 射频功率dbm-w换算表
  16. md5是什么,md5的这些作用你都知道吗
  17. Vivado 自定义暗黑色主题字体、颜色,复用自定义主题。文末附黑色主题设置文件
  18. 《Python之禅》的翻译和解释
  19. Qdown:你值得拥有的全功能文件下载工具
  20. 【大疆智图】| 重建三维模型

热门文章

  1. SHA256加密(python和Qt)
  2. 谢谢你,那么认真的,喜欢过我
  3. 途牛网php笔试题,2018秋招途牛笔试试题分享,期待春招offer!
  4. 汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(二)——贪吃蛇详细设计
  5. C++中的静态局部变量
  6. 快捷指令显示无法连接服务器,连接云服务器快捷命令行
  7. C++中类型转换详解
  8. C语言中字符串结束符
  9. 华三端口隔离(和华为一样)
  10. 座椅内饰如何「跟上」智能电动?这款智能概念座舱看到未来