Monday, June 1, 2015

Oracle Workflow:Providing Approval/Rejection for a notifcation through API's

Hi All,

Recently i got a requirement to  Overide a work flow  Approval process programmatically

Scenario:Let assume the workflow is pending with supervisor and he is not available to provide approval/rejection a oracle notification.

Possible reasons:
1.users didnt set up vaccation rules
2.Notification is timedout and pending with supervisor manager

One way to handle these scenarios is througth work flow administartor which requires a production incident and it own SLA to resolve.

There are oracle wokflow  notification API' s which allows to set the result of the notification through APIS

--Set all the notification attributes result/any comments attributes on the notification etc
wf_notification.setattrtext (nid      => l_notification_id,
                                           aname    => l_aname,
                                           avalue   => l_avalue);
--API to complete the worklfow node and move it
wf_notification.respond (l_notification_id,

This solution is usesful when the oracle approval mechanism need to be handled from third party applications

Sunday, January 6, 2013

Oracle DBMS_UTILITY error handling

Today we observed on weird issue when using one of the standard API which used work prior started giving error

ORA-06508: PL/SQL: could not find program unit being called

The easiest way to resolve this issue is by adding DBMS_UTILITY format_error_stack and format_call_stack to the when others block

This gave us the exact error of the internal package which was invalid

--keep your code
when others then

'-when other exception'

Sunday, November 11, 2012

Oracle SQL:Converting Row to Columns

Rows to columns..This is second time i came across this requirement of converting rows as columns.

I remember this question in one of the exercises in oracle OCP certification program.The solution was to use Decode and max functionality in combination

Posting it here for easy reference and for people new to oracle.

In the below query our requirement was to get the current quarter and next quarter from a custom calendar in one row..use a similar approach whenever u have similar requirement

SELECT MAX (DECODE (ROWNUM, 1, display_forecast, NULL))
MAX (DECODE (ROWNUM, 2, display_forecast, NULL))
MAX (DECODE (ROWNUM, 3, display_forecast, NULL))
MAX (DECODE (ROWNUM, 1, period_name, NULL)) Period1_disp,
MAX (DECODE (ROWNUM, 1, start_date, NULL)) Period1_start_dt,
MAX (DECODE (ROWNUM, 1, quarter_num, NULL)) Current_quarter,
MAX (DECODE (ROWNUM, 1, end_date, NULL)) Period1_end_dt,
MAX (DECODE (ROWNUM, 2, period_name, NULL)) Period2_disp,
MAX (DECODE (ROWNUM, 2, start_date, NULL)) Period2_start_dt,
MAX (DECODE (ROWNUM, 2, end_date, NULL)) Period2_end_dt,
MAX (DECODE (ROWNUM, 3, period_name, NULL)) Period3_disp,
MAX (DECODE (ROWNUM, 3, start_date, NULL)) Period3_start_dt,
MAX (DECODE (ROWNUM, 3, end_date, NULL)) Period3_end_dt,
MAX (DECODE (ROWNUM, 1, period_name, NULL)) Period1_disp_actual,
MAX (DECODE (ROWNUM, 2, period_name, NULL)) Period2_disp_actual,
MAX (DECODE (ROWNUM, 3, period_name, NULL)) Period3_disp_actual,
MAX (DECODE (ROWNUM, 4, period_name, NULL)) Period4_disp,
MAX (DECODE (ROWNUM, 4, start_date, NULL)) Period4_start_dt,
MAX (DECODE (ROWNUM, 4, end_date, NULL)) Period4_end_dt,
MAX (DECODE (ROWNUM, 4, quarter_num, NULL)) next_quarter,
MAX (DECODE (ROWNUM, 5, period_name, NULL)) Period5_disp,
MAX (DECODE (ROWNUM, 5, start_date, NULL)) Period5_start_dt,
MAX (DECODE (ROWNUM, 5, end_date, NULL)) Period5_end_dt,
MAX (DECODE (ROWNUM, 6, period_name, NULL)) Period6_disp,
MAX (DECODE (ROWNUM, 6, start_date, NULL)) Period6_start_dt,
MAX (DECODE (ROWNUM, 6, end_date, NULL)) Period6_end_dt
WHEN sysdate > end_date
WHEN sysdate BETWEEN start_Date
AND end_date
FROM gl_periods
WHERE period_set_name = 'Fiscal Year'
AND (quarter_num, period_year) IN
(SELECT quarter_num, period_year
FROM gl_periods
WHERE sysdate BETWEEN start_date
AND end_Date
AND period_set_name = 'Fiscal Year'
OR (quarter_num, period_year) IN
(SELECT DECODE (quarter_num, 4, 1, quarter_num + 1),
DECODE (quarter_num,
4, period_year + 1,
FROM gl_periods
WHERE sysdate BETWEEN start_date
AND end_Date
AND period_set_name = 'Fiscal Year'
ORDER BY start_date ASC

Saturday, November 10, 2012

OAF:Set Text Color/Highlight record

Lets discuss on some of the common requirements in custom OAF pages

When ever there is a business validation failure display the content(text) in red color/other or mark the text.
This can be achieved by defining a custom css style.

CSSStyle cellBGColor = new CSSStyle();
#FF0000--red color
OAMessageStyledTextBean field12=(OAMessageStyledTextBean)webBean.findChildRecursive("field12");

if(field12 != null )


One more requirement was to set color for the records dynamically.
Once user select and submit a record in a advanced table
the region is refreshed and the selected row should be unchecked and record should be highlighted.

That mean when the page refreshes only certain record should be highlighted.

TO achieve this we create a transient attribute in the VO
based on our condition we set the value for it.

--Code in AM
--rowlineVo --row handler
--we try to use existing styles instead of defining new one

--Process request CO
OAMessageStyledTextBean field1 = (OAMessageStyledTextBean)webBean.findChildRecursive("Field1");
OADataBoundValueViewObject css2 = new OADataBoundValueViewObject(field1, "color");

This worked with out any issues..

If you want different colors based on the data we need to use OADataBoundValueViewObject.
OADataBoundValueViewObject css2 = new OADataBoundValueViewObject(field1, "color");

The first parameter the field which we want to apply the color and the second parameter is the vo attribute which need to be used.

Oracle OAF:Date Field -set min and max date

Hi All,

Its long time i have written anything interesting..too much occupied in job and not able find time to write anything...

Now a days i am working some interesting projects.. projects just to enhance user experience in using oracle projects.

Instead of multiple clicks in OOB we are developing a single screen to perform the same transaction...
and one screen to view all the data he need.
 we are working developing Custom OAF page and integrating with Oracle OOB.

OOB-- Out of box(oracle standard pages)

One of the requirements was to control the calendar in the date field..our requirement was to stop user from selecting any date in the past.

There are multiple approaches for doing this either in complete java or JAVA and PLSQl
here i am presenting one of the approaches of getting date from DB
--Get page connection

Connection conn = pageContext.getApplicationModule(webBean).getOADBTransaction().getJdbcConnection();

--sql query

String selectSQL = "select NVL(TO_DATE (fnd_profile.VALUE ('XX_GLOBAL_DATE'),'DD-MON-RRRR'),SYSDATE) date1 FROM DUAL";

System.out.println("SQL: "+selectSQL);

--parse the sql

PreparedStatement stmt = conn.prepareStatement(selectSQL);

--execute query

ResultSet rs = stmt.executeQuery(selectSQL );

System.out.println("RS: "+rs);

while (
java.sql.Date date = rs.getDate("date1");
--get the date field handler
OAMessageDateFieldBean dateField = (OAMessageDateFieldBean)webBean.findIndexedChildRecursive(stat_date);
--set the minimun value
similary we can set the max date also ...But make sure the date is in sql date type.

But one catch is  if user dont use the calendar and type date in the field the system will allow a past date.To over come this issue
you need to have a validation logic defined either in the set attribute of the VO or a error raised from DB if you are not comfortable in java :)

Tuesday, November 15, 2011

Migration Business events and subscriptions

Migrating business events and subscriptions

How do migrate business events and of them is using java command wfx load or using packages

Business Events
$AFJVAPRG -d apps apps_pwd machine_name:port_no:SID thin US Custom_File_Name.wfx EVENTS Business_Event_Name


$AFJVAPRG -d apps apps_pwd machine_name:port_no:SID thin US Custom_File_Name.wfx SUBSCRIPTIONS Business_Event_Name

$AFJVAPRG -u apps apps machine_name:port_no:SID thin US Custom_File_Name.wfx

TO force upload a Subscription:

$AFJVAPRG -uf apps apps_pwd machine_name:port_no:SID thin US Custom_File_Name.wfx

use the below package to load business event and subscription information using script


This looks easy way for me..

use wf_event_pkg.generate to generate the xml
use that xml as input data for wf_event_pkg.recieve to create a script and migrate to other instances..

l_GUID is the event unique identifier which is available in wf_events table.

l_GUID raw(32000):='AAD7E8E4319215BFE04025ADD478036C';
l_xml_data varchar2(32000);
l_xml_data:=wf_Events_pkg.generate(l_GUID );
dbms_output.put_line ('xml data'||l_xml_data);

Use the output we got above as the input for wf_even_pkg.receive.By using the below script we can migrate the event data to other environments

The xml generated above will contain xml tags like wf_event,guid,name etc..But the some how while posting the tags are removed..

wf_Events_pkg.receive(l_xml_data );
--dbms_output.put_line ('xml data'||l_xml_data);

select * from wf_events where name like 'xxpor%'

Similarly use the wf_event_subscriptions_pkg.generate to generate susbscription xml and use the same XML as inpu to the recieve function
Always make sure you load the event before subscription.

One other way directly use the package insert_row procedures to load data.That requires data that needs to be derived

Monday, November 14, 2011

AME Basics--Intro

Whats AME and why?
Approval management engine...It gives the flexibility of defining business rules from Fron end thus reducing the customizations required in PLSQL to find the right approvers for the transactions

AME VS Workflow

There is no comparison between these two.
We can use AME in workflow to find the appprover and foward the document for approval

Can AME send notifications??

AME doesn't have any feature to send is responsibility of calling application of sending notification, capturing the response and updating AME with response

Instead of customization oracle workflow can i do customizations in AME?
I heard people saying this..But it all depends on what customizations
you can move only the customizations around identifying the approver and sending notifications.
Assume you are using normal routing approval method(without AME) and there is a customization for the Requisition to be approved by the department head in case the amount more than 10000$ we cant move only this customization to AME.
If the requisition system is moved to AME then only we can handle this requirement with a AME rule and avoid customization

How can i know which all application use's ame

we can check the user guide of the module or check the in the table
select * from AME_CALLING_APPS_TL

Important tables to get approval history/App rovers list generated by AME

AME_APPROVALS_HISTORY--This contains the list of all the approvers generated

How do we know whether AME is configured or not for a application?

Check the profile AME installed at application level.It should be set to YES

Important Ame Api's