中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OAF個性化開發實例(轉)

發布時間:2020-08-15 00:26:10 來源:ITPUB博客 閱讀:600 作者:419088217 欄目:建站服務器

EBS 11.5.10.2

需求

下圖是Oracle標準頁面,有一個簡單的開發需求,當Expense Template等于“管理費用”時,Approver的LOV輸入框默認為“XXX”,并且LOV只讀,不能進行選擇。

OAF個性化開發實例(轉)

分析

這個看似極其簡單的開發,其背后所隱藏的技術知識卻是不那么簡單的。

當Expense Template選擇為“管理費用”時,Approver LOV輸入框只讀,這里牽涉到的開發基本為給Expense Template加上FireAction的功能,

然后在Expense Template的Value Change事件中去修改Approver LOV的只讀屬性。

因為開發規范是不允許直接修改Oracle的代碼,所以此開發將通過集成標準的控制器類,在客戶化的控制器類中實現添加Expense Template的FireAction功能,和修改Approver LOV只讀屬性,

然后通過個性化,將控制器類替換成客戶化的控制器類。

技術要點

1,修改Approver LOV的只讀屬性

剛剛進行OAF開發的開發人員可能覺得這是很簡單的事,只要在客戶化的控制器類的processFormRequest()方法中調用以下代碼:

OAMessageLovInputBean lovBean = (OAMessageLovInputBean)webBean.findChildRecursive("Approver");
lovBean.setReadOnly(true);
就可以實現了,如果這樣做開發,那么就錯了,在運行時會拋出異常:
The OA passivation framework coding standard has been violated. 
Web bean properties cannot be modified in the controller processFormData or processFormRequest method. 
Web bean properties should be modified in the processRequest method only.

(這里有兩個方法是例外,setValue()和setText(),因為Value并不影響控件樹)為什么把LOV設為只讀會出錯呢?這是因為OAF在運行時,表現為一棵控件樹。

當進入頁面時,控件樹被初始化創建,而當用戶事件觸發POST請求時,控件樹并不會被重新生成(提高性能),要改變控件的屬性只有兩個辦法,一個是重新生成控件樹,二是使用PPR。

方法一:重構控件樹

重構控件樹就意味著在processFormRequest()方法處理事件時,需要Forward到本頁,并通過參數控制來設置Approver LOV只讀,這樣會刷新整個頁面,而且對編碼也帶來困難。

方法二:使用PPR

實現方法是利用OAF數據綁定機制,將Approver LOV的ReadOnly屬性綁定到視圖對象的屬性,通過改變視圖對象屬性的值來控制Approver LOV的只讀。

這里又引出第2個技術要點:

2,動態創建視圖對象

創建視圖對象需要首先創建OAViewDef對象,然后利用OAViewDef對象來創建視圖對象。

這里談一下Oracle的一個開發規范,OAViewDef接口在oracle.apps.fnd.framework.server包下,按照Oracle的規范,任何webui下的類不允許import任何server下的類。我是一個規范的嚴格遵守者,這樣就會使開發變得更復雜。

要在server包下引用OAViewDef接口,就必須創建應用程序模塊,將動態創建視圖對象的代碼移到應用程序模塊中實現。在客戶化控制器類中,動態創建應用程序模塊,然后調用應用程序模塊的方法。

實現步驟

假設開發人員對Oracle標準的頁面結構都已經非常了解了,包括需要集成哪個標準的控制器,頁面上所使用的視圖對象。

1、創建客戶化應用程序模塊cux.oracle.apps.ap.oie.entry.server.CuxPVOAM

2、創建視圖對象cux.oracle.apps.ap.oie.entry.server.CuxPVO,視圖對象中只有一個臨時屬性ReadOnlyFlag,類型為Boolean(此步可選)

3、創建客戶化控制器類,繼承標準的控制器類

4、在CuxPVOAMImpl.java中創建兩個方法:

 

import oracle.apps.fnd.framework.OAViewObject;
import oracle.apps.fnd.framework.server.OAViewDefImpl;
import oracle.jbo.AttributeDef;
import oracle.jbo.Row;
……
 
public void initPVO()
{
    OAApplicationModuleImpl rootAM = (OAApplicationModuleImpl)getRootApplicationModule();
 
    // 創建視圖對象
    OAViewDefImpl viewDef = (OAViewDefImpl viewDef)getOADBTransaction().createViewDef();
    viewDef.setFullName("CuxPVODef");
    viewDef.setViewObjectClass("oracle.apps.fnd.framework.server.OAViewObjectImpl ");
    viewDef.addTransientAttrDef("ReadOnlyFlag",
                             "java.lang.Boolean",
                             null,
                             false,
                             AttributeDef.UPDATEABLE);
 
    OAViewObject pvo = (OAViewObject)rootAM.createViewObject("CuxViewPVO", viewDef);
    // 初始化PVO
    if (!pvo.isPreparedForExecution())
    {
      pvo.executeQuery();
    }
    pvo.setMaxFetchSize(1);
    Row row = pvo.createRow();
    pvo.insertRow(row);
    row.setAttribute("ReadOnlyFlag", Boolean.FALSE);
  }
 
  public void handleTemplateChange()
  {
    OAApplicationModuleImpl rootAM = (OAApplicationModuleImpl)getRootApplicationModule();
    OAViewObject vo = (OAViewObject)rootAM.findViewObject("XxxVO1"); //標準的VO
    OAViewObject pvo = (OAViewObject)rootAM.findViewObject("CuxViewPVO");
 
    if () 
    {
      pvo.first().setAttribute("ReadOnlyFlag", Boolean.TRUE);
      vo.first().setAttribute("Xxx", ); // 設置Approver LOV綁定的視圖對象屬性值
    }
    else
    {
      pvo.first().setAttribute("ReadOnlyFlag", Boolean.FALSE);
    }    
  }
}

5、在客戶化控制器中添加相應代碼

processRequest代碼:

public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
  super.processRequest(pageContext, webBean);
 
  // 啟用Expense Template的FireAction功能
	OAMessageChoiceBean choiceBean = (OAMessageChoiceBean)webBean.findChildRecursive("ExpenseTemplate");
  choiceBean.setFireActionForSubmit("change",
                                null,
                                null,
                                true);
 
  // 創建客戶化應用程序模塊
  OAApplicationModule rootAM = pageContext.getRootApplicationModule();
  OAApplicationModule pvoAM = (OAApplicationModule)rootAM.findApplicationModule("CuxPVOAM");
  if(pvoAM == null)
  {
      rootAM.createApplicationModule("CuxPVOAM","cux.oracle.apps.ap.oie.entry.server.CuxPVOAM");
      pvoAM = HssCustomizeHelper.getNestedAMInstance(rootAM, "CuxPVOAM");
  }
  pvoAM.invokeMethod("initPVO");
 
  // 將ReadOnly屬性綁定到視圖對象屬性
	OAMessageLovBean approverLov = (OAMessageChoiceBean)webBean.findChildRecursive("Approver");
  approverLov.setAttributeValue(READ_ONLY_ATTR, new OADataBoundValueViewObject(approverLov,"ReadOnlyFlag","CuxPVO"));
}

將開發測試后的代碼發布到服務器。(測試可以在本地,將頁面上的控制器類替換成客戶化的控制器來進行)

processFormRequest代碼:

public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
  super.processFormRequest(pageContext, webBean);
 
  OAApplicationModule rootAM = pageContext.getRootApplicationModule();
  OAApplicationModule pvoAM =
      (OAApplicationModule)rootAM.findApplicationModule("CuxPVOAM");
  if(pvoAM == null)
  {
      rootAM.createApplicationModule(
          "CuxPVOAM","cux.oracle.apps.ap.oie.entry.server.CuxPVOAM");
      pvoAM = HssCustomizeHelper.getNestedAMInstance(rootAM, "CuxPVOAM");
  }
 
  if ("change".equals(pageContext.getParameter(EVENT_PARAM))) 
  {
    pvoAM.invokeMethod("handleTemplateChange");
  }
}

HssCustomizeHelper.getNestedAMInstance()的代碼如下:

public static OAApplicationModule getNestedAMInstance(OAApplicationModule parentAM, String nestedAMName)
{
  OAApplicationModule am = null;
 
  String[] amNames = parentAM.getApplicationModuleNames();
  for (int i=0; i< amNames.length; i++)
  {
    if (amNames[i].endsWith(nestedAMName))
    {
      return (OAApplicationModule)parentAM.findApplicationModule(amNames[i]);
    }
    else
    {
      am = getNestedAMInstance((OAApplicationModule)parentAM.findApplicationModule(amNames[i]),nestedAMName);
      if (am != null)
      {
        return am;
      }
    }
  }
  return am;
}

7、重啟Apache

8、進入頁面,設置個性化,替換標準的控制器類為客戶化控制器類。

1.jpg

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上饶市| 濮阳市| 达孜县| 黔东| 乐都县| 姜堰市| 宁波市| 永清县| 历史| 始兴县| 成安县| 留坝县| 新野县| 新巴尔虎右旗| 泾阳县| 无锡市| 西平县| 潼关县| 黑山县| 许昌市| 广东省| 玉溪市| 永和县| 寿光市| 宽甸| 安新县| 集贤县| 宝应县| 安庆市| 安达市| 瓦房店市| 松江区| 朝阳县| 昌黎县| 沙河市| 金阳县| 永泰县| 景泰县| 绥阳县| 望都县| 莲花县|