Oracle OAF 學習小結(2)- 增刪改查/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

菜單和職責定義這裏不再詳細說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章