Wednesday, October 3, 2018

Connecting Python to Oracle


Recently i started learning python and ran it to issue while connecting python to oracle  database.
It took me almost 1.5 hours to establish a connection from a python script to the Database I know.

Biggest challenge for the developer is  knowing the


First Step:
The below query will give you the host name and Port no(Type=Local Listener)

select * from v$listener_network;


To get the SID user the below query
select instance_name "SID" from v$instance

User pip to install cx_oracle


import cx_Oracle

dsn_tns = cx_Oracle.makedsn('Hostname', 'portno', 'SID')
conn = cx_Oracle.connect(user='APPS', password='PWD', dsn=dsn_tns)


ver = conn.version.split(".")
print(ver)
print(ver[0])
print(ver[-1])
print(ver[1:4])

conn.close()

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



Begin
Null;
--keep your code
EXCEPTION
when others then

dbms_output.put_line(l_progress
'-when other exception'
DBMS_UTILITY.FORMAT_ERROR_STACK
'@'
DBMS_UTILITY.FORMAT_CALL_STACK);
END;

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))
Period1_status_frcst,
MAX (DECODE (ROWNUM, 2, display_forecast, NULL))
Period2_status_frcst,
MAX (DECODE (ROWNUM, 3, display_forecast, NULL))
Period3_status_frcst,
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
FROM ( SELECT CASE
WHEN sysdate > end_date
THEN
'P'
WHEN sysdate BETWEEN start_Date
AND end_date
THEN
'C'
ELSE
'F'
END
display_forecast,
period_name,
start_date,
end_date,
quarter_num
FROM gl_periods
WHERE period_set_name = 'Fiscal Year'
AND ADJUSTMENT_PERIOD_FLAG = 'N'
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'
AND ADJUSTMENT_PERIOD_FLAG = 'N')
OR (quarter_num, period_year) IN
(SELECT DECODE (quarter_num, 4, 1, quarter_num + 1),
DECODE (quarter_num,
4, period_year + 1,
period_year)
FROM gl_periods
WHERE sysdate BETWEEN start_date
AND end_Date
AND period_set_name = 'Fiscal Year'
AND ADJUSTMENT_PERIOD_FLAG = 'N')
)
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();
cellBGColor.setProperty("color","#FF0000");
#FF0000--red color
OAMessageStyledTextBean field12=(OAMessageStyledTextBean)webBean.findChildRecursive("field12");

if(field12 != null )
field12.setInlineStyle(cellBGColor);

-----------------------------------------------------------------

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
rowlineVo.setAttribute("color","OraBGGrayMedium");


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

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 (rs.next())
{
java.sql.Date date = rs.getDate("date1");
--get the date field handler
OAMessageDateFieldBean dateField = (OAMessageDateFieldBean)webBean.findIndexedChildRecursive(stat_date);
--set the minimun value
dateField.setMinValue(date);
}
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 subscription..one of them is using java command wfx load or using packages

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

Subscriptions:

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

$AFJVAPRG oracle.apps.fnd.wf.WFXLoad -u apps apps machine_name:port_no:SID thin US Custom_File_Name.wfx

TO force upload a Subscription:

$AFJVAPRG oracle.apps.fnd.wf.WFXLoad -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


wf_event_pkg
wf_event_subscriptions_pkg

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.


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

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..




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


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 notifications.it 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
AME_TRANS_APPROVAL_HISTORY
AME_TEMP_OLD_APPROVER_LISTS



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

Ame_Api2.GetNextApprover()
Ame_Api2.GetAllApprover()

Sunday, July 31, 2011

Script to list All OAF personalizations in the system

Use the below script to list all personalizations in the sytem.
We then can use the functional administrator to disable the personalizations in case it is required.

This would be very useful script at the functional administrator doesnt' provide % search capabilities

I got this from metalink and putting it here for quick reference

SELECT PATH.PATH_DOCID PERZ_DOC_ID,
jdr_mds_internal.getdocumentname(PATH.PATH_DOCID) PERZ_DOC_PATH
FROM JDR_PATHS PATH
WHERE PATH.PATH_DOCID IN
(SELECT DISTINCT COMP_DOCID FROM JDR_COMPONENTS
WHERE COMP_SEQ = 0 AND COMP_ELEMENT = 'customization'
AND COMP_ID IS NULL)
ORDER BY PERZ_DOC_PATH;

How to get VO substituion details??/JDR_UTILS

we can use jdr_utils to get OAF personalization details.
Normally page level personalization's are done at different levels and we need to explicitly migrate the personalization file.

For VO Substitutions we normally do a jpx import.
Even the VO susbtiution are also personalization's at site level.If we migrate the personalization's of VO object, substitution can also be taken care.

Give the the VO path name to know whether it is substituted or not
declare
begin
jdr_utils.listcustomizations('/oracle/apps/pos/isp/server/PosHomeQuickSearchVO');
end;

To check what is the substitution
declare
begin

jdr_utils.printdocument('/oracle/apps/pos/isp/server/customizations/site/0/PosHomeQuickSearchVO');
end;

--To delete a substitution
.
declare
begin

jdr_utils.deleteDocument('/oracle/apps/pos/isp/server/customizations/site/0/PosHomeQuickSearchVO');
end;

We can use the above three commands to know about all the personalization's on a page,details of personalization's and programmatic way of deleting them

Wednesday, March 23, 2011

Sql Query for Operating unit,Chart of Accoutns,Segments and valuesets

Hi All,
Now a days i am spending a lot of time for getting data from some generic sql queries
Going forward i want post the generic sql which we require in our development activities.I will tag all of them under useful Application queries


R12:
select hou.name,application_column_name,segment_name,flex_value_set_id
from apps.hr_operating_units hou,
apps.gl_ledgers gled,
FND_ID_FLEX_SEGMENTS
where ledger_id=set_of_books_id
and id_flex_code='GL#'
and id_flex_num=gled.CHART_OF_ACCOUNTS_ID
and hou.organization_id=4

Monday, December 27, 2010

Key profiles for OAF personalizations

All the times i forget these profiles always google out for them..just putting it here for quick reference


Profile Name:Personalize Self-Service Defn
– Yes enables personalization link on all pages..This should be no in Production environment.for development team also it is better to set it yes at the user level

THis will enable the personalize page on the left side top corner.This allows us to do personalizations
from the page itself


Profile Name:FND: Personalization Region Link Enabled
– Yes displays all regional links
– Minimal displays key regional links
Itis do get the personalize link at the region level

Profile Name:Disable Self-Service Personal
– Turn off all personalizations

Profile Name:FND: Personalization Document Root Path
– Used for importing/exporting personalizations

Profile Name:FND: Diagnostics
– Activates the link called About this Page at
bottom left of page

Profile Name:FND:OA:Enable Defaults
– Allows defaulting through personalizations to
take place

Thursday, December 9, 2010

Steps to Move OA page personalizations at responsibility/Organization level

Hi All,

Coming to OA page personalization always becareful while defining personalization's .
Dont define personalizations at responsibility level\organization level unless and until it is absolutely required.Because deploying personalizations between instances would be tedious work for the ones defined at organization and responsibility level

1.List all the personalization at the responsibility level for the page

2.export the personalization from the source instance

3.move the personalization.jar/zip files to the target instance

4.unzip the files in the target instance

5.rename the folder names with the corresponding responsibility id’s in the target instance
Use this sql to get the responsibility id in the target instace
select responsibility_key,responsibility_id
from fnd_responsibility
where responsibility_key='XX_CUST_REP'

Rename the folder with target instance responsibity id
/oracle/apps/pa/project/webui/customizations/responsibility/60781/MyProjectsPG

60781 folder need to renamed with responsibility id of the target instance like 77876

Note: In case the responsibility key also differs between the instances the page.xml file(personalization file) need to be changed by replacing the responsibility key with corresponding responsibility key

6.Import personalizations

we need to use funtional administrator responsibility/personalization tab/export and import personalization

Friday, December 3, 2010

Intro to Interfaces --Part2

Continuing with my earlier post long way back...
Let see what are inbound interfaces

inbound interfaces:Inbound interfaces where data comes into our systems.so when ever we are moving from Legacy system to oracle applications
we need to move the data residing in that system(master and transactional data) from legacy to new oracle apps system

Inbound are broadly classified in to two types

1.Interfaces
2.Conversion

Conversion:Conversion is a one time activity where we move the data from the legacy system to oracle applications

Interface:Is a integration between oracle applications and any other third party application which will exists even after migrating
to the new oracle apps systems

Lets talk about conversion

In a typical conversion process we will load data provided by the client team into oracle applications
Usually data is provided in the dat format or in excel(*.csv)
THe usual steps involves in a conversions are

1.Load the Dat/csv files into a staging table--This step is done using external tables/sqlloader
2.Perform the basic validations on the data at staging table
3.Derive any data required based on conditional logic/or defaulting some of the coulmns
4.mark the valid records in the staging table
5.pull all the valid records and insert into open interface tables/call API's
6.if data is loaded into interface tables run the standard interface program pragmatically/submitted as a part of the request set
8.once the interface program runs check whether any records are left in the open interface tables with error state
9.update the corresponding staging table with the error status and error message
10.pull all the error records from the staging table and generate a error records report with the corresponding error message

Typical conversion examples are item,customer,supplier etc..


One of the conversion approaches we have taken recently where the data volume is very high is

we divided the program into two step process
1.load data
2.program to validate and load data.

This process was very useful when we have more custom validations before loading data into system
so we developed the custom program to run in two modes.
1.validation mode
2.validation and insert mode

for this process we will have a processed column in the staging table.we load data with N status
once we validate data we mark the records as V and error records CE--custom validation error


in validation mode we just validate the custom data loaded in the staging table and generate the error report based on the
custom validation logic and mark the records as V or CE

In validation and insert mode we pick all the records marked as v and N.Validation logic's are performed on records which are in
N status only.we load load all the records marked as V and then load open interface/call api

By following this process we avoid multiple iterations for the conversion process.

Conversion process itself is multiple iterative process where we clean data by performing multiple mock conversions.
add validations:
The best approach is have the concurrent program to switch on and off the validation when ever required.
Normally we will have around 2-3 mock conversions before we load data in the production system
if we have option to switch off validation..we can switch of them if they are very time consuming because by the time we go to production
we would have cleaned our data.

Friday, October 1, 2010

Basics of Business events

HI All,
some basics syntax and statements to work with business events..

Business Events:
Business event is an activity in the system which is of some significance .Like creating a purchase order, booking a sales order or ship confirming one.

Subscription:

A subscription is action that needs to be performed on occurrence of the business event



What are the standard parameters for the procedure to be subscribed to business events?The custom plsql code should be a packaged function.
It will have two default parameters
1. P_susbcription_guid raw data type
2. P_event the event data

FUNCTION xx_test
( p_subscription_guid IN RAW , p_event IN OUT NOCOPY wf_event_t) RETURN VARCHAR2


How to get the Event Data if the data type is Rule or message? l_event_name := p_event.getEventName();
l_event_key := p_event.getEventKey();

How to get the parameters defined along with the business event?
l_parameter_list WF_PARAMETER_LIST_T ;

l_parameter_list:=p_event.getParameterList();

IF l_parameter_list IS NOT NULL THEN

FOR i IN l_parameter_list.FIRST .. l_parameter_list.LAST
LOOP

INSERT INTO XX_PARAM_NAME_VALUES
VALUES(l_parameter_list(i).getName() , l_parameter_list(i).getValue());

END LOOP;

ELSE
Dbms_output.put_line(‘No parameters’);
END IF;

How to get a value of a parameter?
p_event.getparameter(parametername)
p_event is the value passed to the procedure from the subscription.

How to raise a custom Business Event?
wf_event.raise( p_event_name => '',
p_event_key => '',
p_event_data => l_eventdata,
p_parameters => l_parameter_list);


Event data need to be populated only when the subscription requires message data
l_message := wf_event.test('');

This above function will provide whether any of the subscription requires business event data or not
if l_message = 'KEY' then
-- Raise the Event
wf_event.raise( p_event_name => ,
p_event_key => ,
p_parameters => l_parameter_list);
else
if l_message = 'MESSAGE' then
if l_xmldocument is not null then
dbms_lob.createtemporary(l_eventdata, FALSE,
DBMS_LOB.CALL);
dbms_lob.write(l_eventdata, length(l_xmldocument), 1 ,
l_xmldocument);
-- Raise the Event with the message
wf_event.raise( p_event_name => '',
p_event_key => '',
p_event_data => l_eventdata,
p_parameters => l_parameter_list);
else
-- Raise the Event without the message
wf_event.raise( p_event_name => '',
p_event_key => '',
p_parameters => l_parameter_list);
end if;


end if;


How to add parameters to the business event while raising a business event?procedure AddParameterToList
(p_name in varchar2,
p_value in varchar2,
p_parameterlist in out wf_parameter_list_t);
wf_event.addparametertolist(p_name=>’userid’,p_valehue=>’100’,p_parameterlist=>l_parameter_list);
use the above statement before wf_Event.raise

Wednesday, September 29, 2010

Concurrent Programs Business Events

In R12 for concurrent programs submission and completion has business events associated with them
in the concurrent program definition form there is a business events tab which displays the list of events associated

Here you specify the points at which business events are enabled. The possible points are:
Request Submitted
Request On Hold
Request Resumed
Request Running
Program Completed
Post Processing Started
Post Processing Ended
Request Completed

But make sure you set the profile "Concurrent: Business Intelligence Integration Enable". You will need to Set "Yes" to enable Business Events from Concurrent Processing System

After this you create a susbcription for this and can launch the required custom action either a work flow launch or plsql code exectuion

Tuesday, September 28, 2010

Special Characters in XML

Recently we are faced a issue with some spanish,french(special charecters) in the data .
we are developing the reports using xmlpublisher and the xml data is generated using plsql.
Because of the special characters the concurrent program is ending in warning state with no output generated. even the xml output is errroing out.

To overcome this scenario we need to add encoding tag to the xml
By default it will be UTF-8 which will support mostly english.for normal spanish characters and others all we need to have is different endcoding like Windows-1252, ISO-8859-1 specified.
The encoding tag should be mentioned as the first tag



once we put the encoding attribute, the xml file should open normally in explorer.

For Chinese and Arabic characters if this doesn't work try out "UTF-16"

Sunday, May 16, 2010

Oracle Procure to Pay Technical Flow

Hi All,
it is taking long time for to write on my blog due to some personal constraints and work load.. :)

going forward i will try to publish atleast 2 to 3 post per month



Saturday, September 12, 2009

Migrating workflow between instances

Hi All,
There are two way of migrating workflow definitions between instances.
1.open the workflow in the workflow builder and using save as in to the target system


second way is using wfload

select * from wf_item_types_tl to the get the workflow short name

WFLOAD apps/apps 0 Y DOWNLOAD REQAPPRV --download eqappv_final.wft

ftp the reqappv_final.wft to the target instance

WFLOAD apps/apps 0 Y UPGRADE

Oracle workflow standard activities

Hi All,
here i a putting all standard activities of workflow builder from the developer guide..
this is basically for a quick refernce(interview perpective)..just go through all once so that you know what all can be done easily in the workfkow..for details
plz check the oracle workflow developer guide ..

AND/OR Activities:
In cases where multiple parallel branches transition to a single node,
you can decide whether that node should transition forward when any
of those parallel branches complete or when all of the parallel branches
complete.


Comparison Activities:
compare date: Use to compare the value of an item type attribute of type Date with a constant date.
compare time:Use to compare the value of an item type attribute of type Number with a constant number.
comparte text: Use to compare the value of two item type attributes of type Text.



Compare Execution Time Activity:
The Compare Execution Time activity provides a standard way to compare the elapsed execution time of a process with a constant test
time.


Wait Activity:
The Wait activity pauses the process for the time you specify. You can
either wait until:
• a specific date
• a given day of the month
• a given day of the week
• a period of time after this activity is encountered



Block Activity:
The Block activity lets you pause a process until some external program or manual step completes and makes a call to the CompleteActivity
Workflow Engine API.

Defer Thread Activity:
The Defer Thread activity defers the subsequent process thread to the background queue without requiring you to change the cost of each
activity in that thread to a value above the Workflow Engine threshold.


Launch Process Activity:
The Launch Process activity lets you launch another workflow process from the current process. This activity calls the PL/SQL procedure
named WF_STANDARD.LAUNCHPROCESS.


Noop Activity:
The Noop activity acts as a place holder activity that performs no action. You can use this activity anywhere you want to place a node
without performing an action.

Loop Counter Activity:
Use the Loop Counter activity to limit the number of times the Workflow Engine transitions through a particular path in a process.
The Loop Counter activity can have a result of Loop or Exit.


Start Activity:
The Start activity marks the start of a process and does not perform any action. Although it is not necessary, you may include it in your process
diagram to visually mark the start of a process as a separate node.

End Activity:
The End activity marks the end of a process and does not perform any action. You can use it to return a result for a completed process by
specifying a Result Type for the activity.


Role Resolution Activity:
The Role Resolution activity lets you identify a single user from a role comprised of multiple users. In a process diagram, place the Role
Resolution activity in front of a notification activity and specify the performer of that notification activity to be a role consisting of several
users.

Notify Activity:
The Notify function activity lets you send a notification, where the message being sent is determined dynamically at runtime by a prior
function activity. To use the Notify activity, you must model a prerequisite function activity into the process that selects one of several
predefined messages for the Notify activity to send.


Vote Yes/No Activity:
The Vote Yes/No activity lets you send a notification to a group of users in a role and tally the Yes/No responses from those users. The
results of the tally determine the activity that the process transitions to next.


Master/Detail Coordination Activities:
lets the master/detail process wait for a master/detail process to wait
Wait for Flow Activity:
Continue Flow Activity:


Assign Activity: The Assign activity lets you assign a value to an item attribute. This activity calls the PL/SQL procedure named WF_STANDARD.ASSIGN.

Get Monitor URL Activity:
The Get Monitor URL activity generates the URL for the Workflow Monitor diagram window and stores it in an item attribute that you
specify. This activity calls the PL/SQL procedure named WF_STANDARD.GETURL.