Login
Register

Home

Trainings

Fusion Blog

EBS Blog

Authors

CONTACT US

Senthilkumar Shanmugam
  • Register

Oracle Gold Partners, our very popular training packages, training schedule is listed here
Designed by Five Star Rated Oracle Press Authors & Oracle ACE's.

webinar new

Search Courses

×

Warning

JUser: :_load: Unable to load user with ID: 881

 

OAF Personalization and Extensions

A case study

Abstract

OAF Personalization means personalize the user interface (UI) of Oracle Self-Service Web Applications without modifying any underlying code whereas OA Framework extensibility is geared to enable customers to add new functionality and override or extend existing business logic beyond what can be accomplished via personalization. In short it the programmatic approach for personalization.

In this article I will explain a case study for OAF Personalization and Extension by analyzing real time requirement and how we have to use OAF Personalization and OAF Extension to meet the requirement.



Business Requirement

A customer defined DFF which is defined on the standard Oracle table needs to be enabled in the Self Service Web Screens.

There are five segments in the DFF. All the segments need to shown in the screens. Out of 5 segments, 4 are mandatory. However there is an exception to this rule. On certain circumstances (based on a lookup value) these segments are made non mandatory and defaulted with a value.

Analysis

On analysis, I found that the attribute columns on the standard Oracle table on which the DFF is defined was not included in the VO(View Object) on which the Self Service Page is built.

Also, we need to extend the CO (controller) of the page in order to handle the “mandatory” and “defaulting” with the DFF segments.

Design

This requirement can be easily achieved by following steps:

VO Substitution: Add additional columns to the VO.

OAF Personalization: Add the DFF field in the Web Screens using OAF Personalization Framework.

CO Extension: Handle the mandatory and defaulting values of segments based on the Lookup Value.

 

Implementation:

Step 1: VO Substitution

Actual VO: oracle.apps.pos.asn.server.PosAsnHdrIntfVO

SELECT PosRcvHdrIntfEO.HEADER_INTERFACE_ID,

       PosRcvHdrIntfEO.GROUP_ID,

       PosRcvHdrIntfEO.PROCESSING_STATUS_CODE,

       PosRcvHdrIntfEO.PROCESSING_REQUEST_ID,

       PosRcvHdrIntfEO.RECEIPT_SOURCE_CODE,

       PosRcvHdrIntfEO.TRANSACTION_TYPE,

       PosRcvHdrIntfEO.SHIP_TO_ORGANIZATION_ID,

       PosRcvHdrIntfEO.VENDOR_ID,

       PosRcvHdrIntfEO.VENDOR_SITE_ID,

       PosRcvHdrIntfEO.SHIPPED_DATE,

       PosRcvHdrIntfEO.ASN_TYPE,

       PosRcvHdrIntfEO.SHIPMENT_NUM,

       PosRcvHdrIntfEO.EXPECTED_RECEIPT_DATE,

       PosRcvHdrIntfEO.PACKING_SLIP,

       PosRcvHdrIntfEO.WAYBILL_AIRBILL_NUM,

       PosRcvHdrIntfEO.BILL_OF_LADING,

       PosRcvHdrIntfEO.FREIGHT_CARRIER_CODE,

       PosRcvHdrIntfEO.FREIGHT_TERMS,

       PosRcvHdrIntfEO.NUM_OF_CONTAINERS,

       PosRcvHdrIntfEO.COMMENTS,

       PosRcvHdrIntfEO.CARRIER_METHOD,

       PosRcvHdrIntfEO.CARRIER_EQUIPMENT,

       PosRcvHdrIntfEO.PACKAGING_CODE,

       PosRcvHdrIntfEO.SPECIAL_HANDLING_CODE,

       PosRcvHdrIntfEO.INVOICE_NUM,

       PosRcvHdrIntfEO.INVOICE_DATE,

       PosRcvHdrIntfEO.TOTAL_INVOICE_AMOUNT,

       PosRcvHdrIntfEO.FREIGHT_AMOUNT,

       PosRcvHdrIntfEO.TAX_NAME,

       PosRcvHdrIntfEO.TAX_AMOUNT,

       PosRcvHdrIntfEO.CURRENCY_CODE,

       PosRcvHdrIntfEO.PAYMENT_TERMS_ID,

       PosRcvHdrIntfEO.PAYMENT_TERMS_NAME,

       PosRcvHdrIntfEO.VALIDATION_FLAG,

       PosRcvHdrIntfEO.TAR_WEIGHT,

       PosRcvHdrIntfEO.TAR_WEIGHT_UOM_CODE,

       PosRcvHdrIntfEO.NET_WEIGHT,

       PosRcvHdrIntfEO.NET_WEIGHT_UOM_CODE,

       PosRcvHdrIntfEO.REMIT_TO_SITE_ID,

       NULL FREIGHT_TERMS_DESC

FROM RCV_HEADERS_INTERFACE PosRcvHdrIntfEO    

 

Substituted VO: xxx.oracle.apps.pos.asn.server. XXPosAsnHdrIntfVO

(Added the attribute columns to the query)

SELECT PosRcvHdrIntfEO.HEADER_INTERFACE_ID,

       PosRcvHdrIntfEO.GROUP_ID,

       PosRcvHdrIntfEO.PROCESSING_STATUS_CODE,

       PosRcvHdrIntfEO.PROCESSING_REQUEST_ID,

       PosRcvHdrIntfEO.RECEIPT_SOURCE_CODE,

       PosRcvHdrIntfEO.TRANSACTION_TYPE,

       PosRcvHdrIntfEO.SHIP_TO_ORGANIZATION_ID,

       PosRcvHdrIntfEO.VENDOR_ID,

       PosRcvHdrIntfEO.VENDOR_SITE_ID,

       PosRcvHdrIntfEO.SHIPPED_DATE,

       PosRcvHdrIntfEO.ASN_TYPE,

       PosRcvHdrIntfEO.SHIPMENT_NUM,

       PosRcvHdrIntfEO.EXPECTED_RECEIPT_DATE,

       PosRcvHdrIntfEO.PACKING_SLIP,

       PosRcvHdrIntfEO.WAYBILL_AIRBILL_NUM,

       PosRcvHdrIntfEO.BILL_OF_LADING,

       PosRcvHdrIntfEO.FREIGHT_CARRIER_CODE,

       PosRcvHdrIntfEO.FREIGHT_TERMS,

       PosRcvHdrIntfEO.NUM_OF_CONTAINERS,

       PosRcvHdrIntfEO.COMMENTS,

       PosRcvHdrIntfEO.CARRIER_METHOD,

       PosRcvHdrIntfEO.CARRIER_EQUIPMENT,

       PosRcvHdrIntfEO.PACKAGING_CODE,

       PosRcvHdrIntfEO.SPECIAL_HANDLING_CODE,

       PosRcvHdrIntfEO.INVOICE_NUM,

       PosRcvHdrIntfEO.INVOICE_DATE,

       PosRcvHdrIntfEO.TOTAL_INVOICE_AMOUNT,

       PosRcvHdrIntfEO.FREIGHT_AMOUNT,

       PosRcvHdrIntfEO.TAX_NAME,

       PosRcvHdrIntfEO.TAX_AMOUNT,

       PosRcvHdrIntfEO.CURRENCY_CODE,

       PosRcvHdrIntfEO.PAYMENT_TERMS_ID,

       PosRcvHdrIntfEO.PAYMENT_TERMS_NAME,

       PosRcvHdrIntfEO.VALIDATION_FLAG,

       PosRcvHdrIntfEO.TAR_WEIGHT,

       PosRcvHdrIntfEO.TAR_WEIGHT_UOM_CODE,

       PosRcvHdrIntfEO.NET_WEIGHT,

       PosRcvHdrIntfEO.NET_WEIGHT_UOM_CODE,

       PosRcvHdrIntfEO.REMIT_TO_SITE_ID,

       NULL FREIGHT_TERMS_DESC,

       PosRcvHdrIntfEO.ATTRIBUTE_CATEGORY,

       PosRcvHdrIntfEO.ATTRIBUTE1,

       PosRcvHdrIntfEO.ATTRIBUTE2,

       PosRcvHdrIntfEO.ATTRIBUTE3,

       PosRcvHdrIntfEO.ATTRIBUTE4,

       PosRcvHdrIntfEO.ATTRIBUTE5,

       PosRcvHdrIntfEO.ATTRIBUTE6,

       PosRcvHdrIntfEO.ATTRIBUTE7,

       PosRcvHdrIntfEO.ATTRIBUTE8,

       PosRcvHdrIntfEO.ATTRIBUTE9,

       PosRcvHdrIntfEO.ATTRIBUTE10,

       PosRcvHdrIntfEO.ATTRIBUTE11,

       PosRcvHdrIntfEO.ATTRIBUTE12,

       PosRcvHdrIntfEO.ATTRIBUTE13,

       PosRcvHdrIntfEO.ATTRIBUTE14,

       PosRcvHdrIntfEO.ATTRIBUTE15

FROM RCV_HEADERS_INTERFACE PosRcvHdrIntfEO

Now this substitution information can be downloaded into an xml file which may look like:

<?xml version = '1.0' encoding = 'UTF-8'?>

<customization xmlns="http://xmlns.oracle.com/jrad" xmlns:ui="http://xmlns.oracle.com/uix/ui" xmlns:oa="http://xmlns.oracle.com/oa" xmlns:user="http://xmlns.oracle.com/user" version="9.0.3.8.13_1566" xml:lang="en-US" customizes="/oracle/apps/pos/asn/server/PosAsnHdrIntfVO">

   <replace with="/xxx/oracle/apps/pos/asn/server/XXPosAsnHdrIntfVO"/>

</customization>

Step 2: OAF Personalization

Now we need to add a new item to the Web Screens using the personalization link which is explained in the screen shot below:

After doing this we can download this personalization information into a XML file which will look like

<?xml version = '1.0' encoding = 'UTF-8'?>

<customization xmlns="http://xmlns.oracle.com/jrad" version="9.0.5.4.89_560" xml:lang="en-US" customizes="/oracle/apps/pos/asn/webui/PosAsnCreatePG" xmlns:oa="http://xmlns.oracle.com/oa">

   <modifications>

      <modify element="ShipNumEntry" maximumLength="15"/>

      <modify element="BillOfLadingEntry" required="yes"/>

      <modify element="TruckNoDef" required="yes"/>

      <move element="ShipInfoInstrTbl" after="SpacerSI1"/>

      <move element="SpacerSI2" after="ShipInfoInstrTbl"/>

      <move element="ShipDateEntry" after="ShipNumEntry"/>

      <move element="ExpRcptDateEntry" after="ShipDateEntry"/>

      <move element="ShipDateText2" after="ExpRcptDateEntry"/>

      <move element="ExpRcptDateText1" after="ShipDateText2"/>

      <insert after="ExpRcptDateText1">

         <oa:flex id="DescFF" adminCustomizable="true" displayContextField="true" flexFieldAppShortName="PO" flexName="RCV_SHIPMENT_HEADERS" flexStyle="descriptive" readOnly="false" rendered="true" scope="." userCustomizable="false" viewName="PosAsnHdrIntfVO" xmlns:oa="http://xmlns.oracle.com/oa"/>

      </insert>

      <modify element="AsnLineEntryRN" controllerClass="xxx.oracle.apps.pos.asn.webui.XXPosAsnLineEntryCO"/>

      <modify element="ApplyAllBtn" rendered="false"/>

      <modify element="AsnCreatePG" controllerClass="xxx.oracle.apps.pos.asn.webui.XXPosAsnCreateCO"/>

   </modifications>

</customization><?xml version = '1.0' encoding = 'UTF-8'?>

<customization xmlns="http://xmlns.oracle.com/jrad" xmlns:ui="http://xmlns.oracle.com/uix/ui" xmlns:oa="http://xmlns.oracle.com/oa" xmlns:user="http://xmlns.oracle.com/user" version="9.0.3.8.13_1566" xml:lang="en-US" customizes="/oracle/apps/pos/asn/server/PosAsnHdrIntfVO">

   <replace with="/xxx/oracle/apps/pos/asn/server/XXPosAsnHdrIntfVO"/>

</customization>

In order to take this VO Substitution and OAF Personalization to other environments, we can use the ‘XMLImporter’ Utility provided by Oracle.

Step 3:  CO Extension

In the extended controller we have to get the handle to the DFF and then make the individual segments mandatory or default the values based on the boolean flag ‘mandatory’.

public class XXPosAsnCreateCO extends PosAsnCreateCO

{

  

public void processRequest(OAPageContext pageContext, OAWebBean webBean) {

  

//Get Handle to DFF                              

OADescriptiveFlexBean dffBean =       (OADescriptiveFlexBean)webBean.findIndexedChildRecursive("DescFF");

dffBean.processFlex(pageContext);     

//Make the segments mandatory

  if(mandatory)

  {

  OAMessageLovInputBean  segment2 =    (OAMessageLovInputBean)dffBean.findChildRecursive("DescFF1");

   if(segment2 != null)

   {

     segment2.setRequired("yes");

    }

  ....

  }

 

//Default the segment with the values from lookup

else

{

OAMessageLovInputBean  segment2 = (OAMessageLovInputBean)dffBean.findChildRecursive("DescFF1");

if(segment2 != null)

{

  segment2.setText(pageContext,attr2);

}

...

   super.processRequest(pageContext, webBean);

}

This Java file needs to be deployed into the custom directory of the Oracle Apps instance ($XXX_TOP for example)

Screen shots:

Fig 1: Standard Oracle Apps Screen (No DFF)

Fig 2: Standard Oracle Apps Screen after OAF Personalization

(Segments are mandatory)

 Fig 3: Standard Oracle Apps Screen after OAF Personalization

(Segments defaulted with values)

 

Hope this article was helpful in understanding the OAF Personalization and Extension.

For OAF customizations/extensions please contact This email address is being protected from spambots. You need JavaScript enabled to view it.

 

2

 


Add comment


Security code
Refresh

Search Trainings

Fully verifiable testimonials

Apps2Fusion - Event List

<<  Apr 2024  >>
 Mon  Tue  Wed  Thu  Fri  Sat  Sun 
  1  2  3  4  5  6  7
  8  91011121314
15161718192021
22232425262728
2930     

Enquire For Training

Related Items

Fusion Training Packages

Get Email Updates


Powered by Google FeedBurner