開發配置
瞭解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 |
菜單和職責定義這裏不再詳細說明。