Pages

Recently Viewed

Showing posts with label OAF. Show all posts
Showing posts with label OAF. Show all posts

Friday, April 24, 2020

Manage OAF Personalization from DB

Utility Name      JDR_UTILS 

Method Names  
  • listcustomizations       : Parameter is Document Path ( Full path of Page, CO or VO)
  • printdocument             : Parameter , Output of List Customization 
  • deletedocument           : Parameter (P_document   => Output of List Customization ) 

Begin
jdr_utils.listcustomizations('/oracle/apps/per/selfservice/termination/webui/TerminationPG');
END;

Begin
jdr_utils.printdocument('/oracle/apps/per/selfservice/termination/webui/customizations/function/FUNCTIONNAME/TerminationPG');
END;

Begin
jdr_utils.deletedocument(p_document => '/oracle/apps/per/selfservice/termination/webui/customizations/function/FUNCTIONNAME/TerminationPG');
END;

Friday, January 12, 2018

SQL to find OAF personalizations


SELECT JDR_MDS_INTERNAL.GETDOCUMENTNAME(PATH_DOCID) DOCUMENT_ID,
  jdr_mds_internal.exportDocumentAsXML(jdr_mds_internal.getDocumentName(path_docid)) personalization_xml
FROM jdr_paths,
  jdr_attributes
WHERE PATH_DOCID = ATT_COMP_DOCID
AND path_name    = SUBSTR(att_value,INSTR(att_value, '/', -1, 1)+1)
AND att_comp_seq = 0
AND ATT_NAME     = 'customizes'
AND ATT_VALUE    = ATT_VALUE
AND jdr_mds_internal.getDocumentName(path_docid) LIKE '%/responsibility/53621%'


This would return all OAF personalization for responsibility id 53621.

Saturday, January 17, 2015

VO Extension without JDeveloper

VO Extension is tool (JDeveloper) dependent but can be done manually by using below steps.

Steps to extend VO:
Create new VO  xxxxx_StandardVO.xml by renaming the standard VO StandardVO.xml (from server).
Edit below sections of VO according your customization need.

<ViewObject>
Name = New VO Name
Extends = original VO Name with complete path
ComponentClass = NewVO associate file with complete path


<SQLQuery>
Update the SQL with new changes.


<ViewAttribute> - Not required If change is in where condition or existing SQL logic
If adding a new sql field,we need to add ViewAttributes for new field.

Example -
<ViewObject
   Name=" xxxxx_StandardVO "
   Extends="oracle.apps.application.subapplication.common.server. StandardVO"
   BindingStyle="OracleName"
   CustomQuery="true"
   ComponentClass="xxxxx.oracle.apps.application.subapplication.common.server.xxxxx_StandardVOImpl"
   UseGlueCode="false">

<ViewAttribute
      Name="NEWFIELD"
      IsUpdateable="false"
      IsPersistent="false"
      Precision="30"
      Type="java.lang.String"
      ColumnType="VARCHAR2"
      AliasName=" NEWFIELD "
      Expression=" NEWFIELD "
      SQLType="VARCHAR" >
      <DesignTime>
         <Attr Name="_OverrideAttr" Value="true" />
         <Attr Name="_DisplaySize" Value="30" />
      </DesignTime>
   </ViewAttribute>

Create associated java file xxxxx_StandardVOImpl.java
package xxxxx.oracle.apps.application.subapplication.common.server;
import oracle.apps.application.subapplication.common.server. StandardVOImpl;
public class xxxxx_StandardVOImpl extends StandardVOImpl {
    public xxxxx_StandardVOImpl() {
    }  }

Compile and generate class file (xxxxx_StandardVOImpl.class
Create a OAProject.jpx file
<?xml version='1.0' encoding='windows-1252' ?>
<!DOCTYPE JboProject SYSTEM "jbo_03_01.dtd">
<JboProject
   Name="OAProject"
   SeparateXMLFiles="true"
   PackageName="" >
   <DesignTime>
      <Attr Name="_ejbPackage" Value="false" />
      <Attr Name="_NamedConnection" Value="DBConnection1" />
      <Attr Name="_version" Value="10.1.3.41.57" />
      <Attr Name="_jprName" Value="OAProject.jpr" />
   </DesignTime>
   <Containee
      Name="server"
      FullName="oracle.apps.application.subapplication.common.server"
      ObjectType="JboPackage" >
   </Containee>
   <Containee
      Name="server"
      FullName="xxxxx.oracle.apps.application.subapplication.common.server"
      ObjectType="JboPackage" >
   </Containee>
   <Substitutes>
      <Substitute OldName ="oracle.apps.application.subapplication.common.server.StandardVO" NewName ="xxxxx.oracle.apps.application.subapplication.common.server.xxxxx_StandardVO" />
   </Substitutes>
</JboProject>

Create server.xml file
<?xml version='1.0' encoding='windows-1252' ?>
<!DOCTYPE JboPackage SYSTEM "jbo_03_01.dtd">

<JboPackage
   Name="server"
   SeparateXMLFiles="true"
   PackageName="xxxxx.oracle.apps.application.subapplication.common.server" >
   <DesignTime>
      <Attr Name="_ejbPackage" Value="false" />
      <Attr Name="_version" Value="10.1.3.41.57" />
   </DesignTime>
   <Containee
      Name="xxxxx_StandardVO"
      FullName="xxxxx.oracle.apps.application.subapplication.common.server.xxxxx_StandardVO"
      ObjectType="ViewObject" >
   </Containee>
</JboPackage>

Place all files at respective locations and run JPX Importer  

Sunday, October 26, 2014

: XML-20112: (Fatal Error) Error opening external DTD 'jbo_03_01.dtd'

Error while importing custom VO.
 
Above error occurs while trying importing xml files. Developer will face this while extending VO.
 
OA extension, requires following files at respective folder structure under JAVA_TOP
1        CustomVO   (xxABCVO.xml)
2          Custom VOImpl file (xxABCVOImpl.class)
3          server.xml
4        OAProject.jpx
 
To extend VO, only jpx file needs to be uploaded using jpximporter command
 
Trying to import other 2 xml files (server and custom VO), will throw above error as these were not right file for xml importer.
 
Please ignore the error if jpx importer is successful. Your VO will be extended.



  
 

Monday, June 30, 2014

How to add LOV field on OAF page without OAF customizations

Adding LOV field on OAF page, requires creation of many OAF objects. Those not having much exposure on OAF can use below to achieve same –
 
This is simple and easily maintainable as LOV data will be fully controlled by your value set used.

How to add custom flexfield on OAF page

This is similar to adding any new fields on OAF page and will be achieved using OAF personalization.
 
Go to OAF page >> Personalize Page >> Create Item >>
 
Item Style = Flex
Id – DFF   (Any unique Value)
Appl Short Name – ICX ( Oracle iProcurement)
Name – TESTDFF  (DFF Name) Click Here to create custom DFF
View Instance –  OneTimeLocationDisplayVO  (Associated VO of the page)
This will show the DFF available on the screen. Re order as per requirement.
 
Associated VO Details ( About This Page)
 
Note – Add Flex item on page layout region.

 
 

Thursday, December 26, 2013

Initialize Apps Context in Java file while creating dependent VS in WEBADI

Oracle provides standard class which can be used to initialize the apps context (set policy context) in java files if required –
 
Class Name – PaMoInit
Method – MoInit
Location - oracle.apps.pa.webadi.utilities
 
Call –
PaMoInit.MoInit(paramBneWebAppsContext);
 
 
This can be simply import if we are in PA module. Please check if same exist for any other modules otherwise creates below method and register (place) at some places.
 
 
package oracle.apps.pa.webadi.utilities;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import oracle.apps.bne.exception.BneException;
import oracle.apps.bne.framework.BneWebAppsContext;
import oracle.apps.fnd.common.VersionInfo;
 
public class PaMoInit
{
  public static void MoInit(BneWebAppsContext paramBneWebAppsContext) throws SQLException, BneException
  {
    Connection localConnection = paramBneWebAppsContext.getJDBCConnection();
    String str = "";
    CallableStatement localCallableStatement = null;
 
    StringBuffer localStringBuffer = new StringBuffer();
 
    localStringBuffer.append("begin PA_MOAC_UTILS.INITIALIZE; end;");
    localCallableStatement = localConnection.prepareCall(localStringBuffer.toString());
    localCallableStatement.execute();
    localCallableStatement.close();
  }
}

 

 

Friday, August 9, 2013

Increase no of Searched Records on OAF page

Requirement:
 OAF page search result appears in table and display by default 10 rows. We need to click next to see another 10 records and keep pressing next.
This will be frustrating when the number of records is more than 100.
 
 
Resolution:
Default search results count can be increased by OAF personalization.
 
Steps:
1)     Enable the personalization link on OAF page ( if not available)
2)     Click on the highlighted link
 
 
3)       Click on pencil icon
 
4)       Set the value at required level
 
5)       Click on apply and return to application
 
6)       Check the result count. It is increased to 49 now J
 

 

 

Saturday, May 4, 2013

oracle.jbo.JboException: JBO-29000: Unexpected exception caught:

Error Message :

Exception Details. 
oracle.apps.fnd.framework.OAException: oracle.jbo.JboException: JBO-29000:
Unexpected exception caught: oracle.classloader.util.AnnotatedNoClassDefFoundError, msg=
  
Missing class: XXXX.oracle.apps.po.document.order.webui.XXXXOrderPaymentDetailsCO (wrong name: oracle.apps.po.document.order.webui.XXXXOrderPaymentDetailsCO)

 Dependent class: XXXX.oracle.apps.po.document.order.webui.XXXXOrderPaymentDetailsCO
          Loader: oacore.root:0.0.0
     Code-Source: /oracle/ebs/apps/apps_st/comn/java/classes/
   Configuration: <library> in /oracle/ebs/apps/apps_st/comn/webapps/oacore/

The missing class is not available from any code-source or loader in the system.


Cause :
Above error message states that extended CO (XXXXOrderPaymentDetailsCO) is not available at ight place. As per EBS practise all custom code should be placed on cstom top  whch reference are provided on personalization (controller path).

In JAVA file, first line denotes package reference,it's like location of CO files, The above error occurs if package name location <> 
cumtom path given in personalization page <>
custom CO is not avaialble at location


Resolution :
Ensure all 3 things ate having same path. i.e.
Custom code are placed @ right location
Same location is mentioned in java file @ first line ( package)
same path is referenced while personalization



 

Sunday, April 28, 2013

Remove VO personalization

Personalization page supports to extend and remove the controller (CO) but no interface to extend the VO. 

VO extension requires Jdeveloper to create substitute, which will generate .jpx and server.xml files.
Later JPXImporter will apply extended VO to system.

To backout the extended VO, we can use database scripts to delete personalizations .

refer OAF migration

Steps to back out VO extension -
1)  Get the original VO name ( with complete path). This will be document path.
      Example /oracle/apps/po/lov/server/DocumentNumbersVO 

===========================================================
Use listcustomization to find the personalization details

BEGINJDR_UTILS.LISTCUSTOMIZATIONS('/oracle/apps/po/lov/server/DocumentNumbersVO');
END;


===========================================================
Use delete script to delete the personalization
Begin
jdr_utils.deletedocument(p_document=>'/oracle/apps/po/lov/server/customizations/site/0/DocumentNumbersVO');
END;

=========================================================== 

Tuesday, January 31, 2012

Multiple Error Messages in OAF

Requirement – How to raise multiple error messages as multiline on OAF pages.

Solution –  1) Create and initialize new ArrayList object
       2) Define the error messages in array list
       3) Raise bundled eception method  

Example -
    ArrayList  errMsg = New ArrayList();                 
 
    errMsg.add(new OAException("Who is Lucifer"));
    errMsg.add(new OAException("Ra-One will kill Lucifer"));
    errMsg.add(new OAException("G-One is protector"));      
    
   OAException.raiseBundledOAException(errMsg);    

Output –
1.       Who is Lucifer
2.       Ra-One will kill Lucifer
3.       G-One is protector
------------------------------------------------------------------------------------------------------
Exception -  If above method is being implemented inside a try/catch block, It might not throw expected error message.So either implement above outside Try/catch block or use below steps to handle this inside try/catch.       
             
1)      Create array list object at global level
      ArrayList  errMsg = New ArrayList();     
            
2)      Define the messages inside the try block and raise exception with custom message
 try {
    errMsg.add(new OAException("Who is Lucifer"));
    errMsg.add(new OAException("Ra-One will kill Lucifer"));
    errMsg.add(new OAException("G-One is protector"));      
    throw new OAException("Sandeep");   
     }           

3)      Handle this implementation inside the catch block
catch(Exception e)
  {
  String a="oracle.apps.fnd.framework.OAException: Sandeep";
  if (a.equals(e.toString()))
  {   OAException.raiseBundledOAException(errMsg);    }
  else
  {   throw new OAException("Exception Has been found in code 28:" +e, OAException.INFORMATION); 
 }

Raise Exception in OAF

Requirement – How to raise and handle exceptions in OAF pages.

Solution – There are 3 types of exceptions can be thrown on OAF pages (java).
a)      Warning  – This will display as warning and show custom message  
b)      Information  - This will display as information and show custom message
c)       Error – This will display your custom message as error and stop the flow.

In java (OAF) we use try catch block to handle exceptions.
Try Block – All logic should be kept in a try block to handle exceptions
Catch Block – Once control find any exception in try block, it goes to catch block. Catch block will be used to handle the raised exception.

Example -
try{ 
                                custom code{
……………;
…………….;
}   
  
throw new OAException("Sandeep");     // Raise Exception Manually     

                      }catch(Exception e)
                     {

                 throw new OAException("Exception " +e,  OAException.WARNING);         
                // For Warning Message
                 throw new OAException("Exception " +e,  OAException.INFORMATION);   
                // For Information Message   
                 throw new OAException("Exception " +e,  OAException.ERROR);             
               // For Error Message 
     }

If exception occurs in custom code, control will come to catch block and it will print the relative exception message on the screen.
If there is no exception in custom code, control will read last line. Which is to throw exception manually and send control to catch block.
Error message in this case will be as “Exception oracle.apps.fnd.framework.OAException: Sandeep”    

Thursday, October 20, 2011

Profiles 4 OAF pages

Below are the list of few profiles, you must know to work on OAF pages.

1) Show Diagnostics option on OAF pages -
    Set profile "FND:Diagnostics"= Yes


2) Display Personalization link on OAF pages -Set  any of profile options
          "Personalize Self-Service Defn"= YES
                          OR
          "Disable Self-Service Personal"=No


3) Display Personalization link for each region -
     Set profile "FND: Personalization Region Link Enabled" =YES

4) Show About this page on OAF Pages - enable any profile option mentioned above in 1 and 2.




Saturday, September 3, 2011

Functional Administrator Responsibility - Advantages

Oracle provides so many features in core ( oracle forms) to ease the application use in real time. Fox example lookups, profiles, functions and menus.
Below lines explain how to do all these without opening oracle forms. Oracle provides Functional Administrator responsibility (self service application) to achieve most of the core features available in oracle forms. Add this responsibility to your user.

Click on Functional Administrator Responsibility –


Lookup – Core services >> Lookups : search for a lookup. Also create a new lookup type here















FND messages – Core Services>>Messages : Search existing messages or create a new message here














Profile Categories – Core Services>>Profile Categories : Search existing profile category or create a new profile category here












Profile  – Core Services>>Profiles : Search existing profile and change values or create a new profiles here



Function – Core Services>>Function : Search existing functions or create a new function here
















Menus – Core Services>>Menus : Search existing menus or create a new menu here















Cache Clear – Core Services>>Caching Framework>>Global Configuration>>







Clear All Statistics or Clear Cache










By adding Functional administrator responsibility, user does not require to open old forms application any more :) while working on self service pages.

Saturday, August 27, 2011

Execute sql script in OAF

// Required import packages
import oracle.apps.fnd.framework.server.OADBTransaction;
import oracle.apps.fnd.framework.webui.OAPageContext;
import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
import oracle.apps.fnd.framework.OAException;
import oracle.apps.fnd.framework.OAApplicationModule;
import oracle.apps.fnd.framework.webui.beans.OAWebBean;   
import oracle.jbo.domain.Number;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
//


try
   {
    Connection conn = paramOAPageContext.getApplicationModule(paramOAWebBean).getOADBTransaction().getJdbcConnection();

    String Query ="SELECT empId resultId,empName resultName,empPosition resultPos from XXXXX_TABLE WHERE DeptId=:1";
                                   
    PreparedStatement stmt = conn.prepareStatement(Query);               

    stmt.setInt(1, departmentId);                                       

                                   
    for (ResultSet resultset = stmt.executeQuery(); resultset.next(); )
    {   
        int employeeId = resultset.getInt("resultId");
        String employeeName  = resultset.getstring("resultName");
        String employeePosition = resultset.getString("resultPos");
    }

    stmt.close();
                                              
   }catch(SQLException sqle)
   {
       throw new OAException("Exception Block"+sqle);
   }

PL/SQL Program unit call from OAF

Writing bigger program logic in controller will be bit complex, To resolve such cases write logic in PL/SQL program units and invoke this from OAF pages.In next lines I am writing the code to call pl/sql in oaf pages.


// Required import packages
import oracle.apps.fnd.framework.server.OADBTransaction;
import oracle.apps.fnd.framework.webui.OAPageContext;
import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
import oracle.apps.fnd.framework.OAException;
import oracle.apps.fnd.framework.OAApplicationModule;
import oracle.apps.fnd.framework.webui.beans.OAWebBean;   
import oracle.jdbc.OracleCallableStatement;
import oracle.jbo.domain.Number;
//

OAApplicationModule localOAApplicationModule = paramOAPageContext.getApplicationModule(paramOAWebBean);
OADBTransaction oadbtransaction =
(OADBTransaction)((OAApplicationModuleImpl)localOAApplicationModule).getDBTransaction();
String callSQLPackage = "begin XXXXX_CUSTOM_PACKAGE.XXXXX_CUSTOM_PROCEDURE(:1,:2,:3,:4,:5);" + " end;";
oraclecallablestatement = (OracleCallableStatement)oadbtransaction.createCallableStatement(callSQLPackage,1);
try
{
      // Set IN Parameters               
      oraclecallablestatement.setString(1,in1Parameter);                               
      oraclecallablestatement.setString(2,in2Parameter);
      
      // Set OUT Parameters
      oraclecallablestatement.registerOutParameter(3,Types.INTEGER);             
      oraclecallablestatement.registerOutParameter(4,Types.INTEGER);             
      oraclecallablestatement.registerOutParameter(5,Types.VARCHAR,0,2000);
                 
      oraclecallablestatement.execute();
 
      // Extract the OUT parameter value
    int out1Param = oraclecallablestatement.getInt(3); 
    int out2Param = oraclecallablestatement.getInt(4);
    String out3Param = oraclecallablestatement.getString(5);
          
 }catch(SQLException sqle)
 {
    throw new OAException("Exception Block"+sqle);
 }

Saturday, August 20, 2011

Import OAF Personalization

OAF provides 2 java program to import any personalization. This is equivalent to FNDLOAD command in oracle apps to handle any LDT Files.These java programs used to import XML and JPX files.

XML Files >> OAF personalization can be retrieve as XML files 
JPX Files >> Substitution definition stored in JPX files. 

Use below command to import OAF personalization -
 
>java oracle.jrad.tools.xml.importer.JPXImporter JpxFileName  DBConnection

>java oracle.jrad.tools.xml.importer.XMLImporter  XmlFileName DBConnection -rootdir CustomPersonalizationFolder -rootPackage StandardPersonalizationFolder


DBConnection 
  -username $APPS_USER -password  $APPS_USER_PASSWORD -dbconnection "(DESCRIPTION= (ADDRESS=(
PROTOCOL=TCP)(Host=$DB_HOST_NAME)(Port=$PORT_NUMBER))(CONNECT_DATA=(SID=$SID)))"

StandardPersonalizationFolder
/oracle/apps/icx/por/approval/webui/customizations/site/0
 
CustomPersonalizationFolde
$JAVA_TOP/xxxxx/oracle/apps/icx/por/approval/webui/customizations/site/0

VO Extention

View Object Exception -
VO extension is very useful, when need to add a new item to a region. Extend the VO and include the respective column in sql statement. Below are the steps need to follow in order to extend any VO.

1) Go to About This page and check the VO name being used for that region
2) FTP to JAVA_TOP to download the VO and dependent files.
3) De compile the class files and generate the source code
4) Create the same file structure in my projects under Jdeveloper folder
5) Create a new View Object in same structure under your custom path
6)  Include the new column in SQL query  and finish
7) Open the project properties and click on BC4J component
8) Select substitution and choose standard view as source and custom extended view as substitute
9) Project_Name.jpx file will be generated in myprojects
10) FTP back new extended view and subsequent class files to correct location on server
11) Also place the server.xml file
12) Run the JPXimporter
13) Go to Application and personalize the region
14) Create new item with viewSource = Standard VO Name and viewAttribute= newly added column name

Example -
Requirement – Introduce a new column in My Requisition Table Region to display the Item number in comma separated concatenated format  This can be achieved by extending underlying VO, Below are the steps.

Write a program unit to get required values. Input parameter must be in existing VO columns.

CREATE OR REPLACE FUNCTION APPS.Sandeep_Test_prog(param IN VARCHAR2)  
 RETURN VARCHAR2 AS

         CURSOR cur_item_desc(p_segment1 IN VARCHAR2) IS
         SELECT NVL(item_description,'Sandeep') item_desc
         FROM po_requisition_lines_all a,po_requisition_headers_all b
         WHERE a.requisition_header_id = b.requisition_header_id
         AND b.segment1=p_segment1;

         CURSOR cur_item_number(p_description IN VARCHAR2) IS
         SELECT DISTINCT NVL(segment1, 'Sandeep') itemNumber
         FROM mtl_system_items_b
         WHERE UPPER (description) = UPPER (p_description);

           p_item_number VARCHAR2 (100) := null;
 
BEGIN
        FOR c1 in cur_item_desc(param)
        LOOP
                   dbms_output.put_line('Outer Loop>>'||c1.item_desc);
                    FOR c2 in cur_item_number(c1.item_desc)
                    LOOP
                               dbms_output.put_line('Inner Loop >>'||c2.itemNumber);
                               IF c2.itemNumber<>'Sandeep' THEN
                                    IF p_item_number IS NULL THEN
                                              p_item_number := p_item_number ||c2.itemNumber ; 
                                    ELSE
                                              p_item_number := p_item_number||','|| c2.itemNumber ;
                                    END IF;
                               ELSE
                                    p_item_number := p_item_number ||',' ;
                               END IF;
                      END LOOP;
             END LOOP;

        RETURN p_item_number;
EXCEPTION
         WHEN OTHERS  THEN
             DBMS_OUTPUT.put_line ('Error');
             RETURN 'Sandeep NULL';
END;

Check the VO name required to be extended.Click on About This Page

VO being used for these beans values is MyReqsGlanceVO

Check the full path in Business Component References Details

oracle.apps.icx.por.reqmgmt.server.MyReqsGlanceVO

 

FTP VO and respective VOImpl and VORowImpl class files. Create a similar package structure in JDev myprojects forlder and place the all files and create a new view object.

Modify the SQL and include custom column

 Some time you may encounter below error message . To avoid it keep sql query as original and press next till last page. Then come back to SQL page and do the your changes and then press next. It won’t come again.

Press next till reach below page and click the checkbox Generate Java file for ViewRowClass and finish.

This will generate VOImpl and VORowImpl java files also. Now open the Project Properties.

Business Components  >> Substitutions >> Available ( Choose the standard VO ) >> Substitute (Pick the extended VO).

If this is new substitution, ADD button will be enabled else UPDATE.

This will generate a OAProject10.jpx and server.xml files. FTP all files at server and run JPX importer to upload the import.

Now Go to Application

Click on Personalize “This Table display a list…..” link

Click create Item icon for Advanced Table

Give the ID Name and Apply – It will create a new column in Advanced Table

Now click new Item icon for TestColumn – It will create a new item for that column. Also create a new item in columnHeader and give a prompt there, to display the column title.

Select the Item style and give the name of item.View Instance hold the name of standard VO and view attribute is custom column name included by us.

Now return to application
New column ColumnHeader holding Item number appears.

Sunday, August 7, 2011

OAF Page Customization

First the basic difference between personalization and customization !
Personalization is oracle provided flexibility to change standard behavior as personal need. using personalization we do not require to write any custom code.while Customization is process to write custom code to fulfill our need.

Below are the 3 basic components of OAF pages.
1) View Object (VO) ,
2) Controler (CO) and
3) Application Module (AM)  , components in  MVC architecture.    

in OAF Customization we need to write custom code for any of the above 3 based on the requirement.

Now checkout the existing CO or AM name (From About this page at the left below of each html page) and download the class file then ftp to your local system.

(assume QuickUpdateCO.java is standard file)

use any decompiler and get the source java code and follow below steps -
1) Rename the standard CO/AM (QuickUpdateCO.java) with custom name XXXXXQuickUpdateCO.java
2) extend the standard CO/AM
3) import the standard package
4) define constructor for the custom program
5) define the package name (location where code resides)

package xxxxx.oracle.apps.pos.supplier.webui;
import oracle.apps.pos,suppliers.webui.QuickUpdateCO.java;
XXXXXQuickUpdateCO.java extends QuickUpdateCO.java;
{
XXXXXQuickUpdateCO{};
ProcessRequest(){
super();
};
ProcessFormRequest{
super();
};


6) Write code in processRequest (if customization need to be invoked on page display) or in processFormRequest (if customization required on any event on the page).
7)FTP the new java code and compile using javac XXXXXQuickUpdateCO.java
8)Place the class file at xxxxx.oracle.apps.pos.supplier.webui (package defined at top of CO)

CO -:
a) Click on personalization link
b) Click on pencil button against page layout property
c) Give the new controller name along with package name at the desired level 
d) Tab out and apply

VO/AM-:
Oracle does not provide option to extend the VO and AM using personalization.Though there is concept of SUBSTITUTION which is being used to extend the standard VO and AM.
You can use JDeveloper to generate the substitution and then import substitution using  jpximport .