oaf training material

106
What is OA Framework ? Before starting about OA Framework, lets try to understand the word ‘Framework : As more and more applications are being developed, new technologies are also evolving at the same time. If we look at our web application from scratch, even state is not maintained for our pages. For example, I want to create a search form. When I click on search/submit button, the criteria fields will not retain their values automatically. Also we use javascript for validations and lots of other things for similar basic functionalities.Now, the solution to these problems is that lots of frameworks are there in which such common functionalities are already done (pre-written) for us. So whether it is Sun or Oracle or Microsoft, the main motive behind creating frameworks is that the attention of developers should only be towards developing the application i.e. the business rule (such as what tax should be deducted from an invoice) and get rid of all other things like ‘request.getParameter’ or ‘making input fields inside an HTML file’. Because these things are not contributing to that part of software development which is directly related to users. By doing this we are not implementing any business rule. The aim here is to do these tasks ASAP so that developers can only concentrate on implementing the business application. One more thing I want to put here is: difference between API & Framework :

Upload: balaji-shinde

Post on 26-Nov-2015

387 views

Category:

Documents


57 download

DESCRIPTION

OAF Training Material

TRANSCRIPT

Page 1: OAF Training Material

What is OA Framework ?Before starting about OA Framework, lets try to understand the

word ‘Framework‘:

As more and more applications are being developed, new technologies

are also evolving at the same time.

If we look at our web application from scratch, even state is not

maintained for our pages. For example, I want to create a search form.

When I click on search/submit button, the criteria fields will not retain

their values automatically. Also we use javascript for validations and

lots of other things for similar basic functionalities.Now, the solution to

these problems is that lots of frameworks are there in which such

common functionalities are already done (pre-written) for us.

So whether it is Sun or Oracle or Microsoft, the main motive behind

creating frameworks is that the attention of developers should only be

towards developing the application i.e. the business rule (such as what

tax should be deducted from an invoice) and get rid of all other things

like ‘request.getParameter’ or ‘making input fields inside an HTML file’.

Because these things are not contributing to that part of software

development which is directly related to users. By doing this we are

not implementing any business rule. The aim here is to do these tasks

ASAP so that developers can only concentrate on implementing the

business application.

One more thing I want to put here is: difference between API &

Framework:

API is a library. At times we instantiate objects of library code

and call their functions.

Framework on the other side is like that there is already some

blocks of code written and we have have to fit our own code

somewhere inside those blocks.

So to fit our code what we do is that sometimes we make our

classes to inherit from other classes, implement the methods what

framework specifies. This is what happens in most of the

frameworks.

Page 2: OAF Training Material

For example we want to make our application on

MVC architecture. So for that we can use Structs (a framework

which provides built in support for MVC). However

this doesn’t provide much support for UI.

JSF is also a framework which provide us a complete model of visual

components, provides event handling tech for web-apps and lots of

other services.Now, I think its easy to define Oracle

Application Framework :)Oracle Application Framework

OAF – Framework developed by Oracle for building and launching web

pages within Oracle E-Business Suite (EBS).

Below is a sample web page of Oracle EBS:

All pages within EBS are almost similar in look and feel. Based on this

fact, below is some common functionality which is already provided by

this framework so that we can mainly concentrate on implementing

business logic:

Built in support for MVC architecture.

Inbuilt support for Apps specific features like flex fields, menus

etc..

Provide classes for all standard components seen on pages like

text fields, buttons, tables etc..

Support for connection pooling and session management.

Built in protection against web hacking.

Personalization – We can change look and feel, layout or visibility

of contents on the standard pages delivered by Oracle. However the

main thing here is that OAF allows somewhat skilled functional user

to apply these changes.

Almost every implementation of EBS has to make some changes

to some of these pages. OAF has mechanism to implement these

Page 3: OAF Training Material

changes in such a way that the changes are not wiped out even

after patches delivered by Oracle are applied.

Since OAF is used only for creating EBS pages, copyright links

and global links are provided by this framework by default.

UIX (User Interface XML) Framework

Oracle EBS uses:

UIX for UI Components (i.e. View part)

BC4J for business components (i.e. Model part)

And what OAF does is the programmatic binding among all

these.

UIX framework is J2EE-based framework for building web applications

and is based on MVC design pattern.

The main focus of UIX is the user presentation layer of an application.

UIX is platform independent as it is implemented in the Java

programming language. UIX development can be declarative, using

uiXML, an XML language for creating UIX pages.

UIX includes a set of UI components and classes for rendering them:

UI Components: These are implemented as Java Beans. They include

page layouts and simple UI objects that map to standard HTML

controls, such as buttons, forms, and checkboxes. There are other

complex components, such as trees, hide-show controls, LOV etc.

Renderers: These are Java classes for rendering the UI components to

target clients/devices. For example, components are rendered as HTML

for use in web browsers or as WML for use in mobile devices.

Classes for UIX Components are in the oracle.cabo.ui package.

uiXML: This is an XML language for programming UIX applications.

uiXML provides a declarative way of creating web applications

Page 4: OAF Training Material

programmatically using UIX Java APIs. The pages, events, and any

other items defined with uiXML elements are all transformed into Java

objects behind the scenes. Below is an example of a uiXML element

(button):

<button destination=”http://www.abc.com/index” disabled=”false”

text=”goBtn”>

</button>

uiXML documents are written in a text format, where document

represents page or a region.

Classes supporting uiXML are located

in oracle.cabo.ui.xml andoracle.cabo.servlet.xml packages.

Pages in UIX

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

On the browser, “page” is just collection of HTML elements. However,

while in developing phase, concept of “page” can be more complex,

depending upon the declarative way used to create the page and

renderers used.

A UIX page consists of a hierarchical set of components known as UI

nodes. Some nodes define visible components, such as buttons,

images, text fields, while others organize the layout and appearance of

other nodes.

Nodes can have parents and children, and multiple nodes together

form a tree-like structure used to represent a page’s logical

structure.For example, left part below figure shows a logical hierarchy

of UI nodes and right part shows the same hierarchy rendered as an

HTML page.

Page 5: OAF Training Material

Now in UIX, there is a java class for each UI nodes. These classes

implement the UINode interface in the oracle.cabo.ui package. The

UINode interface contains methods for the characteristics of nodes,

such as:

public int getIndexedChildCount(RenderingContext context);

public UINode getIndexedChild(RenderingContext context, int

childIndex);

public Enumeration getAttributeNames(RenderingContext context);

public Object getAttributeValue(RenderingContext context,

AttributeKey attrKey);

Oracle Application Framework Training Material

1   OAF ARCHITECTURE

OA Framework is based on the industry-standard J2EE MVC Design Pattern.                   M – Model                  V  - View                  C  - Controller

Developers manipulate the application’s metadata using Oracle 9i JDeveloper OA Extension, while OA Framework uses the most efficient manner to execute the application.

Page 6: OAF Training Material

The MVC architecture is a component-based design pattern with clean interfaces between the Model, View and Controller.

The Model is where the application implements its business logic.

The View is where the application implements its user interface.

The Controller is where the application handles user interaction and directs business flow.

Find the following MVC diagram to understand relationship between Model, View and Controller.

1.1             About Model

The OA Framework Model is implemented using Oracle Business Components for Java (BC4J).

BC4J provides optimized, ready-to-use implementations of the J2EE design patterns.Development teams can focus immediately and only, on writing business logic and user interfaces instead of designing, coding, and debugging handcrafted application “plumbing” code.

1.2             About View

The OA Framework View is implemented using UI XML (UIX).UIX uses XML to describe the components and hierarchy that make up an application page.UIX provides runtime capabilities to translate that metadata into HTML output so that it can be shown on a Browser.

The metadata used to describe the UI is loaded into a database repository, called Meta Data Services (MDS), at deployment time and optionally at design time as well.

1.3             About Controller

User and Application-driven interactions are handled by the OA Controller, which is pure Java Class implementation.

Within the Model-View-Controller architecture, the OA Framework draws a clear distinction between “client” and “server” classes.

Client classes (View and Controller) drive the HTML user interface. Server classes (Model code) can support any client (not just OA

Framework user interfaces)

2.   Key Features

Page 7: OAF Training Material

Integrated Development Environment Durable Personalization’s and Extensions Consistent and Compelling User Interface Object Oriented Reuse

2.1 Integrated Development Environment (IDE)

Oracle 9i JDeveloper with OA Extension is a world-class J2EE-based integrated development environment. Oracle customers and third party consultants have access to the same tools used by Oracle E-Business Suite developers to build complementary applications as well as extend the Oracle E-Business Suite applications.

2.2 Durable Personalizations and Extensions

Personalization is about declaratively tailoring the UI look-and-feel, layout or visibility of page content to suit a business need or a user preference.

Personalization can be done at several levels by one of three authors: Application Developer Application Administrator End User

Examples: Tailoring the color scheme of UI (UI means User Interface) Tailoring the order in which table columns are displayed. Tailoring a query result

Extensibility is about extending the functionality of an application beyond what can be done through personalization.

Examples: Adding new functional flows Extending or overriding existing functional flows Extending or overriding existing business logic

2.3   Consistent and Compelling User Interface

OA Framework offers developers a wide range of user interface components that make the building of applications into a more assembly process, freeing developers from the repetitive composition of common user interface constructs.

Page 8: OAF Training Material

OA Framework user interface components range from simple widgets such as buttons and fields to compound components such as tables-in-tables and hierarchical grids.

2.4   Object Oriented Reuse

OA Framework applications can be abstracted into a series of concentric layers, like an onion.

(Note: Describe the objects mentioned in diagram in the following pages)

Each layer only “knows” about the layers below it. This encapsulation allows reuse at any of the layer boundaries.

On User Interface Side, reusable components can be saved as Shared regions in the MDS repository and reused across several pages.

Example for Shared region is LOV (list of values). It is independent object. We can attach the same LOV to text item in several pages.

3.   OA Framework Essentials

Key JSP Application Components

1)The Browser communicates with the middle tier using HTTP which involves sending a request message to which the middle tier replies with a response message.

2)A JSP is a file with some HTML and JAVA code that executes top to bottom. At runtime, it is compiled into a Java class which is actually a Servlet.

3)A Servlet is a Java web based application server extension program that implements a Standard API.

4)A Servlet Session is a mechanism for maintaining state between HTTP requests during a period of continuous interaction between Browser and Web Application. A Session may be initiated at any time by the application and

Page 9: OAF Training Material

terminated by the application, by the user closing the browser, or by a period of inactivity.A session usually corresponds to an application login/logout cycle.

5)A JavaBean (“Bean” for short) is simply a reusable component that implements specific design patterns to make it easy for programmers and development tools to discover the object’s properties and behavior.

6)Any objects in the middle tier that communicate with the database use a JDBC (Java DataBase Connectivity).

Diagram to understand the above points

4.   Implement the MODEL in OAF

This chapter describes how to implement your model objects in generic terms.

Business Components Packages

All BC4J (Business components for Java) model components must belong to a Business Components Package.

Business logic/data handling (Model) is done using BC4J.

The below objects are BC4J Objects.

1) Entity Object

Entity Objects encapsulate business logic and DML operations for application tables.

Note: Entity objects can also be based on views, synonyms or snapshots.

There is a one-to-one mapping between a table and an entity object, and all Oracle Applications entity objects should include all columns in their associated tables.

Entity objects use a declarative mapping between their attributes and underlying database columns to automatically implement queries, inserts, updates and deletes.

Two files will be created automatically after creating Entity Object(EO).

They are    i) EmployeeEO.xml    ii) EmployeeEOImpl.java

“EmployeeEO” is name of the Entity Object (EO).

Page 10: OAF Training Material

The below methods are available under .java file (EmployeeEOImpl.java)We can write business logic in EO at entity level to meet business requirements (Example: validateStartDate ()) Methods under Entity Object:-

create()  [Add attribute defaulting logic in this method] remove()[Add entity remove logic in this method] set methods [sets value as the attribute value]

    (Example: setEmployeeId, setFirstName etc) get methods [gets the attribute value, using alias name]

    (Example: getEmployeeId, getFirstName etc) validateEntity()

Entity Object (EO) should have following attributes: CreationDate CreatedBy LastUpdateDate LastUpdatedBy LastUpdateLogin

2) View Objects

Encapsulates a database query Provide iteration over the query result set Primarily based on Eos (Entity Objects) May be based on plain SQL for certain types of tasks May be based on multiple entity objects if the UI is for update Provide single point of contact for getting and setting entity object

values May be linked together by view links

    Two files will be created after creating View Object (VO)    They are 1) .java (Row level)    2) .java (Object level)        3) .xml file    Example: i) EmployeeNamesVO.xml                    ii) EmployeeNamesVOImpl.java                   iii) EmployeeNamesVORowImpl.java  

     We will write code in .java files.

    3) Association Objects   

Page 11: OAF Training Material

Association object is used to create relationship between Entity   objects. There are two types of associations are given below.1)      Composition   (Strong association)2)      Reference      (Weak association)

Composition: -   The destination entity object can not exist independent of its source entity                               object. Example: A purchase order header is automatically locked even if you make changes only to its lines. Child is deleted when parent is deleted.

Reference: - The source entity object simply references the destination object.

Example: A purchase order header references a supplier, but the supplier can still exist regardless of whether a purchase order references it or not.    

4) Application Modules

o Application Module serves as container for ViewObjects and ViewLinks

o Application Module establishes database connection.o Attach the Application Module to OA Framework page.

5.   Implement the VIEW in OAF

The VIEW formats and presents model data to user.

We have to define OAF page to display data.

At development time, you specify the bean hierarchy for every page using the JDeveloper tool.

OAF page comprised of regions and items.

Items are simple widgets like buttons, images, fields and so on which contain no children.

Regions are container objects that hold items and other regions. Regions include header, table and layout components.

Each region and item that you define has a style property that tells the OA Framework what web bean object to instantiate for it at runtime.  For example, if you define a region whose style property is "table," the OA Framework will instantiate an oracle.apps.fnd.framework.webui.beans.table.OATableBean

Page 12: OAF Training Material

All pages must have a single top-level region whose style is “PageLayout”. Regions and Items appear in JDeveloper page tree in sequence that tells Framework where to add these objects to runtime bean hierarchy.

6.   Implement the CONTROLLER in OAF

CONTROLLER is used to enhance OA Framework page using logic for buttons, automatic queries, dynamic WHERE clauses, JSP forwards, and the Message Dictionary.

Controllers for regions

ü  processRequest method (code for page initialization such as HTTP GET actions and so on)ü  processFormRequest method (code for HTTP POST actions. When press the button the code will be executed)

Typical Locations for Code

We could not call methods of Entity Objects (EO) from Controller directly. We have to follow below order to call method from location to other location.

1)      Call methods of ApplicationModule from Controller only2)      Call methods of ViewObject from ApplicationModule only3)      Call methods of EntityObject from ViewObject only4)      EntityObject is based on Database table

   Note:  Please look ONION structure to understand above points.

7.     OAF Key Do's and Don'ts (Part 1) - "Top 10" Golden Rules

I don't know how many of you have come across this in the OAF Devguide, it was only by change that I found it, thought I'd share:

There's a lot to learn when getting started with the OA Framework, but the following list of rules are so universal -- and so fundamental -- they should be familiar to anyone who's doing Framework development.

1) ALWAYS try to declaratively define your UI. Resort to a programmatic layout only if the UI cannot be implemented declaratively. Programmatic layouts are difficult to customize (they don't leverage the Personalization Framework) and may diverge from the UI Guidelines over time.

2) NEVER change your UI layout properties in processFormRequest(). ALWAYS make changes in processRequest(), even if that means handling an event in processFormRequest() and then redirecting back to the same page. This

Page 13: OAF Training Material

ensures that the web bean hierarchy is in a stable state when the page renders.

3) NEVER use index numbers to find beans when you want to change their properties. ALWAYS search by name. Index numbers can change during processing.

4) NEVER change the properties of a parent bean from a child bean. This is a poor design practice that hampers reuse while introducing fragile code (particularly if the child code executes too late in the page rendering cycle to properly affect the parent).

5) NEVER instantiate Beans using "new OA Bean()". ALWAYS use the createWebBean() factory methods available on the OAControllerImpl class. Not all Bean properties are initialized correctly when you use "new."

6) NEVER create Form Beans in code (this means NEVER add nested Form beans to a page; your Page Layout region should be the only form region). Multiple form Beans on a page are not supported and can result in strange runtime behaviors.

7) NEVER count on your Application Module using the same database connection in subsequent requests. For example, NEVER post and commit in separate requests. For performance reasons, the Framework will start pooling and reusing connections in 5.7 instead of holding onto a single connection throughout the life of an Application Module.

8) NEVER use JDBC directly unless you're calling a PL/SQL routine (you should use a view object instead, and if possible, the view object should be defined declaratively and not programmatically).

9) NEVER add member variables UNLESS THEY ARE TRANSIENT OR FINAL to view objects, Controllers, entity object, view rows and Application Modules.

10) ALWAYS adhere to the Self-Service Performance Guidelines

8.            Create Simple OAF WELCOME PageStep 1: Open JDeveloper tool, Create New OAworkspace.

Navigation: - right click on Workspaces option in system-navigator Window and select New OAWorkspace

Step 2: i) Enter workspace name in file name column as                “XXXOAWorkspace.jws”, and press OK button.           ii) Press Next button           iii) Enter project Name in file name column as “XXXOAProject.jpr”           iv) Enter Default package name as                 “xxx.oracle.apps.ak.welcome.webui” and press Next button twice.

Page 14: OAF Training Material

We can see the package structure (train.oracle.apps.ak.welcome.webui) in “myprojects” folder. The package structure is used to place EO, VO, AM and Pages.

Step 3: Enter .dbc file location in DBC File Name column           [Location:              E:\p4045639_11i_GENERIC\jdevhome\jdev\myhtml\OA_HTML\Secure\ xxxxx.dbc]

Note: If you do not have .dbc file, then import the .dbc file from server ($ cd %APPL_TOP/fnd/11.5.0/secure/.dbc) and place in above path in your local system.

Enter User Name: operations5 (oracle application user name)Enter Password  :    xxxxxxxxx      

Application Short Name: AKResponsibility Key        : FWK_TBX_TUTORIAL

Press Finish button.

Now, creation of OAWorkspace, OAProject and front-end connections successfully completed.

Step 4: Create new OA page            Select project name (xxxOAProject) and click right mouse button, then select New              option. 

New window will be opened, and then select “WebTier” under “categories” list. Select “OA Components” option under “Web Tier” and select “Page” right side.

Press OK Button.

Step 5: Enter page name as “XXXWelcomePG” in Name field.                       You can change the package name if you want otherwise leave it as it is because the                          package is already created at the time of workspace creation.

Press OK button, then page web bean (WelcomePG.xml) will be created.         

     Now, we will run the .xml (WelcomePG.xml) to render the OAF page on the Browser.        In above diagram, there is “region1” called root region. It is container, consists items

Page 15: OAF Training Material

        and other regions.

Set the properties for root region (region1) in property inspector window.

    Property Name             Value          ID     MainRN       Region Style      PageLayout       Window Title     Welcome Window       Title     Welcome Page       AM Definition oracle.apps.fnd.framework.server.OAApplicationModul

eNote: we are not yet creating Application Module. So, this           application module is using which is default.

Step 6: Create subregion (style: messagecomponentlayout) under the Pagelayout region.

            Select “MainRN” and click right mouse button, select “region” Option and set the            below properties.                    Property Name     Value           ID      SubRN        Region Style         Messagecomponentlayout

Step 7: Create item under “SubRN”                       Select the region “SubRN” and click right mouse button, and then select the option             “messageTextInput” and set the below properties.

    Property Name     Value           ID      WelcomeTxt        Region Style         messageTextInput        Prompt      Enter Your Name        Additional Text      Enter any string to display it

     on the page   (It is like Tooltip text)

See below screen shot to select “messageTextInput”.           

Save the project and compile the page (WelcomePG.xml)

Steps to compile the WelcomePG.xml

Ø  Select the .xml (WelcomePG.xml) and click right mouse button.

Page 16: OAF Training Material

Ø  Select “Make WelcomePG.xml” option, and verify the errors on log messages tool box (see bottom) if occurred.

Step 8: Run the OAF Page (WelcomePG)            Select the page (WelcomePG.xml) and click right mouse button, then select “Run             WelcomePG.xml” option. (See above screenshot for your reference)

See the below OAF page screenshot and verify the window title, page title and text item prompt with above properties.

In this stage, there is no control on the OAF page. We have to create CONTROLLER on the root region and write the code to control the OAF page.

8.                 Practical Problems and Solutions

          Display the message as “Welcome <text item value>” on the OAF                                       page when you press the “Go” button

               Step 1: Create button item under the sub region “SubRN”.                    Select the region “SubRN” and click right mouse button, select the option                     “messagelayout” (is used to place the buttons).    

    Property Name     Value           ID     ButtonLayout

      Step 2: Create button item under the “ButtonLayout”.

                  Select the region “ButtonLayout” and click right mouse button, and select the                        Option “item”.

  Set the Button item properties.    Property Name     Value           ID     Go         Item Style    submitButton         Prompt     Go        Additional Text    Click the button

Step 3: Create Controller.             Select the “MainRN” region and click right mouse button, and then choose the option             “Set New Controller”.

Page 17: OAF Training Material

Enter Controller Name: WelcomeCO and press the OK button.

After press the OK button, one .java file will be created with “Controller” name as WelcomeCO.javaSee below screenshot:-

See below screenshot once and observe the methods “processRequest” and “processFormRequest” in the Java file (WelcomeCO.java).

When press the “Go” button, the button related code will be executed from “processFormRequest” method (like Java POST method).

The “processRequest” code will be executed at the time of initializing the page.

Logic to display the message “Welcome <value of text item> on OAF page.  Add below code in the method “processFormRequest”.

Code:if (pageContext.getParameter("Go")!=null)    {    String str=pageContext.getParameter("WelcomeTxt");    String message="Welcome "+str;    throw new OAException(message,OAException.INFORMATION);    }

In above code, “Go” is button name (not prompt) which is used in “if” condition. “WelcomeTxt” is also text item id (not prompt).

When user press the “Go” button, the browser will send the request to middle tier and after processing the middle tier responds to browser.

The OAException class is used to display the message on the OAF page. The second parameter is exception type “INFORMATION”.

There are some more exception types available. They are:1)      CONFIRMATION2)      WARNING3)      ERROR4)      SEVERE

Note: The exception types “ERROR” and” SEVERE” terminate the program.

         The exception types “INFORMATION”, “CONFIRMATION” and “WARNING” are           continue the execution of the program.

Now, run the page “WelcomePG.xml” and see output like below.

Page 18: OAF Training Material

Output:  Enter the text “OAF students” in text item and press the “Go” button, then display the message on “MainRN” (Root region).

            Message: WELCOME OAF students                             (Exception type: INFORMATION)

          Product Branding:

The “productBranding” is used to place image beside corporate branding image “ORACLE”.

Select “pageLayout components” and click right mouse button, and select the productBranding option.

Set the below properties for productBranding item    Property Name     Value           ID     Item1 (as you like)         Item Style    Image         ImageURI /OA_MEDIA/FNDTAPPBRAND.gif        Additional Text    Click the button

Set the system profile “FND: Branding Size” as “Medium” at site level.

If you change menus or profile values etc, then we have to terminate the OAF page. Navigation: RUN->Terminate->Embedded OC4J Server (Menu bar)Compile and run the OAF page (.xml), check the output from below screenshot.

In above screenshot, “Tutorial Application” image is productBranding image.

          In-Context Branding:

The in-context branding includes corporate branding and product branding images. Additionally, contextual information renders below corporate and product branding images.

Select “pageLayout Components” region and click right mouse button, then select the “InContextBranding” option.

Note:  productBranding can contain only “formattedText” because “In-ContextBranding” is present.

Page 19: OAF Training Material

Set the properties for “productBranding” item style as “formattedText” and enter Text property as “Sales Online”.

Set the properties for inContextBranding item.

    Property Name     Value           ID     Item2 (as you like)         Item Style    formattedText         Text Customer SUN MicroSystems-Menlo

Park

We can use html tags to change font styles or display font in bold etc.

Example: Customer <b> SUN MicroSystems-Menlo Park</b>

Output:

          How do display default string in Text Item when page is rendered

Code:OAMessageTextInputBean fieldHelloTxt=     (OAMessageTextInputBean)webBean.findChildRecursive(“WelcomeTxt”);

fieldHelloTxt.setText(pageContext, “welcome to OAF students”);

Where “WelcomeTxt” is a Text Item ID. Write above code in “processRequest” method of CONTROLLER.

Important Note:We have to import the class “OAMessageTextInputBean”.ü  import oracle.apps.fnd.framework.webui.beans.message.OAMessageTextInputBean;ü  import oracle.apps.fnd.framework.webui.beans.OAWebBean; 

          How do hide Text item at runtime

Code:The Method “setRendered” is used to hide the text item. Pass the value “false” for this method.

import oracle.apps.fnd.framework.webui.beans.message.                                                             OAMessageTextInpuBean;import oracle.apps.fnd.framework.webui.beans.OAWebBean;

Page 20: OAF Training Material

OAMessageTextInputBean hellotxt= (OAMessageTextInputBean)webBean.findChildRecursive(“WelcomeTxt”);

Hellotxt.setRendered(false);

Write above code in processRequest Method or processFormRequest of CONTROLLER according to condition.

Like setRendered method, there are so many methods are available in text item Bean.

The method “setReadonly (true)” is used to convert the item to read-only.

          How do disable the button at runtime

Code:We have to use “OASubmitButtonBean” to change behavior of buttons at runtime.

import oracle.apps.fnd.framework.webui.beans.form.OASubmitButtonBean;

OASubmitButtonBean goButton = (OASubmitButtonBean)webBean.findChildRecursive("Go");     goButton.setDisabled(true);

          How do display message in different colour problem

Code:We can do it by using “rawText” style (Item property under MainRN). In “Text” property, we can use html tags. (Display message in red color)<b><i><font color="red"> Hello World Page</font></i></b>

Dynamically, display the rawText by using OARawTextBean

OARawTextBean rawtxt = (OARawTextBean)webBean.findChildRecursive("item3");

rawtxt.setText("Inventory Details are Transferred");

rawtxt.setText ("<b><i><font color= red> Inventory Details are Transferred</font></i></b>");

Display the message in red color. See below screenshot.

          How do call the specified page from another page

Page 21: OAF Training Material

I have two pages. One page is security page, if user enters the login details correct then open the other specific page.

Solution:The API pageContext.SetForwardURL is used to open the other specific page.

Design the security page with two text items and one button like below screen shot.

(Note: This is not related to database. Just check the user name and password with static text like username=Venky and password=Venky)

Code:(Write in Controller – processFormRequest Method)if (uname.equals("Venky")&&pwd.equals("Venky"))    {      pageContext.setForwardURL("OA.jsp?page=/train/oracle/apps/ak/welcome/webui/WelcomePG",                                 null,                                 OAWebBeanConstants.KEEP_MENU_CONTEXT,                                 null,                                 null,                                 true,                                OWebBeanConstants.ADD_BREAD_CRUMB_YES,                                OAWebBeanConstants.IGNORE_MESSAGES);    }

Enter user name and password correct, and then press “Go” button.Note: Set text item property “secret” as True when enter password. User could not see the password while entering.The below page “WelcomePG” will be opened.

          How do display the Return Navigation link on the page

Suppose, if user call second page from first page and perform some actions on the second page. Later, the user wants to go back to first page, then we have to use “Return Navigation” link.

Select the region “pageLayoutRN” and click right mouse button, and then select the option “returnNavigation”.

Set the properties for “returnNavigation” item.    Property Name

    Value

           ID     returnLink

Page 22: OAF Training Material

         Item Style

     link

      Destination URI

  OA.jsp?page=/train/oracle/apps/ak/security/webui/SecurityPG&retainAM=Y

        Text Return to Security Page

Output for returnNavigation link (Return to Security Page):-

See the below screenshot.

When user presses the “Return to Security Page” link, then the security page will be opened.

          How do add a returnLink dynamically

Code:-

processRequest(OAPageContext pageContext, OAWebBean webBean){super.processRequest(pageContext, webBean);OALinkBean returnLink =(OALinkBean)createWebBean(pageContext, OAWebBeanConstants.LINK_BEAN, null,"returnLink");returnLink.setDestination("OA.jsp?page=/oracle/apps/dem/employee/webui/EmpSearchPG&retainAM=Y");// Retrieve and set the translated link text.String linkText = pageContext.getMessage("AK","FWK_TBX_T_RETURN_TO_POS", null);returnLink.setText(linkText);

// Add the return link to the page.

((OAPageLayoutBean)webBean).setReturnNavigation(returnLink);

}

Following problems are related to work on Database data

          Connect to Database and return number of suppliers on the page

import oracle.apps.fnd.framework.webui.OAWebBeanConstants;import oracle.apps.fnd.framework.server.OADBTransaction;

Page 23: OAF Training Material

import java.sql.*;Write below code in process request() method or anywhere as per requirement.oracle.apps.fnd.framework.OAApplicationModule am = pageContext.getApplicationModule(webBean);

String task2Info = null;  PreparedStatement psProType = null;ResultSet rsProType = null;int task2Type = 0;Connection conn = am.getOADBTransaction().getJdbcConnection();

task2Info = "SELECT COUNT(*) FROM FWK_TBX_SUPPLIERS";

try{          psProType = conn.prepareStatement(task2Info);          rsProType = psProType.executeQuery();          if (rsProType.next())          {            task2Type = rsProType.getInt(1);          }          } catch(Exception e) {pageContext.writeDiagnostics(am,e.getMessage(),4);}

throw new OAException(“supplier count :”+task2Type, OAException.INFORMATION);

See below screen shot for output.

          How do call stored procedure from OAF page (Without using EO, VO)

Code:Place the button “Callable” and write above code in processFormRequest method

import java.sql.Connection;import oracle.jdbc.OracleCallableStatement;

if (pageContext.getParameter("Callable")!=null)    {    try    {      String deleteStmt = "BEGIN DELETE_RECORD( " +                                      "PARAM1 => :1); END; ";      OADBTransaction trxn = am.getOADBTransaction();          CallableStatement delproc =                         trxn. createCallableStatement(deleteStmt,1) ;      // Rebind parameters

Page 24: OAF Training Material

    delproc.setString(1,"rahul");    delproc.executeUpdate();    } catch(Exception sqle)    {       pageContext.writeDiagnostics(am, sqle.getMessage(), 4);    }                 //CallableStatement deleteSt=conn.prepareCall(deleteStmt);    }

First, create stored procedure “DELETE_RECORD”.

CREATE OR REPLACE PROCEDURE DELETE_RECORD(param1 VARCHAR2)ASBEGIN  DELETE FROM emp WHERE ename=param1;  COMMIT;END delete_record;

          Display message by using AOL Message Name (Message Dictionary)

Solution: we can display message by using “putDialogMessage” Method.Code:import oracle.apps.fnd.framework.webui.OADialogPage;import oracle.apps.fnd.common.MessageToken;

MessageToken[] tokens = {new MessageToken("EMP_NAME", “rahul”)};  // rahul is employee name      OAException message = new OAException("AK",         "FWK_TBX_T_EMP_DELETE_CONFIRM", tokens, OAException.CONFIRMATION, null);      pageContext.putDialogMessage(message);    --display message.      See below screenshot

« FWK_TBX_T_EMP_DELETE_CONFIRM » is message name in AOL.

          How do call D2K Form from OAF page

Syntax:form:responsibilityApplicationShortName:responsibilityKey:securityGroupKey:functionName

Code:

Page 25: OAF Training Material

pageContext.forwardImmediatelyToForm("form:PO:PURCHASING_OPERATIONS:STANDARD:PO_POXPOEPO");

Result:Write above code in controller for button. Opens the PO Form when click the button.

Easy Steps for Search Page

Simple Search Page in OAF

Here is a simple search page where user can perform search operation

on the basis of employee number and employee name on employee

table.

1) Create a new OA workspace (xxcus) and a new project under

this (xxcus).

2) Create a new OA page:

Right click on project (xxcus) –> New –> Web Tier –> OA Components

–> select ‘Page’ item. Click OK. (This will open a popup window)

We are creating a employee search page, so specify the details of

page as below:

          Name: XxEmployeeSearchPG

          Package: xxcus.oracle.apps.fnd.emprec.webui

3) Create a new view object (VO):

Right click –> New View Object (This will open a wizard having 7

steps).

Step 1

Package: xxcus.oracle.apps.fnd.emprec.server

Name: XxEmployeeSearchVO

Page 26: OAF Training Material

Choose the radio button ‘Read-only Access’ (as we are not performing

any DML operation). Click Next.

Step 2

Enter the below query in ‘Query Statement’:

SELECT empno, ename, job, mgr, hiredate, sal, deptno FROM employee

Keep defaults for step3, 4, 5, 6

Step 7

Select check boxes for ‘Generate Java File’ for both ‘View Object Class’

and ‘View Row Class’. Click Finish.

4) Create a new Application Module (AM):

Step 1

Package: xxcus.oracle.apps.fnd.emprec.server

Name: XxEmployeeAM. Click Next.

Step 2

Here we will add an instance of the VO created in (3). Select

XxEmployeeSearchVO from ‘Available View Objects’ and shuttle it to

‘Data Model’ using > button.

Keep defaults for all other steps (3, 4). Click Finish.

5) Create a new Controller class :

Step 1

Select XxEmployeeSearchPG in navigator tab. Declarative form of page

will be visible in structure tab.

Page 27: OAF Training Material

Step 2

Right click on pageLayout region –> set new controller (This will open a

popup window). Enter the below details:

package Name: xxcus.oracle.apps.fnd.emprec.webui

Class Name: XxEmployeeSearchCO

Creating the Page Layout & Setting its Properties

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

Page will appear as below:

1) Create a new region under pageLayout of type defaultSingleColumn.

2) Create 3 items under defaultSingleColumn region

(messageTextInput, messageTextInput, submitButton).

3) Create another item under pageLayout of type ‘spacer’.

Now change the properties for each field from property inspector as

shown below:

pageLayout:

     ID: pageLayoutRN

     AM Definition: xxcus.oracle.apps.fnd.emprec.server.XxEmployeeAM

     Window Title: Employee Search Page

     Title: Employee Search

Page 28: OAF Training Material

 

defaultSingleColumn: ID: singleColRN

messageTextInput (for emp number):

ID: empNum

Prompt: Employee Number

messageTextInput (for emp name):

ID: EmpName

Prompt: Employee Name

submitButton:  ID: goBtn, Prompt: Go

spacer:  ID: spcr, Height: 20

4) Again create a region under pageLayout. However this time,

choose ‘Region Using Wizard’.

Step 1

select ‘XxEmployeeAM’ from Application Module drop down and select

‘XxEmployeeSearchVO1′ in available view usages. Click Next.

Step 2

choose region style as ‘table’ from drop down. Click Next.

Step 3

shuttle all the fields from available to selected attributes. Click Next.

Step 4

Change the style to messageStyledText for each row. Also modify the

prompt to make it more user friendly (like empName to Employee

Name).

Page 29: OAF Training Material

The declarative page structure in jDev will be similar to as shown

below:

Code for Performing the Search Operation

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

User will enter search criteria (emp num or name) and click on

‘Go’ button.

We catch this button press in PFR method of controller.

Get the criteria fields and pass those to AM where we define a

method to perform search.

Write the below code in PFR method of controller:

Page 30: OAF Training Material

view plain copy to clipboard print ?

1. public void processFormRequest(OAPageContext pageContext,  2.                                    OAWebBean webBean) {   3.     super.processFormRequest(pageContext, webBean);   4.   5.     OAApplicationModule am = pageContext.getRootApplication

Module();   6.   7.     if (pageContext.getParameter("goBtn") != null) {   8.   9.         if ((!

("".equals(pageContext.getParameter("empNum").trim()))) ||  10.             (!

("".equals(pageContext.getParameter("EmpName").trim())))) { 11.             String empNum = pageContext.getParameter("

empNum");   12.             String empName = pageContext.getParameter(

"EmpName");   13.             if (("".equals(pageContext.getParameter("e

mpNum").trim()))) {   14.                 empNum = null;   15.             }   16.   17.             Serializable[] param = { empNum, empName }

;   18.             am.invokeMethod("searchEmployee", param); 19.         } else {   20.             throw new OAException("Please Enter Search 

Criteria.",    21.                                   OAException.ERROR); 22.         }   23.     }   24. }  

Below is code for searchEmployee method in XxEmployeeAMImpl.java :

view plain copy to clipboard print ?

1. public void searchEmployee(String empNum, String empName) { 2.     try {   3.   XxEmployeeSearchVOImpl vo = getXxEmployeeSearchVO1();   4.   vo.setMaxFetchSize(-1);   5.   vo.setWhereClause(null);   6.   vo.setWhereClauseParams(null);   7.   vo.setWhereClause("EMPNO = nvl(" + empNum + ",EMPNO)" +  8.             "AND UPPER(ENAME) like UPPER('%" + empName + "%

')");   9.   System.out.println("search query - " + vo.getQuery());   10.   vo.executeQuery();   

Page 31: OAF Training Material

11.   12.  } catch(Exception e) {   13.   e.printStackTrace();   14.  }   15. }  

Create OAF Search Page 1. Create a New Workspace and Project

Right click Workspaces and click create new OAworkspace and name it as PRajkumarSearch. Automatically a new OA Project is also created. Name the project as SearchDemo and package as prajkumar.oracle.apps.fnd.searchdemo

 

2. Create a New Application Module (AM)

Right Click on SearchDemo > New > ADF Business Components > Application Module

Name -- SearchAM

Package -- prajkumar.oracle.apps.fnd.searchdemo.server

 

3. Enable Passivation for the Root UI Application Module (AM)

Right Click on SearchAM > Edit SearchAM > Custom Properties >

Name – RETENTION_LEVEL

Value – MANAGE_STATE

Click add > Apply > OK

 

Page 32: OAF Training Material

4. Create Test Table and insert data some data in it (For Testing Purpose)

CREATE TABLE xx_search_demo (    -- --------------------      -- Data Columns      -- --------------------      column1                  VARCHAR2(100),      column2                  VARCHAR2(100),      -- --------------------      -- Who Columns      -- --------------------      last_update_date    DATE         NOT NULL,      last_updated_by     NUMBER   NOT NULL,      creation_date          DATE         NOT NULL,      created_by               NUMBER   NOT NULL,      last_update_login    NUMBER );

INSERT INTO xx_search_demo VALUES (‘val1’, ’val2’, SYSDATE, 0, SYSDATE, 0, 0); INSERT INTO xx_search_demo VALUES (‘val1’, ’val2’, SYSDATE, 0, SYSDATE, 0, 0); INSERT INTO xx_search_demo VALUES (‘val3’, ’val4’, SYSDATE, 0, SYSDATE, 0, 0); INSERT INTO xx_search_demo VALUES (‘val5’, ’val6’, SYSDATE, 0, SYSDATE, 0, 0);

Now we have 4 records in our custom table

 

5. Create a New Entity Object (EO)

Right click on SearchDemo > New > ADF Business Components > Entity Object

Name – SearchEO

Package -- prajkumar.oracle.apps.fnd.searchdemo.schema.server

Database Objects -- XX_SEARCH_DEMO

 

Note – By default ROWID will be the primary key if we will not make any column to be primary key Check the Accessors, Create Method, Validation Method and Remove Method

Page 33: OAF Training Material

 

6. Create a New View Object (VO)

Right click on SearchDemo > New > ADF Business Components > View Object

Name -- SearchVO

Package -- prajkumar.oracle.apps.fnd.searchdemo.server

In Step2 in Entity Page select SearchEO and shuttle them to selected list

In Step3 in Attributes Window select columns Column1, Column2 and shuttle them to selected list

In Java page Select Generate Java file for View Object Class: SearchVOImpl and Generate Java File for View Row Class: SearchVORowImpl

 

7. Add Your View Object to Root UI Application Module

Select Right click on SearchAM > Edit SearchAM > Data Model >

Select SearchVO and shuttle to Data Model list

 

8. Create a New Page

Right click on SearchDemo > New > Web Tier > OA Components > Page

Name -- SearchPG

Package -- prajkumar.oracle.apps.fnd.searchdemo.webui

 

9. Select the SearchPG and go to the strcuture pane where a default region has been created

 

10. Select region1 and set the following properties:

ID -- PageLayoutRN

Page 34: OAF Training Material

Region Style -- PageLayout

AM Definition -- prajkumar.oracle.apps.fnd.searchdemo.server.SearchAM

Window Title -- Search Page Window

Title -- Search Page

Auto Footer -- True

 

11. Add a Query Bean to Your Page

Right click on PageLayoutRN > New > Region

Select new region region1 and set following properties

ID – QueryRN

Region Style – query

Construction Mode – resultBasedSearch

Include Simple Panel – True

Include Views Panel – True

Include Advanced Panel – True

 

12. Add a Result Data Table to your QueryRN

Select QueryRN right click > New > Region using Wizard

In BC4J Objects page, Select your SearchAM and then select your SearchVO1

 

Note – DO NOT select Use this as Application Module Definition for this region checkbox

 

In Region Properties page, set Region ID value to ResultsTable and Region Style to table

Page 35: OAF Training Material

In view Attributes page, select attributes from Available View Attributes list and shuttle them to

Selected View Atributes list:

Column1

Column2

In Region Items Page, you can set ID, Style and Attributes Set. Currently we are going to set only Style as messageStyledText

 

13. Set and verify Your Results Table Region Properties

ID – ResultsTable

Region Style – table

AM – Please Donot put any AM

Rendered – True

Records Displayed – 10

Width – 100%

User Personalization – True

 

14. Set or Verify Column1 Item Properties

Search Allowed -- True

Sort Allowed – ascending

Initial Sort Seqence – first

Selective Search Criteria – True

User Personalization – True

 

15. Set or Verify Column2 Item Properties

Page 36: OAF Training Material

Search Allowed – True

Sort Allowed -- ascending

Selective Search Criteria – True

User Personalization – True

 

16. Congratulation you have successfully finished Search page. Run Your SearchPG page and Test Your Work

 

 

Page 37: OAF Training Material

          Implement a Search Page

1)      Create project2)      Create Business Component Package “train.oracle.apps.ak.empsearch.server”3)      Create Entity object (EO) under the above package.4)      Create Application Module (AM) under the package “train.oracle.apps.ak.empsearch.server”Application Module Name: EmployeeAM5)      Create an Employee-to-Manager Association (AO) for the self- join condition on the “FWK_TBX_EMPLOYEE” table.

6)      Select “Manager Id” in source table and Select “EmployeeId” in Destination table.7)    Click “Add” buttonClick “Next” button and verify “Expose Accessor” names.Create ViewObject (VO) to display the data on the page. Here, VO is based on EO.Select “EmpSearchEO” object twice. There are two entity objects and linked the two Eos through Association Object (AO).

Page 38: OAF Training Material

10) Select Next button, and select attributes from EmpSearchEO and EmpSearchEO1.11)Select below columns from EmpSearchEO and EmpSearchEO1.o   EmployeeIdo   FullNameo   EmailAddress12)  Changes attribute name and alias as meaningful. 

Select Attribute Attribute Name and Alias NameEmployeeId1 ManagerId and MANAGER_IDFullName EmployeeName and EMPLOYEE_NAMEFullName1 ManagerName and MANAGER_NAMEEmailAddress EmployeeEmail and EMPLOYEE_EMAILEmailAddress1 ManagerEmail  and  MANAGER_EMAIL

Select Next button, and observer Query. We can change query, if you select the check box “Expert Mode”.

13) Now, I want to include some other condition in the above query.

QUERY:

SELECT EmpSearchEO.EMPLOYEE_ID,        EmpSearchEO.FULL_NAME AS EMPLOYEE_NAME,        EmpSearchEO.EMAIL_ADDRESS AS EMPLOYEE_EMAIL,        EmpSearchEO1.EMPLOYEE_ID AS MANAGER_ID,        EmpSearchEO1.FULL_NAME AS MANAGER_NAME,        EmpSearchEO1.EMAIL_ADDRESS AS MANAGER_EMAIL,       Flkp.meaning POSITION_DISPLAYFROM FWK_TBX_EMPLOYEES EmpSearchEO,          FWK_TBX_EMPLOYEES EmpSearchEO1,         FWK_TBX_LOOKUP_CODES_VL flkpWHERE EmpSearchEO.MANAGER_ID = EmpSearchEO1.EMPLOYEE_ID(+)AND EmpSearchEO.POSITION_CODE=flkp.lookup_codeAND flkp.lookup_type=’FWK_TBX_POSITIONS’

Select Next button, and check mapping between Query Columns and Attribute names. Select Finish button.

14) Add the ViewObject (EmployeeSummaryVO) to Application Module.

15) Select the application module (already created), and press right  mouse button and select the option “Edit EmpSearchAM”, then select the “ViewObject”.

16) Attach the Application Module (EmpSearchAM) to your OApage.  17) Create the item under “PageLayout Region”. The item style is “StaticStyledText”.       Set the below properties for the item.

Page 39: OAF Training Material

  Property   Value  ID PageHelp  Item Style StaticStyledText  DataType Varchar2  CSS Class   OraInstructionText  Message Appl Short Name   AK  Message Name   FWK_TBX_T_PAGE_GENERALTest the page once and check the output on the page. Some text will be displayed on the page above.

Configure RESULT-BASED Search.18) Create region with style “query” under pageLayout Region.   Set the below properties for the region “queryRN”.  Property   Value  ID queryRN  Item Style Query  Construction Mode   Result Based Search  Include simple panel   True  Include View panel   True    Include Advanced search panel   True

19) Adds a Results Data table to queryRN.      Select the queryRn and press right mouse button, then select option “Region using        Wizard”.20) Select the viewobject “EmployeeSummaryVO” and select specified columns what you         want to display on the OAPage.     21) Set below properties for “ResultsTable”.  22) Set the properties for columns under “ResultsTable”.     

          How do display the drill down to details page according to criteria.

Steps:-

1)    Create view object with SQL query.

The query is:

SELECT EmployeeId AS EMPLOYEE_ID,            EmployeeName AS EMPLOYEE_NAME,            Job AS JOB,            Salary AS SALARY,            Deptno AS DEPARTMENT_NUMFROM EMP

Page 40: OAF Training Material

            2)    Select the items style as “MessageStyledText”.3)    Design the page with regions “pageLayout (root region)” and “defaultSingleColumn (Sub region)”.4)    We can use “region using wizard” option under the region style “defaultSingleColumn” and then select displayed items by using the wizard.5)    The page name is “EmployeeDetailsPG.xml”.6)    Now, we have to call the “EmployeeDetailsPG” page and pass parameters to this page from the other page (search page).7)    Set the property “Destination URI” as “OA.jsp?page=\train\oracle\apps\ak\employee\webui\EmployeeDetailsPG&employeeNumber={@EmployeeId}&retainAM=Y&ADD_BREAD_CRUMB=Y for the item “EmployeeName”. The item “EmployeeName” style is “MessageStyledText”. Now, the employeeName item will be showing as “Link”8)    Now, we have to execute the query according to employeeId (depending on selection of employeeName).9)     In viewobjectimpl.java (employeeFullVOImpl.java) file, create method as below.

Code:import oracle.jbo.domain.Number;import oracle.apps.fnd.framework.OAException;   public void initQuery(String employeeNumber){   If (employeeNumber! =null)  {      Number empNum=null;   Try{   empNum=new Number(employeeNumber);}Catch(Exception e){   Throw new OAException(“AK”,” FWK_TBX_INVALID_EMP_NUMBER”);}setWhereClause(“EMPLOYEE_ID=:1”);setWhereClauseParams(null);setWhereClauseParam(0,empNum);executeQuery();

}}

10)  From applicationModule, we can call view object procedure.Code:

    public void initDetails(String employeeNumber){   EmployeeFullVOImpl empvo=getEmployeeFullVO1();

Page 41: OAF Training Material

   Empvo.initQuery(employeeNumber);}11)  Create the CONTROLLER and call the procedure “initDetails”.12)  Write code in “processRequest” method

Code:       String empnum=pageContext.getParameter(“employeeNumber”);      OAApplicationModule am=pageContext.getApplicationModule(webBean);      Serializable[] parameters={empnum};      Am.invokeMethod(“initDetails”, parameters);

Result:  we can get the details of employee according to employee ID.

          How do display custom copy right on OAF page

Solution:

First, we have set the pageLayout region property “AutoFooter” as False. (This is very important).

Select the pageLayout region, and press right mouse button, then select the option “Copyright” and set the property “prompt” as you wish.

Run the page and observe the “Copyright” prompt at footer of the page.

       How do get the value of the checkbox when selected or deselected

Solution:

Bydefault, the checkbox returns “on” when selected.                The checkbox returns “null” when deselected.

According to “on” and “null” values, we can do validation on the checkbox.

Code:

Write code in processFormRequest method for any button

   String val= pageContext.getParameter("chkbox");

Page 42: OAF Training Material

   If (val.equals(”on” )){   System.out.println(“Male”);}If (val==null){  System.out.println(“Female”);}

http://forums.oracle.com/forums/thread.jspa?threadID=577666&start=0&tstart=165In this site, code has been given regarding get value of selected checkbox from VO (Displayed multiple rows)

          How do insert data from OAF Page to Database table by using View Object

Steps1)      Create view object with query.2)      Create application module and attach the view object3)      Create OAF page and attach application module.4)   Create Controller and write below code.

import oracle.apps.fnd.framework.OAApplicationModule;import oracle.apps.fnd.framework.webui.beans.message.OAMessageTextInputBean;import oracle.apps.fnd.framework.webui.beans.message.OAMessageLovInputBean;import java.text.SimpleDateFormat;import java.text.DateFormat;import java.util.Date;import java.text.ParseException;import oracle.apps.fnd.framework.server.OADBTransaction;import java.sql.*;

Method: processRequest ()**********************************

public void processRequest(OAPageContext pageContext, OAWebBean webBean)  {    super.processRequest(pageContext, webBean);    OAApplicationModule am=pageContext.getApplicationModule(webBean);    am.invokeMethod("initQuery",null);}

Page 43: OAF Training Material

Method: processFormRequest ()****************************************

public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)  {    super.processFormRequest(pageContext, webBean);

    if (pageContext.getParameter("Apply")!=null)    {    try    {       OAApplicationModule am=pageContext.getApplicationModule(webBean);      //    Date update_date=pageContext.getCurrentUserDate();      //   System.out.println("current date="+update_date);             OAMessageTextInputBean supplier_id    =                   (OAMessageTextInputBean)webBean.findChildRecursive("SupplierId");      String sup_id_txt=supplier_id.getText(pageContext);     int sup_id=Integer.parseInt(sup_id_txt);            OAMessageLovInputBean sup_name =                  (OAMessageLovInputBean)webBean.findChildRecursive("SupplierName");      String supname_txt=sup_name.getText(pageContext);            OAMessageTextInputBean onhold_flag =                       (OAMessageTextInputBean)webBean.findChildRecursive("OnHoldFlag");      String onhold_txt=onhold_flag.getText(pageContext);      String sdate=pageContext.getParameter("StartDate");      // Date startdate_txt=sdate;      //System.out.println("start date="+df.format(startdate_txt));            String edate=pageContext.getParameter("EndtDate");      // Insert row into the table FWK_TBX_SUPPLIERS      String task2Info = null;       PreparedStatement psProType = null;      ResultSet rsProType = null;      int task2Type = 0;      Connection conn = am.getOADBTransaction().getJdbcConnection();       task2Info = "INSERT INTO FWK_TBX_SUPPLIERS(SUPPLIER_ID,NAME,ON_HOLD_FLAG,START_DATE,END_DATE,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY) VALUES(:1,:2,:3,:4,:5,SYSDATE,0,SYSDATE,0)";

        psProType = conn.prepareStatement(task2Info);        psProType.setInt(1,sup_id);

Page 44: OAF Training Material

        psProType.setString(2,supname_txt);        psProType.setString(3,onhold_txt);        psProType.setString(4,sdate);        psProType.setString(5,edate);       // psProType.setString();        psProType.executeUpdate();        am.invokeMethod("apply");   }   catch(Exception e)   {     System.out.println("error="+e.getMessage());   }        //psProType.setDate(4,startdate_txt);       // psProType.setDate(5,edate);    }  }

Write below methods in Application Module which is corresponding to view object.

// it is used to create row in view object cache, and then user can enter and insert data into table.

public void initQuery()  {    SuppliersVOImpl vo=getSuppliersVO1();    Row row=vo.createRow();    vo.insertRow(row);  }  // it is for commit the transaction; otherwise not inserted the record into table.  public void apply()  {    getTransaction().commit();  }

Please find the below screen shot. The below data will be inserted into table when press the “Apply” button.

See below screenshot for output.

          How do refresh the same page after the data has been entered

There is API “forwardImmediatelyToCurrentPage” used to refresh the same page when the user presses the submit button.

Write below code in processFormRequest() method****************************************************************

Page 45: OAF Training Material

import com.sun.java.util.collections.HashMap;

HashMap params = new HashMap();

pageContext.forwardImmediatelyToCurrentPage(params,true,OAWebBeanConstants.ADD_BREAD_CRUMB_NO);

          How do set the values in poplist

Solution:- 1)       Create View Object(VO) and write query to display the values in poplist.            VO Name: SuppliersListVOQuery:-

          SELECT 'YES' MEANING,'Y' CODE FROM DUAL          UNION     SELECT 'NO' MEANING,'N' CODE FROM DUAL

‘YES’ is used to show for user on the OAF page. ‘Y’ is used for internal purpose. The value ‘Y’ will be stored into database when user selects ‘YES’.

Set the properties for an item:-

     Property       Value     Item Style messageChoice     Picklist view Definition

train.oracle.apps.ak.suppliers.list.webui.SuppliersListVO

     Picklist Display  Attribute

Meaning

     Picklist Value Attribute

Code

          How do hide the specified item when user selects the particular value from Poplist

Solution:-

The concepts “partial page rendering” and “SPEL” should be used to get this solution.

I have one poplist in OAF page and the list has two values “YES” and “NO”. If the user selects the value “NO”, then the specified item should be invisible on OAF page at runtime.

Note: This example followed above screen shot page.

Page 46: OAF Training Material

Steps:1) Create properties view object (PVO) and create two attributes.     i) RowKey  (Set the properties like below screenshot)

ii) EndDateRender (Set the properties as per below screenshot)

2)    Select the option “Tuning” for the same properties VO and select the check box like below screenshot.

3)       Attach the propertiesVO (SuppliersListPVO) to application module (SuppliersAM).4)       Configure the list item (onholdflag item). Set the below properties.

         Property         Value   Disable Server Side Validation   True   Disable Client Side Validation    True   Action   firePartialAction   Event onholdflagChange   Submit   True

5)       Configure the item which is invisible according to value of the list item. Here, the invisible item is “EndDate”. So, set the below property for the item “EndDate”.

     Property    Value     Rendered ${oa.SuppliersListPVO1.endDateRender}

6)       Write below methods in application module (SuppliersAMImpl.java)public void onholdflagChange()  {    OAViewObject vo = (OAViewObject)findViewObject("SuppliersListPVO1");    OARow row=(OARow)vo.first();    OAViewObject suppvo=(OAViewObject)findViewObject("SuppliersVO1");    OARow supprow=(OARow)suppvo.getCurrentRow();    String onhold=(String)supprow.getAttribute("OnHoldFlag");    if ((onhold==null)||("N".equals(onhold)))    {    row.setAttribute("EndDateRender",Boolean.FALSE);  }    else    {    row.setAttribute("EndDateRender",Boolean.TRUE);    }

Page 47: OAF Training Material

  }

public void init()  {    OAViewObject appPropsVO=(OAViewObject)findViewObject("SuppliersListPVO1");    if (appPropsVO!=null)    {      if (appPropsVO.getFetchedRowCount()==0)      {        appPropsVO.setMaxFetchSize(0);        appPropsVO.executeQuery();        appPropsVO.insertRow(appPropsVO.createRow());        OARow row=(OARow)appPropsVO.first();        row.setAttribute("RowKey",new Number(1));              }    }    onholdflagChange();  }

7)       Call the init() method from processRequest.

    am.invokeMethod("init");8)       call the onholdflagChange() method from processFormRequest

    if ("onholdflagChange".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))){  am.invokeMethod("onholdflagChange"); }

In the above code, the “onholdflagChange” is event name. The event of the item will be worked as form-submit. So, the above code (event related) has been written in processFormRequest.

Run the OAF page and change the value of the list item. The item “EndDate” will not be rendered if the value of the list item is “NO”.

          How do fire event? To display supplier name according to supplier id .

There are two text items on OAF page. They are           I) SupplierId  II) SupplierName

Page 48: OAF Training Material

Steps:-1)       Set the below properties for item “SupplierId”.         Property          Value        Action          firePartialAction       Event       supplierNameEvent       Submit        True

2)       Write below code in processFormRequest method.

if("supplierNameEvent".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))){  int supp_id = Integer.parseInt(pageContext.getParameter("SupplierId"));  if (supp_id==195)  {    am.invokeMethod("supplierNameEvent");}}

3)       Write below method “supplierNameEvent” in an application module.

   public void supplierNameEvent()  {    OAViewObject    suppvo =             (OAViewObject)findViewObject("SuppliersVO1");    OARow supprow=(OARow)suppvo.getCurrentRow();    supprow.setAttribute("SupplierName","Ramprasad");  }                            Note:  The webBean properties can not be modified in processFormRequest method                 (Ex: setText; setName etc).Result: Enter the value “195” in supplier id text item and press tab key, then the name              “Ramprasad” will be getting displayed in supplier name text item.

          How do create list box and add values to the list box dynamically

Solution:

First, create a messageLayout region under messageComponentLayout region because we are creating Listbox item under “messageLayout” region using the below code.

Page 49: OAF Training Material

Write below code in processRequest() method of CONTROLLER.

import oracle.apps.fnd.common.VersionInfo;import oracle.apps.fnd.framework.webui.OAControllerImpl;import oracle.apps.fnd.framework.webui.OAPageContext;import oracle.apps.fnd.framework.webui.beans.OAWebBean;import oracle.apps.fnd.framework.webui.beans.form.OADefaultListBean;import oracle.apps.fnd.framework.webui.OAWebBeanConstants;import oracle.apps.fnd.framework.webui.beans.message.OAMessageLayoutBean;

public void processRequest(OAPageContext pageContext, OAWebBean webBean)  {    super.processRequest(pageContext, webBean);    //Create List WebBean    OADefaultListBean list = (OADefaultListBean)createWebBean(pageContext,OAWebBeanConstants.DEFAULT_LIST_BEAN, null, "positionsList");   // Set the Viewobject name, display attribute and value attribute for list box.

list.setListViewObjectDefinitionName("train.oracle.apps.ak.suppliers.list.webui.SuppliersListVO");     list.setListValueAttribute("Code");   list.setListDisplayAttribute("Meaning");   list.setMultiple(true);   list.setName("SupplierList");   OAMessageLayoutBean listBoxLayout =                       (OAMessageLayoutBean)webBean.findChildRecursive("listBoxLayout");

   listBoxLayout.addIndexedChild(list);   }

          Create a Shuttle Region

Following is a brief outline of the steps to create a Shuttle region.

Step 1: Create a page with a pageLayout region using OA Extension. Make sure the Form property on the pageLayout region is set to True.

Step 2: Select the pageLayout region in the Structure pane, and choose             New > Region from the context menu.

Set the following properties on this new region (Required properties are marked with *):*ID - set the shuttle's ID property in accordance with the OA Framework File / Package/ Directory Standards.

Page 50: OAF Training Material

*Region Style - set the region style to shuttle.

Add Indexed Children - make sure this property is set to True, so that OA Framework automatically generates the web beans under this web bean hierarchy. The default is True.

Available Header - specify the header text of the first (leading) list.Selected Header - specify the header text of the second (trailing) list.  If you want to implement just one list for Reordering, that is, you do not want to shuttle items between two lists, then leave this property blank.

Ordering Allowed - set to True if you want to enable ordering of the contents of the Selected (second or trailing) list. If you implement only one (leading) list in the shuttle region to create a Reordering region, then setting this property to True enables ordering on that leading list. The default is False.

Step 3: The Shuttle region can have a maximum of two list web beans, referred to as the leading and trailing lists. The trailing list is omitted when you want to implement a shuttle region with a single list for the purpose of reordering the contents of that list. When you define a shuttle region, OA Extension automatically creates a leading component for you, which contains a single list item. Be sure to set the following properties on the list item (Required properties are marked with *):

*ID - set the list's ID property in accordance with the OA Framework File / Package/ Directory Standards.

*Multi-Select Allowed - set to True to allow the multiple selection of items in the list. The default is False.

Picklist View Definition - specify the fully qualified view object name that is the data source to the List web bean.(For example, oracle.apps.fnd.framework.server.FndApplicationVO)

*Picklist View Instance - alternately specify a view instance name for the data source of the list, if the Picklist View Definition is not available. Note that setting this property overrides the Picklist View Definition property. (For example, FndApplicationVO, which needs to be present in the ApplicationModule.)

*Picklist Display Attribute - specify the view attribute name that serves as the displayed values of the list's content.

*Picklist Value Attribute - specify the view attribute name that serves as the internal values of the list's content. This property, and not the Picklist Display Attribute property, uniquely identifies the elements in the list.

Page 51: OAF Training Material

Picklist Description Attribute - specify the view attribute name that serves as the descriptions of the list's content.

Rendered - specify True to render this list.

*List Height - specify the suggested display height of the list, in characters. The default is null. If this property is not set, the height is determined based on the lengths of both lists and their minimum and maximum values. The value should be in the range of 10 to 20.

Note: The List Height is only a suggested value. Your browser application and UIX determines the final 446 height of the list based on the number of items in the list and the size of the browser window.

Step 4: To create an optional trailing list, select the shuttle region in the Structure pane and choose New >trailing from the context menu. OA Extension automatically creates a trailing component for you, which contains a single list item. Refer to Step 3 for the list of properties that you should also set on the trailing list item. Make sure you specify names for the Picklist Display Attribute, Picklist Value Attribute and Picklist Description Attribute properties that match the corresponding property of the leading list item.

Note: If you do not want to pre-populate the trailing list when the page initially renders, you can leave the Picklist View Definition, Picklist View Instance, Picklist Display Attribute, Picklist Value Attribute and PicklistDescription Attribute blank. OA Framework takes care of retaining user selected values in the trailing list when the page refreshes.

Note: The Picklist Value Attribute uniquely identifies the elements in a list, so if you want to pre-populate both the leading list and trailing list with data, be sure to set the Picklist Value Attribute property to a different value for each list. Setting this property to the same value for both lists will result in undesirable behaviour, such as causing the values in the leading list to disappear.

Step 5: You can include buttons or icons in the footer of each list, as shown in Figure 2. Select the shuttle region in the Structure pane, and choose New > leadingFooter (for a footer in the leading list) or New > trailingFooter (for a footer in the trailing list). OA Extension automatically creates a leadingFooter or trailingFooter component, respectively, each containing a flowLayout region. You can then add your buttons or icons to this flowlayout region.

Note: If you set the Rendered property to False for either the leading or trailing list, the leading or trailing footer also does not render, respectively. Since the footer is directly linked to its respective list, if the list is not rendered, the footer is irrelevant.

Page 52: OAF Training Material

          About StackLayout, rowLayout, cellFormat region styles

We can design layout like below screen shot by using the stackLayout, rowLayout and cellFormat region styles.

pageLayoutRegion      |-----stackLayout region                  |----rowLayout region                            |---------cellFormat region                                             |-------spacer (item style)                                             |         (width: 400)                                             |-------item (style: formattedText)                                        (Text: <b>Authority For Expenditure</b>                               (Please look above screenshot for result)

    |------stackLayout region                |----rowLayout region                        |----cellFormat region                                 |-----spacer (item style)                                 |       (width: 400)                                 |-----item (style: formattedText)                      (Property Text: <b>Co:  101   XXX Energy Inc</b>)

   |--------stackLayout region                  |-----rowLayout region                           |-----cellFormat region                                    |------ table region                                          |----- item1 (style: messageStyledText)                              |-----cellFormat region                                    |------ table region                                          |----- item2 (style: messageStyledText)  

                           |-----cellFormat region                                    |------ table region                                          |----- item3 (style: messageStyledText) 

Set the properties for item1, item2 and item3. The properties are

§  Prompt§  View Instance§  View Attribute(Please see table region in above screenshot for result)

How to display text items side by side

Solution:-    

Page 53: OAF Training Material

pageLayoutRegion      |-----stackLayout region                  |----rowLayout region                            |---------cellFormat region                                             |-------item (messageTextInput)                            |---------cellFormat region                                                      |-------item (style: spacer; width: 50)                                       

Set the item properties for messageTextinput. The properties are   prompt, view Instance and view Attribute  

(Please see above screenshot for result).

          About Browser Look and Feel (BLAF)

A Look-and-Feel (LAF) controls the appearance of an OA Framework application. An LAF provides the rendering logic for each component along with a look and feel-specific style sheet.

The OA Framework supports three LAFs.

ü  Oracle BLAF -- implements the Oracle Browser Look-and-Feel (BLAF) UI Guidelines.

ü  Minimum LAF (MLAF) -- generates "minimal" content to reduce the size of HTML pages and overall network overhead (for example, this LAF uses fewer images than the BLAF version)

ü  Plain Text -- produces a plain text version of the page (typically used to send a plain text version of a page to an e-mail client). Note that the plain text LAF does not support all the existing component styles.

Note: The LafConstants class is in the oracle.apps.fnd.framework.webui.laf package.

Example:

OA.jsp?page=/train/oracle/apps/ak/employee/webui/EmpDetailsPG&employeeNumber={@EmployeeId}&retainAM=Y&addBreadCrumb=Y& OALAF=minimal

Call the page “EmpDetailsPG” from any another page and observe appearance of the “EmpDetailsPG”. Please find the below screen shot. (OALAF=minimal)

Page 54: OAF Training Material

From above screenshot, some text is showing in green color.  Try for “blaf” and “oaText” LAFs like above.

          About AdvancedTable Bean

Previously, OA Framework used oracle.apps.fnd.framework.webui.beans.table.OATableBean, an Oracle Application implementation of UIX oracle.cabo.ui.beans.table.TableBean, to render tables. Now oracle.apps.fnd.framework.webui.beans.table.OAAdvancedTableBean extends OATableBean to provide declarative support for existing table features that previously required programmatic control. OAAdvancedTableBean also provides declarative support for features not available with OATableBean, such as column span in a table column header. As of Release 11.5.10, oracle corp. recommend new tables be implemented as "advanced tables" based on oracle.apps.fnd.framework.webui.beans.table.OAAdvancedTableBean.You can create a table by specifying appropriate information in Oracle 9i JDeveloper OA Extension. Currently, you can declaratively specify the following features/components/attributes on a table:

Number of rows to display in a table Width of a table Header text for individual table columns Column span in column headers Table formatting Single selection and multiple selection on a table and adding other

controls to a selection bar Sorting and initial sorting of a table on up to three columns Totalling a column Adding new rows Detail Disclosure Row Headers Wrap Settings

     Below is a brief outline of how to declaratively implement a table.AdvanceTablePG (.xml)||---PageLayoutRegion       |       |---create region (style: advancedTable;                                    Set View Instance property)             |             |---create column                     |                    |---create item (style: messageTextInput;                                              Set the View Attribute property)

Page 55: OAF Training Material

                    |---create column header (to display heading of the                                                             Column and sort the data)ü  Set the prompt property in column header properties to display heading of the column (example: Employee Name)ü  Set the property “Sort by View Attribute” to sort the data based on column. (Ex: - if “Sort by View Attribute” property value is “EmployeeId”, then sort the data based on EmployeeId attribute.)

See below screen shot for reference.

Design the table with other columns like above.

We need to write code to display data like below screenshot.

Create controller (EmpAdvancedCO) on PageLayout Region.      

public void processRequest(OAPageContext pageContext, OAWebBean webBean)  {    super.processRequest(pageContext, webBean);    oracle.apps.fnd.framework.OAApplicationModule   am =                             pageContext.getApplicationModule(webBean);      am.invokeMethod("initQueryAdv"); //create row and execute query     }Go to the corresponding Application Module and write below code to create row and execute query.(i.e. pagelayout region AM Definition property value)

import oracle.jbo.Row;

public void initQueryAdv()  {    EmployeeFullVoImpl empvo=getEmployeeFullVo1();    Row row=empvo.createRow();     empvo.insertRow(row);     empvo.executeQuery();}  

In above code, the “EmployeeFullVo1” is view object instance.

Compile the code and run the page.

          How do display “ Add another row” button and totalling on column

Page 56: OAF Training Material

In AdvancedTable, this is good feature to add row dynamically and display total on footer without write code.

Declarative implementationSelect the “advancedTable” region and press right mouse button and select the option “footer”.   

After select the “footer” option, the footer and tableFooter1 components will be created. See below screenshot.

Select the “tableFooter1” and press right mouse button and select the option “addTableRow”. See below screenshot.

Run the page once and you will get “Add another Row” button at the footer of advancedTable.

Select “total” option to display total of particular column (salary). The option “total” showing in above screen shot.

We need to set one property “Total Value” as True for salary column (column4 in below screen shot) and run the page. See the below screenshot to know the final output of advancedTable. (Add Another Row button, Recalculate button and total value for salary column)

After press the “Add Another Row” button, one blank record will be created. See below screen shot.

User selects the Recalculate button to update the column total.

Note: The total displays a double precision summation of all visible rows in the table.            The total reflects only the current visible records and not all the records queried.

          How do iterate the number(Serial Number) in OAF by using Transient Attribute

Code:public void setItemDetailsSno() {   OAViewObject vo = (OAViewObject)getCMCostchangeVO();    CMCostchangeVORowImpl row = null;   int fetchedRowCount = vo.getRowCount();    // we use a separate iterator -- even though we could step through the    // rows without it -- because we don't want to affect row currency.   

Page 57: OAF Training Material

    RowSetIterator insertIter = vo.createRowSetIterator("insertIter1");     if (fetchedRowCount > 0)     {      insertIter.setRangeStart(0);      insertIter.setRangeSize(fetchedRowCount);       for (int i = 0; i < fetchedRowCount; i++)      {        row = (CMCostchangeVORowImpl)insertIter.getRowAtRangeIndex(i);         // For performance reasons, we generate ViewRowImpls for all        // View Objects.  When we need to obtain an attribute value,        // we use the named accessors instead of a generic String lookup.               row.setAttribute("SNo", new Integer(i+1));                                                 //SNo is transient attribute in VO        }      }        insertIter.closeRowSetIterator();  }See below screenshot and check the values of serial number     Check the values of serial number in above screen shot.

          How do display latest serial number dynamically while creating row

Write below code in proecessFormRequest Method of Controller.

Code:oracle.apps.fnd.framework.OAApplicationModule am=pageContext.getApplicationModule(webBean);    OAAdvancedTableBean tableBean  =             (OAAdvancedTableBean)webBean.findChildRecursive("AdvancedtblRN");if (tableBean.getName().equals(pageContext.getParameter(SOURCE_PARAM))          && ADD_ROWS_EVENT.equals(pageContext.getParameter(EVENT_PARAM)))     {      am.invokeMethod("setSequenceNum");    }

Note:  From above code, ADD_ROWS_EVENT is event name for “Add Another Row” button.

Write below code in Application Module which is added to your pagelayout region.

Page 58: OAF Training Material

Imp: Set the property “insert rows automatically” as False in addTableRow1 object at footer of advanced table.

public void setSequenceNum(){   SequenceNumberVOImpl seqvo=getSequenceNumberVO1();   int fetchedRowCount=seqvo.getRowCount();   RowSet rowset=seqvo.createRowSet("dd");   rowset.last();   rowset.next();   Row row=seqvo.createRow();   rowset.insertRow(row);   row.setAttribute("SERIALNUM",new Integer(fetchedRowCount+1));   rowset.closeRowSet();}

Result: Display Serial Number (transient attribute) according to current row position dynamically after pressing the “Add Another Row” button.

See below screen shot, after press the “Add Another Row” button

New row is created and added onto table, and SerialNumber is also incremented (from 6 to 7) and displayed on table.  See below screenshot.

          How do delete a selected record of Advanced Table using Delete Switcher

Solution:-First add “Delete Switcher” item onto “advancedTable” region.From above screenshot, 1) The “deleteSwitcher” is a column of advancedTable region.2) The “DelSwitcher” is a switcher under “deleteSwitcher” column.    (Set viewAttribute property to enable the deleteSwitcher item)    (Add the column in VO like below for deleteSwitcher. Check           below decode statement. Add this in VO)     decode(NVL(SequenceNumberEO.ON_HOLD_FLAG,'Y'),'Y',            'DeleteEnabled',            'DeleteEnabled') AS DELETE_SWITCHER3) Set viewAttribute property as DeleteSwitcher4) Create image item under case.       Set the imageID as “DeleteDisabled”      Set the imageURI property as “deleteicon_disabled.gif ”5)      Create second image item under second case.      Set the imageID as “DeleteEnabled” (same as in VO)       Set the imageURI property as “deleteicon_enabled.gif ”6)      Set the image items height and width as “24”7)      Set the action property for “DeleteEnabled” image as “fireAction” and Event as “delete”. Set the parameters property under Event property as below screenshot.

Page 59: OAF Training Material

From above screenshot, the value of Name is “supplierNUM”. It is used to get serial number when user clicks the delete switcher at runtime.Value: ${oa.SequenceNumberVO1.SERIALNUM} [it is SPEL]After setting above properties, Write below code in Application Module for removing the selected record.public void deleteSupplier(String SupplierNumber){   int suppToDelete = Integer.parseInt(SupplierNumber);   OAViewObject vo = (OAViewObject)getSequenceNumberVO1();    SequenceNumberVORowImpl row=null;   int fetchedRowCount = vo.getFetchedRowCount();   System.out.println("fetchedRowCount " + fetchedRowCount);   RowSetIterator deleteIter = vo.createRowSetIterator("deleteIter");   if (fetchedRowCount > 0)     {       deleteIter.setRangeStart(0);       deleteIter.setRangeSize(fetchedRowCount);      for (int i = 0; i < fetchedRowCount; i++)      {        row = (SequenceNumberVORowImpl)deleteIter.getRowAtRangeIndex(i);       // Number primaryKey = row.getSupplierId();        Number primaryKey = row.getSERIALNUM();        if (primaryKey.compareTo(suppToDelete)==0)        {          row.remove();          //getTransaction().commit(); (if remove this comments,                                                        then the record will be                                                          removed from database)          break;        }      }    }    deleteIter.closeRowSetIterator();}Invoke above method from CONTROLLER. Write below code in processFormRequest method of CONTROLLER.

public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)  {    super.processFormRequest(pageContext, webBean);oracle.apps.fnd.framework.OAApplicationModule am =                 pageContext.getApplicationModule(webBean);     if ("delete".equals(pageContext.getParameter(EVENT_PARAM)))   {String supplierNumber = pageContext.getParameter("supplierNUM");      Serializable[] parameters = { supplierNumber };         am.invokeMethod("deleteSupplier", parameters);       MessageToken[] tokens = {new MessageToken("EMP_NAME", supplierNumber)};       OAException message = new OAException("AK",

Page 60: OAF Training Material

                "FWK_TBX_T_EMP_DELETE_CONFIRM", tokens,                                                             OAException.CONFIRMATION, null);      pageContext.putDialogMessage(message);      }}From the CONTROLLER code, the “delete” is event name in “DeleteEnabled” image. The “supplierNUM” is value of SPEL “${oa.SequenceNumberVO1.SERIALNUM}”Run the page and get below output.Press the Delete switcher of any record and then check the output. Now, the record still available in database because of not committed this transaction. After press the “Save” button, the record will be removed from the database.

If user wanted to show checkbox for onHoldFlag column, then we need to change the item style of the “onHoldFlag” item as “messageCheckBox”. Set the below check box properties

checkedValue:     Y    ;  uncheckedValue:    N

        Check the onHoldFlag values in above screenshots.

          How do clear the View Object at runtime

Code:

     Write below code in Application Module.

Public void clearVO(){SupplierInfoVOImpl vo= getSupplierInfoVO1(); vo.remove() ;}

Call above method from CONTROLLER (processFormRequest).OAApplicationModule am =pageContext.getApplicationModule(webBean);am.invokemethod(“clearVO”);

Please see below screenshotsAfter press the clear button, the data will be cleared. See below screenshot.

OAF Directory Structure – Location of Files on Server

All the standard OAF components delivered by Oracle fall under:

$JAVA_TOP/oracle/apps/… directory.

Page 61: OAF Training Material

Similarly, any of our custom OAF application should go under:

$JAVA_TOP/xxcust/oracle/apps…

(xxcust is short name for our custom application).

While running our application from JDeveloper, there is no

$JAVA_TOP. So equivalent directory for $JAVA_TOP is

<JDEV_USER_HOME>/myclasses.

when we create our pages, all java and xml files get created

in <JDEV_USER_HOME>/myprojects folder. However on

compiling the project corresponding class files and xml files

get generated under

<JDEV_USER_HOME>/myclasses.

Right after oracle/apps, there is short name of an application that is

registered within EBS (like icx, fnd, po, etc).

Now all we have to do is to create package structure for all

components:

Entity objects: package name should end with .schema.server

Application module: package name should end with .server

View objects: package name should end with .server

View objects (for LOVs): package name should end

with .lov.server

Page definitions & controllers: package name should end

with .webui

Page 62: OAF Training Material

Create and Update Page in OAF

Here are the steps for creating ‘Employee create update’ page. I have

modified the search page created in previous post.

1) Create a new Entity Object (EO):

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

Right click on ‘emprec’ package and create a new entity object (This

will open a wizard having 5 steps).

Step 1

Package: xxcus.oracle.apps.fnd.emprec.schema.server

Name: XxEmployeeEO

Schema Object (in Database Object): EMPLOYEE

Click Next.

Page 63: OAF Training Material

Step 2

Keeps default (all attributes selected). Click Next.

Step 3

If there is any primary key in DB table, then keep all defaults else

select a primary key (like empno). Click Next.

Step 4

Keep defaults and click on Next.

Step 5

Keep ‘Generate Default View Object’ uncheked and click on Finish.

2) Create a new View Object (VO) based on EO created in (1):

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

Right click –> New View Object (This will open a wizard having 7

steps).

Step 1

Package: xxcus.oracle.apps.fnd.emprec.server

Name: XxEmployeeVO

Choose the radio button ‘Updatable access through Entity Objects’.

Click Next.

Step 2

Select the

xxcus.oracle.apps.fnd.emprec.schema.server.XxEmployeeEO from

‘Available’ list and shuttle it to ‘Selected’ list. Click Next.

Step 3

Move all the columns except WHO columns (lastUpdateLogin,

createdBy…) to ‘Selected’ list from ‘Available’ list attributes.

Click Next.

Page 64: OAF Training Material

Keep defaults for step 4, 5 & 6.

Step 7

Select check boxes for ‘Generate Java File’ for both ‘View Object Class’

and ‘View Row Class’. Click Finish.

Double Click on XxEmployeeAM and shuttle XxEmployeeVO from

‘Available view objects’ to ‘Data Model’.

(now there are two VO instances in AM :XxEmployeeSearchVO1

& XxEmployeeVO1).

3) Edit Employee Search Page (XxEmployeeSearchPG):

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

(This includes adding a ‘create button’ at top & ‘update’ icon on every

row in search result. Modified page will appear as below:)

Step 1

Right click on pageLayoutRN and add a new region. Set properties as

below:

Region Style: pageButtonBar

ID: pageBtnBarRN

Page 65: OAF Training Material

Right click on pageBtnBarRN region and add a new item:

Item Style: submitButton

ID: createBtn

Prompt: Create Employee

Step 2

Right click on XxEmployeeSearchVO1 table region and add an item.

Set the below properties:

Item Style: Image

ID: updateImg

Prompt: Update

Image URI: updateicon_enabled.gif

Action Type: fireAction

Event: updateEvent

Parameters: it will open a new window. Add a parameter as below:

Name: p_empNum value: ${oa.XxEmployeeSearchVO1.Empno}

4) Create a new Update Create page:

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

(Here user can either create a new employee or can update existing

one. The page will appear as shown below: ).

Page 66: OAF Training Material

Right click emprec –> New –> Web Tier –> OA Components –> select

‘Page’ item. Click OK. (This will open a popup window)

We are creating Employee Create Update Page, so specify the details

of page as below:

Name: XxEmployeeCreateUpdatePG

Package: xxcus.oracle.apps.fnd.emprec.webui

Create a new region under pageLayout of type ‘header’

Create another region under the header region using wizard

(This will open a wizard window having 4 steps):

Select ‘XxEmployeeAM’ from Application Module drop down and

select ‘XxEmployeeVO1′ in available view usages. Click Next.

Choose region style as ‘defaultSingleColumn’ from drop down.

Click Next.

Shuttle all the fields from available to selected attributes. Click

Next.

Change the style to messageStyledText for Empno and

messageTextInput for other remaining rows. Also modify the prompt

to make it more user friendly (like empName to Employee Name).

Click Next and finish.

Right click on pageLayoutRN and add a new region

Set properties as below:

Region Style: pageButtonBar

ID: pageBtnBarRN

Right click on pageBtnBarRN region and add 2 new items of type

submitButton:

Item Style: submitButton

ID: saveBtn;  ID: cancelBtn

prompt: Save; prompt: Cancel

Page 67: OAF Training Material

Now change the properties for each field from property

inspector as shown below:

pageLayout: ID: pageLayoutRN

AM Definition: xxcus.oracle.apps.fnd.emprec.server.XxEmployeeAM

Window Title: Employee Create Update Page

Title: Employee Create Update

header:      ID: empCreateRN

5) Create a new controller for Update Create page:

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

Step 1

Select XxEmployeeCreateUpdatePG in navigator tab. Declarative form

of page will be visible in structure tab.

Step 2

Right click on pageLayout region –> set new controller (This will open a

popup window). Enter the below details:

package Name: xxcus.oracle.apps.fnd.emprec.webui

Class Name: XxEmployeeCreateUpdateCO

The declarative page structure in jDev will be similar to as shown

below:

Page 68: OAF Training Material

6) Code for Performing

Create & Update Operation

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

Catch the ‘create button’ or ‘Update’ event in PFR method

of XxEmployeeSearchCO (controller of XxEmployeeSearchPG page)

and navigate to ‘Employee Create Update Page’

(XxEmployeeCreateUpdatePG). We also pass a token (in the form of

HashMap) to indicate whether it is a create or update operation.

view plain copy to clipboard print ?

1. // XxEmployeeSearchCO :: PFR   2. if (pageContext.getParameter("createBtn") != null) {   

Page 69: OAF Training Material

3.     HashMap hm = new HashMap(); //com.sun.java.util.collections.HashMap;   

4.     hm.put("event", "create");   5.     pageContext.forwardImmediately("OA.jsp?page=/xxcus/

oracle/apps/fnd/emprec/webui/XxEmployeeCreateUpdatePG",    6.                                 null, (byte)0, null, hm, fa

lse, null);   7. }   8.     9. if ("updateEvent".equals(pageContext.getParameter(EVENT_PAR

AM))) {   10.     String p_empNum = pageContext.getParameter("p_empN

um");   11.     HashMap hm = new HashMap();   12.     hm.put("event", "update");   13.     hm.put("empNum", p_empNum);   14.     pageContext.forwardImmediately("OA.jsp?page=/

xxcus/oracle/apps/fnd/emprec/webui/XxEmployeeCreateUpdatePG",    

15.                                 null, (byte)0, null, hm, false, null);   

16. }  

Once navigated to create page, we have to initialize

the XxEmployeeVO1, so data entered by user in the fields can be

mapped to its attributes. And in case of ‘update’, populate the records

for the employee. We write this code in PR method

of XxEmployeeCreateUpdateCO (controller

of XxEmployeeCreateUpdatePG page). First we check if it is create or

update event and will call a method from AM accordingly:

view plain copy to clipboard print ?

1. // XxEmployeeCreateUpdateCO :: PR method   2. public void processRequest(OAPageContext pageContext, OAWeb

Bean webBean) {   3.     super.processRequest(pageContext, webBean);   4.     am = pageContext.getRootApplicationModule();   5.     6.     if ("create".equals(pageContext.getParameter("event"))) 

{   7.         am.invokeMethod("initCreateEmp");   8.     }   9.     10.     if ("update".equals(pageContext.getParameter("even

t"))) {   

Page 70: OAF Training Material

11.         String empNum = pageContext.getParameter("empNum");   

12.         Serializable[] param = { empNum };   13.         am.invokeMethod("initUpdateEmp", param);   14.     }   15. }  

Write below methods in XxEmployeeAMImpl.java file:

view plain copy to clipboard print ?

1. // XxEmployeeAMImpl ::    2. public void initCreateEmp() {   3.     try {   4.         XxEmployeeVOImpl empCreateVO = getXxEmployeeVO1(); 5.         empCreateVO.setMaxFetchSize(0);   6.         XxEmployeeVORowImpl row = (XxEmployeeVORowImpl)empC

reateVO.createRow();   7.     8.     // here we are setting the employee number using a DB S

equence   9.         Number empNum = getOADBTransaction().getSequenceVal

ue("EMPLOYEE_NUMBER_S");   10.         row.setEmpno(empNum);   11.         empCreateVO.insertRow(row);   12.         row.setNewRowState(Row.STATUS_INITIALIZED);   13.     } catch () {   14.         e.printStackTrace();   15.         }   16. }   17.     18. public void initUpdateEmp(String empNum) {   19.     try {   20.         XxEmployeeVOImpl employeeVO = getXxEmployeeVO1

();   21.         employeeVO.setWhereClause(null);   22.         employeeVO.setWhereClauseParams(null);   23.         employeeVO.setWhereClause("EMPNO = :1");   24.         employeeVO.setWhereClauseParam(0, empNum);   25.         employeeVO.setMaxFetchSize(-1);   26.         employeeVO.executeQuery();   27.         } catch (Exception e) {   28.             e.printStackTrace();   29.             }   30. }  

Page 71: OAF Training Material

Finally, user can click on ‘Save’ button to commit the data or ‘Cancel’

to return back to search page.

We will catch the ‘save’ or ‘cancel’ button click in PFR method

of XxEmployeeCreateUpdateCO and call a method from AM

accordingly:

view plain copy to clipboard print ?

1. // XxEmployeeCreateUpdateCO :: PFR method   2. public void processFormRequest(OAPageContext pageConte

xt,    3.                                OAWebBean webBean) {   4.     super.processFormRequest(pageContext, webBean);   5.     6.     OAApplicationModule am = pageContext.getRootApplic

ationModule();   7.     8.     if (pageContext.getParameter("cancelBtn") != null) 

{   9.    pageContext.forwardImmediately("OA.jsp?page=/

xxcus/oracle/apps  10.    /fnd/emprec/webui/XxEmployeeSearchPG", null, 

(byte)0, null, null, false, null);   11.     }   12.     13.     if (pageContext.getParameter("saveBtn") != null) { 14.         15.  /*Here we are performing commit operation   16.    and returning back to search page.   17.    Also we are fetching the updated/created   18.    emp num so we can display a message on search page*

/  19.        20.   String savedEmp = am.invokeMethod("commit").toString

();   21.         HashMap hm = new HashMap();               22.         hm.put("updated", "Y");   23.         hm.put("empUpdated", savedEmp);   24.    pageContext.forwardImmediately("OA.jsp?page=/

xxcus/oracle/apps  25.    /fnd/emprec/webui/XxEmployeeSearchPG", null, 

(byte)0, null, hm, false, null);   26.     }   27. }  

Page 72: OAF Training Material

Below is ‘commit’ method created in AMImpl class:

view plain copy to clipboard print ?

28. public String commit() {   29.   try {   30.         XxEmployeeVOImpl employeeVO = getXxEmployeeVO1

();   31.         XxEmployeeVORowImpl row = (XxEmployeeVORowImpl

)employeeVO.first();   32.         String savedEmp = row.getEmpno().toString(); 33.         getOADBTransaction().commit();   34.         return savedEmp;   35.     } catch (Exception e) {   36.         e.printStackTrace();   37.     }   38. }  

Below is code to display successful message on search page:

view plain copy to clipboard print ?

39. // XxEmployeeSearchCO :: PR method   40. public void processRequest(OAPageContext pageContext, 

OAWebBean webBean) {   41.     super.processRequest(pageContext, webBean);   42.     43.     if ("Y".equals(pageContext.getParameter("updated")

)) {   44.         String updatedEmp = pageContext.getParameter("

empUpdated");   45.         throw new OAException("Employee Number " + upd

atedEmp +    46.                               " has been saved success

fully.",    47.                               OAException.CONFIRMATION

);   48.     }    49. }  

Message will be displayed after saving the data as shown below:

Page 73: OAF Training Material

 

 Dependent LOV in OAF

Concept of dependent LOV is that, we select a value from one LOV field

and based on that value, another LOV field will show filtered results.

Here, I have used two LOVs: one for PO Headers and another for PO

Lines.

So first, user will select a PO Header Id from LOV1.

As we are making these dependent, so LOV2 will show only those PO

Lines that are related to PO header Id selected.

1) Create a new OA page:

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

Right click on project (xxcus) –> New –> Web Tier –> OA Components

–> select ‘Page’ item. Click OK. (This will open a popup window)

We are creating Dependent LOV page, so specify the details of page as

below:

Name: XxDemoDependentLovPG

Package: xxcus.oracle.apps.fnd.dpndntlov.webui

Page 74: OAF Training Material

2) Create two new view objects (VO):

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

First for PO Headers

Right click (dpndntlov) –> New View Object (This will open a wizard

having 7 steps).

Step 1

Package: xxcus.oracle.apps.fnd.dpndntlov.lov.server

Name: XxPoHeaderLovVO

Choose the radio button ‘Read-only Access’ (as we are not performing

any DML operation). Click Next.

Step 2

Enter the below query in ‘Query Statement’:

select PO_HEADER_ID from po_headers_all where rownum <50

As there is no need to generate VOImpl/VORowImpl, keep defaults for

step3, 4, 5, 6 & 7 and click Finish. Save All.

Second for PO Lines

Right click –> New View Object

Step 1

Package: xxcus.oracle.apps.fnd.dpndntlov.lov.server

Name: XxPoLinesLovVO

Choose the radio button ‘Read-only Access’. Click Next.

Step 2

Enter the below query in ‘Query Statement’:

select PO_HEADER_ID, PO_LINE_ID from po_lines_all

Page 75: OAF Training Material

Keep defaults for step3, 4, 5, 6 & 7 and click Finish. Save All.

3) Create a new Application Module (AM):

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

Step 1

Package: xxcus.oracle.apps.fnd.dpndntlov.server

Name: XxDemoDependentLovAM. Click Next.

Step 2

Here we will add an instance of the VOs created in (2).

Select XxPoHeaderLovVO & XxPoLinesLovVO from ‘Available View

Objects’ and shuttle it to ‘Data Model’ using “>” button.

Keep defaults for all other steps (3, 4). Click Finish.

4) Creating the Page Layout & Setting its Properties:

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

Page will appear as below :

1) Create a new region under pageLayout of type defaultSingleColumn.

2) Create 2 items under defaultSingleColumn region

(messageLovInput, messageLovInput).

Now change the properties for each field from property inspector as

shown below:

Page 76: OAF Training Material

pageLayout:

ID: pageLayoutRN

AM Definition:

xxcus.oracle.apps.fnd.dpndntlov.server.XxDemoDependentLovAM

Window Title: Dependent LOV Demo Page

Title: Dependent LOV Demo

defaultSingleColumn:

ID: singleColRN; Text: PO Lines Dependent on PO Header

messageLovInput (for PO Header):  

ID: poHearderLov

Prompt: PO Header ID

messageLovInput (for PO Lines):

ID: poLineLov

Prompt: PO Line ID

Creating LOV regions:

Expand poHearderLov LOV, right click on region1 and create a new

region using wizard.

Step 1

select ‘XxDemoDependentLovAM’ from Application Module drop down

and select ‘XxPoHeaderLovVO1′ in available view usages. Click Next.

Step 2

choose region style as ‘table’ from drop down. Click Next.

Step 3

Shuttle all the fields from available to selected attributes. Click Next.

Also modify the prompt to make it more user friendly (like PO Header

ID).

Page 77: OAF Training Material

This will create an item ‘PoHeaderId’ under ‘XxPoHeaderLovVO1′ table

region.

Set search allowed property to TRUE for the item created.

lovMap1:

LOV region item: PoHeaderId

Return item: poHearderLov

Criteria item: poHearderLov

Similarly, create LOV region for poLineLov choosing

XxDemoDependentLovAM as AM and XxPoLinesLovVO1 as view object.

Modify the prompt to PO Lines ID.

This will create 2 items ‘PoHeaderId1′ & ‘PoLineId’ under

‘XxPoLinesLovVO1′ table region.

Set search allowed property of ‘PoLineId’ to TRUE.

lovMap2:

LOV region item: PoLineId

Return item: poLineLov

Criteria item: poLineLov

Here, in lovMap3, we are making this dependent on first LOV

by setting criteria item as value of first LOV field.

lovMap3:

LOV region item:PoHeaderId1

Criteria item: poHearderLov

The declarative page structure in jDev will be similar to as shown

below:

Page 78: OAF Training Material

Now select a value (PO Header Id) from LOV1 such as 4 (as shown in

above screenshot).

Perform a search on PO Line ID LOV. This will show only those lines

whose header Id is 4.

Below is screenshot for the same:

Page 79: OAF Training Material

PPR (Partial Page Rendering) in OAF

While developing pages, we may face some scenarios where the

requirement is to make modifications on the current page itself,

instead of navigating to different page. Such as selecting an item from

a choice list might result in modifications to other fields or clicking a

button to add a new row in table region and many more like these.

All these tasks can be performed by simply refreshing the page

however this could result in performance issues. Another alternative is

to use javaScript which will give faster results but implementing

complex functions can be a tough job using javaScript.

UIX Framework provides a solution for this: Partial Page

Rendering i.e. to re-render only a limited portion of a page.

Working of PPR :-

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

PPR is a three step process:

1) Partial page event

Partial page events are quite similar to full page events. However,

Page 80: OAF Training Material

there are two important differences between partial and full page

events. First, partial page events specify partial page rendering-

specific event parameters which are not present on the full page event

equivalents. For example, partial page events may include an event

parameter which identifies the set of partial targets, or nodes that

should be re-rendered.

The second difference between partial page events an full page events

is how the events are sent. Unlike full page events, partial page events

must be sent in a way which does not force the browser to reload the

current page. To implement this capability, UIX PPR uses a hidden

iframe as a communication channel between the browser and the web

application running on the middle-tier. Partial page events are sent by

forcing a navigation in the hidden iframe, which in turns causes a

request to be sent to the application on the middle-tier. Since the

iframe is hidden, the process of sending a partial page event and

rendering partial page contents can take place behind the scenes,

without discarding the contents of the current page.

2) Partial Page Rendering Pass

When the partial page event is received by the application, the

application responds by determining the set of partial targets to render

and performing the partial page rendering pass. The partial page

rendering pass is similar to a full page rendering pass. In both cases,

the UINode tree is traversed by calling render() on each node in the

tree. However, in the PPR case, only the contents generated by the

partial targets are actually sent back to the browser. All other contents

are dropped. So, the partial page response is generally much smaller,

since only the modified contents are sent back to the browser.

3) Partial Page Replacement

When the browser receives the partial page response, the new

contents for each partial target node are copied from the hidden

iframe into the main browser window, replacing the existing contents

for each target node. For example, in the table navigation case, rather

Page 81: OAF Training Material

than replacing the entire page, just the contents of the table itself are

replaced.

Now lets create a simple page to implement PPR. In this page, there

are 3 items (employee number, employee name & job). I have attach a

PPR event on employee number field. Hence, user will enter the emp

number and as soon as he tabs out, name and job will populate on

their respective fields without refreshing the page.

1) Create a new OA page:

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

Right click on project (xxcus) –> New –> Web Tier –> OA Components

–> select ‘Page’ item. Click OK. (This will open a popup window)

We are creating a page for implementing PPR, so specify the details of

page as below:

          Name: XxPprDemoPG

          Package: xxcus.oracle.apps.fnd.pprdemo.webui

2) Create a new view objects (VO):

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

Right click –> New View Object (This will open a wizard having 7

steps).

Step 1

         Package: xxcus.oracle.apps.fnd.pprdemo.server

         Name: XxPprDemoVO

         Choose the radio button ‘Read-only Access’ (as no DML

operation).

Click Next.

Step 2

         Enter the below query in ‘Query Statement’:

               select EMPNO, ENAME, JOB from employee

Keep defaults for step3, 4, 5, 6 & 7 and click Finish. Save All.

3) Create a new Application Module (AM):

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

Step 1

Page 82: OAF Training Material

         Package: xxcus.oracle.apps.fnd.pprdemo.server

         Name: XxPprDemoAM. Click Next.

Step 2

    Here we will add an instance of the VO created in (2). Select

XxPprDemoVO from ‘Available View Objects’ and shuttle it to ‘Data

Model’ using “>” button.

Keep defaults for all other steps (3, 4). Click Finish.

4) Create a new Controller (CO):

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

Right click on pageLayout region and create a new controller:

          Name: XxPprDemoCO

          package: xxcus.oracle.apps.fnd.pprdemo.webui

5) Creating the Page Layout & Setting its Properties :-

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

The page will appear as below:

1) Create a new region under pageLayout of type defaultSingleColumn.

2) Create 3 items under defaultSingleColumn region

(messageTextInput, messageStyledText, messageStyledText).

Now change the properties for each field from property inspector as

shown below:

pageLayout:

             ID: pageLayoutRN

             AM Definition:

xxcus.oracle.apps.fnd.pprdemo.server.XxPprDemoAM

Page 83: OAF Training Material

             Window Title: PPR Demo Page

             Title: PPR Demo

defaultSingleColumn:

            ID: singleColRN

            Text: Enter Employee Number

messageTextInput   (applied PPR event on this item):

ID: Empno

            Prompt: Employee Number

               Action Type: firePartialAction

               Event: populateFields

messageStyledText (for Employee Name):  

            ID: Ename

            Prompt: Employee Name

            View Instance: XxPprDemoVO1

            View Attribute: Ename

messageStyledText (for Job):

            ID: Job

            Prompt: Job

            View Instance: XxPprDemoVO1

            View Attribute: Job

The declarative page structure in jDev will be similar to as shown

below:

Page 84: OAF Training Material

We will capture populateFields event (PPR event) in PFR method of

controller and call the appropriate method from AMImpl class as shown

in below code snippet:

public void processFormRequest(OAPageContext pageContext,

OAWebBean webBean) {

super.processFormRequest(pageContext, webBean);

OAApplicationModule am = pageContext.getRootApplicationModule();

Page 85: OAF Training Material

if ("populateFields".equals(pageContext.getParameter(EVENT_PARAM))) {

String empNum = pageContext.getParameter("Empno");

if (!("".equals(empNum.trim()))) {

Serializable[] param = { empNum };

String result =

am.invokeMethod("firePprEvent", param).toString();

if ("N".equals(result)) {

throw new OAException("Please enter valid employee number.",

OAException.ERROR);

}

} else {

String empnum = null;

Serializable[] param = { empnum };

Page 86: OAF Training Material

am.invokeMethod("firePprEvent", param);

throw new OAException("Please enter employee number",

OAException.ERROR);

}

}

}

Code for firePprEvent method in XxPprDemoAMImpl.java file:

public String firePprEvent(String empNum) {

try {

XxPprDemoVOImpl vo = getXxPprDemoVO1();

vo.setWhereClause(null);

vo.setWhereClauseParams(null);

vo.setWhereClause("EMPNO = :1");

vo.setWhereClauseParam(0, empNum);

vo.setMaxFetchSize(-1);

vo.executeQuery();

Page 87: OAF Training Material

XxPprDemoVORowImpl row = (XxPprDemoVORowImpl)vo.first();

if (row == null) {

return "N";

}

} catch (Exception e) {

e.printStackTrace();

}

return "Y";

}

User will enter employee number and tabs out. This will auto-populate

the other two fields without full page refresh as shown below:

Page 88: OAF Training Material

How to handle PPR events in Table regions in OA Framework

Hello all,

I have one table region where I am creating 6 rows by default. Now I have a requirement wherein after selecting one poplist, I want to fire a PPR event and disable that row. In this case we have to tell OAF which row to use. We achieve this using rowReference. If anyone have similar requirement, try to use below code or get back to me.

In controller class:

String event = pageContext.getParameter("event");if (("clause").equals(event)) {// Get the identifier of the PPR event source rowString rowReference =pageContext.getParameter(OAWebBeanConstants.EVENT_SOURCE_ROW_REFERENCE);Serializable[] parameters = { rowReference };am.invokeMethod("nonEditable", parameters);}

In Application Module:

public void nonEditable(String rowReference) {

try {OAViewObject pVO = (OAViewObject) getXXBCR12TranslationVO1();

Row poRow[] = pVO.getAllRowsInRange();OARow row = (OARow)findRowByRef(rowReference);

if ("ENDIF".equals(row.getAttribute("Condition"))|| "ELSE".equals(row.getAttribute("Condition")) ) {row.setAttribute("transfielddisable", Boolean.TRUE);System.out.println("disabling field");}} catch (Exception e) {

}}