Monday, February 06, 2012
Creating EBS data from APEX using APIs (2)
In this post we will use the HR_EMPLOYEE_API to add a person.
The first thing to do is to look at the definition of the create employee call in the Oracle Integration Repository. (Login in EBS, in the navigator go to Integrated SOA Gateway, next go to Human Resource Suites > Human Resources > Employee and select Employee > Create Employee)
The second thing I tend to do is test the API in SQL Workshop in a PL/SQL anonymous block from a workspace linked to the APPS schema.
When I ran that block of code I got a ORA-01403: no data found error. I verified my call multiple times but I couldn't see what I was doing wrong. Finally I send the statement to Thierry Vergult from Popay as I was out of ideas. He told me to try a trunc around sysdate for the parameter p_hire_date.
I verified the API again and p_hire_date should be a date, sysdate in my opinion is the most known date, so I was a bit sceptic at first... but I tried it nevertheless... and it worked!
This blew me out of the water! It showed me again that the API is full of surprises and whenever you hit an issue, ask a more experienced EBS person for ideas :-)
So once that was working I included the create procedure in my apex_api_pkg.
procedure create_person (
p_hire_date in date,
p_business_group_id in number,
p_last_name in varchar2,
p_first_name in varchar2,
p_date_of_birth in date,
p_sex in varchar2,
p_email_address in varchar2,
p_employee_number in out varchar2,
p_person_id out number,
p_assignment_id out number,
p_per_object_version_number out number,
p_asg_object_version_number out number,
p_per_effective_start_date out date,
p_per_effective_end_date out date,
p_full_name out varchar2,
p_per_comment_id out number,
p_assignment_sequence out number,
p_assignment_number out varchar2,
p_name_combination_warning out boolean,
p_assign_payroll_warning out boolean,
p_orig_hire_warning out boolean
)
is
l_employee_number varchar2(4000);
l_person_id number;
l_assignment_id number;
l_per_object_version_number number;
l_asg_object_version_number number;
l_per_effective_start_date date;
l_per_effective_end_date date;
l_full_name varchar2(4000);
l_per_comment_id number;
l_assignment_sequence number;
l_assignment_number varchar2(4000);
l_name_combination_warning boolean;
l_assign_payroll_warning boolean;
l_orig_hire_warning boolean;
begin
hr_employee_api.create_employee (
p_hire_date => p_hire_date,
p_business_group_id => p_business_group_id,
p_last_name => p_last_name,
p_sex => p_sex,
p_first_name => p_first_name,
p_date_of_birth => p_date_of_birth,
p_email_address => p_email_address,
p_employee_number => l_employee_number,
p_person_id => l_person_id,
p_assignment_id => l_assignment_id,
p_per_object_version_number => l_per_object_version_number,
p_asg_object_version_number => l_asg_object_version_number,
p_per_effective_start_date => l_per_effective_start_date,
p_per_effective_end_date => l_per_effective_end_date,
p_full_name => l_full_name,
p_per_comment_id => l_per_comment_id,
p_assignment_sequence => l_assignment_sequence,
p_assignment_number => l_assignment_number,
p_name_combination_warning => l_name_combination_warning,
p_assign_payroll_warning => l_assign_payroll_warning,
p_orig_hire_warning => l_orig_hire_warning
);
end create_person;
The finally step was to add a form on my page with the items and a process that calls the API.
The page process Create User looks like this:
Running the page shows you the create form.
Note that I didn't make all fields visible, just the fields to get the proof of concept working.
In this post we called the API to create a person from within an APEX page. The catch here was to trunk the p_hire_date parameter.
Previous related posts:
Posted by
Dimitri Gielis
at
20:09
5
comments
Sunday, February 05, 2012
Updating EBS data from APEX using APIs (1)
Next to that the EBS APIs seems to be well documented. I first didn't realise, but for a long time I was using the Oracle Integration Repository for EBS R11 (whereas I'm using R12).

For EBS R12 the Oracle Integration Repository ships as part of the E-Business Suite. To access it, in the Navigator menu, select the Integrated SOA Gateway responsibility, then click on the Integration Repository link.
Using the Oracle Integration Repository I would have found it more useful if I could define the number of results (maybe you can, but I didn't find that setting). At the moment I get only 10 results at a time, which is too low for me.
I also found it not that easy to find the right API to use. I guess it comes by experience. Next to that, the parameters are not always the same, so the API could be more consistent.
For example I want to create and edit a person. In the navigator I went to Human Resources Suite > Human Resource. That was logic for me. Next I looked into the list and saw Employee, so that was a logic choice for me. In there I found the HR_EMPLOYEE_API. That API allows to create an employee. So far so good, but where is the edit? I couldn't really find it, until I asked a friend and he told me to look for person. So when I went to HR Person(1) in the navigator I saw the HR_PERSON_API and in there you find the update and delete of a person.
When you look at the parameters; in HR_EMPLOYEE_API.CREATE_EMPLOYEE you see a parameter p_per_comments, in HR_PERSON_API.UPDATE_PERSON you see a parameter p_comments. It would have been easier if the parameters were consistent.
So once I got familiar with APIs, I started with the integration in my APEX app. Here are the steps to drill-down into a person from the people report (see previous post) and edit his or her email address.
Just as with the views I find it a good practice to not grant execute on the entire libraries of EBS to your own schema. I prefer to create my own packages in the APPS schema e.g. apex_api_pkg and call the correct API calls from there. The advantage is that you can add logging to your own package or do some other extra logic in there. For example APEX passes typically back values as strings, but some API calls need to be passed (next to varchar2) as a date, a number or a boolean. So you could choose to have all input strings in varchar2 in the apex_api_pkg and do the conversion inside the package to the correct one. In the below code I didn't do that, instead I went for an almost 1-on-1 mapping.
create or replace package apex_api_pkg
as
procedure update_person_email (
p_effective_date in date,
p_datetrack_update_mode in varchar2,
p_person_id in number,
p_email_address in varchar2,
p_object_version_number in out number,
p_employee_number out varchar2,
p_effective_start_date out date,
p_effective_end_date out date,
p_full_name out varchar2,
p_comment_id out number,
p_name_combination_warning out boolean,
p_assign_payroll_warning out boolean,
p_orig_hire_warning out boolean
);
end apex_api_pkg;
/
create or replace package body apex_api_pkg
as
procedure update_person_email (
p_effective_date in date,
p_datetrack_update_mode in varchar2,
p_person_id in number,
p_email_address in varchar2,
p_object_version_number in out number,
p_employee_number out varchar2,
p_effective_start_date out date,
p_effective_end_date out date,
p_full_name out varchar2,
p_comment_id out number,
p_name_combination_warning out boolean,
p_assign_payroll_warning out boolean,
p_orig_hire_warning out boolean
)
is
l_object_version_number number;
l_employee_number varchar2(4000);
l_effective_start_date date;
l_effective_end_date date;
l_full_name varchar2(4000);
l_comment_id number;
l_name_combination_warning boolean;
l_assign_payroll_warning boolean;
l_orig_hire_warning boolean;
begin
l_object_version_number := p_object_version_number;
hr_person_api.update_person (
p_effective_date => p_effective_date,
p_datetrack_update_mode => p_datetrack_update_mode,
p_person_id => p_person_id,
p_email_address => p_email_address,
p_object_version_number => l_object_version_number,
p_employee_number => l_employee_number,
p_effective_start_date => l_effective_start_date,
p_effective_end_date => l_effective_end_date,
p_full_name => l_full_name,
p_comment_id => l_comment_id,
p_name_combination_warning => l_name_combination_warning,
p_assign_payroll_warning => l_assign_payroll_warning,
p_orig_hire_warning => l_orig_hire_warning
);
end update_person_email;
end apex_api_pkg;
/
The next thing is to grant execute privileges on this package to your own user which is linked to your APEX workspace:
grant execute on apex_api_pkg to apex_ebs;
In the APEX application we create a new Form based on this procedure. I found that the APEX wizard didn't work in my case (but more on that in another post). I created a new Blank Page, add a region to it and a couple of items.
select full_name, email_address, effective_start_date, employee_number, object_version_number
into :P2_FULL_NAME, :P2_EMAIL_ADDRESS, :P2_EFFECTIVE_DATE, :P2_EMPLOYEE_NUMBER, :P2_OBJECT_VERSION_NUMBER
from apex_per_people_vw
where person_id = :P2_PERSON_ID;
When you hit the Apply Changes button I want the email address to update, that is why we have the Update email Process in Page Processing. The PL/SQL code is as follows:
declare
l_object_version_number number;
l_employee_number varchar2(4000);
l_effective_start_date date;
l_effective_end_date date;
l_full_name varchar2(4000);
l_comment_id number;
l_name_combination_warning boolean;
l_assign_payroll_warning boolean;
l_orig_hire_warning boolean;
begin
l_object_version_number := to_number(:P2_OBJECT_VERSION_NUMBER);
apps.apex_api_pkg.update_person_email (
p_effective_date => to_date(:P2_EFFECTIVE_DATE, 'DD-MON-YYYY'),
p_datetrack_update_mode => :P2_UPDATE_MODE,
p_person_id => to_number(:P2_PERSON_ID),
p_email_address => :P2_EMAIL_ADDRESS,
p_object_version_number => l_object_version_number,
p_employee_number => l_employee_number,
p_effective_start_date => l_effective_start_date,
p_effective_end_date => l_effective_end_date,
p_full_name => l_full_name,
p_comment_id => l_comment_id,
p_name_combination_warning => l_name_combination_warning,
p_assign_payroll_warning => l_assign_payroll_warning,
p_orig_hire_warning => l_orig_hire_warning
);
end;
I just do the necessary to update the email, I don't do that much yet with the output parameters, but you could transfer that back to the page if you wanted to. Also note that the package is in the APPS schema, so don't forget to add the owner in front of it. You could create a synonym in your own schema if you preferred. For the view I find it important to have those in my own schema too, for packages only if I wanted to add some extra logic to it.
Running the page shows you the below form.
In EBS there are different ways (UPDATE, CORRECTION, UPDATE_OVERRIDE, UPDATE_CHANGE_INSERT), to update the record, as I wanted to test them out, I added the Update Mode select list to the form. An UPDATE you can only do once per day, CORRECTION is what I used to update the same record multiple times.
Note that we still didn't login into our APEX application as an EBS user, so EBS doesn't know who I'm. As EBS is keeping an audit of the records, I (the logged in APEX user) won't be seen in those audit records, instead it will be a general one (EBS sysadmin I suppose). In the next posts we will authenticate with EBS integrate tighter.
In this post the purpose was to make an EBS API call to update an email address of a person. While playing with the EBS API I came across some challenges and I had to ask for advice to more experienced EBS people. Which will also be shown in the next post; where I will create a person with the API...
Previous related posts:
Posted by
Dimitri Gielis
at
23:07
2
comments
Friday, February 03, 2012
Querying EBS data from APEX using Views
This is the first scenario, where I have an APEX application and I want to integrate with data sitting in EBS.
Pre-requisites:
- APEX is installed in the same database as EBS (see previous post).
- My APEX application (actually Workspace) is linked to my own (non-EBS) Oracle schema.
- Identify where the data is in EBS
If you are not familiar with the data model of EBS, it can be hard to find the right information. A good starting point would be the APPS schema, because that has access to the complete Oracle E-Business Suite data model. You can compare it with the SYSTEM schema, which has access to the entire database.
This pictures shows an overview of the APPS schema and base product schemas.
You can read more about the APPS schema in the EBS documentation.
In my example I wanted to find the people that are in my organisation (HR). I started to look for views that would give me that information. My first query was like this:
select object_name
from user_objects
where object_name like '%PEOPLE%'
and object_type = 'VIEW'
order by 1
That query returned 82 rows in my environment. In the results I saw e.g. ADS_PEOPLE_V, HRBG_PEOPLE, PER_ALL_PEOPLE, PER_PEOPLE, PER_PEOPLE_F etc.
I started to look at the definitions of those, but if you are not familiar with EBS it's hard to know which one is the one you need. So my recommendation would definitely be; when you are not that familiar with EBS, talk with somebody who knows more about it. For me that is the case, I only started to look into EBS and actually do something with it, a few weeks ago.
When I talked to somebody more experienced in EBS, he told me I probably wanted to look at PER_ALL_PEOPLE_F. Hmm, that wasn't in the result set of the above query. After investigating a bit more PER_ALL_PEOPLE_F is a synonym for HR.PER_ALL_PEOPLE_F.
I wanted to understand the naming convention in EBS a bit better e.g. for the PER%PEOPLE% objects.
Below I created a table how I interpret the EBS objects:View / Synonym (^) count(*) count(distinct person_id) Interpretation per_all_people_f (^) 32295 18518 Synonym to real HR table per_all_people 0 0 Needs EBS session (record in FND_SESSIONS) so it knows what you can see per_all_people_d 32295 18518 All records but shows translated text if user settings are applied per_people 0 0 Needs EBS session, shows effective records based on user's date per_people_f 32295 18518 EBS security implemented, you only see records you are allowed to see per_people_v 0 0 Needs EBS Session, includes a lot of display text and is language dependend per_people_x 18518 18518 EBS security implemented (same as per_people_f), but limits to only the effective records
(WHERE TRUNC(SYSDATE) BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE)
So to me PER_PEOPLE_X looks like a good candidate to use in my APEX application. If I'm not logged into the app as an E-Business user I still see all records that are effective at the time I run the query. - Create a view on top of the EBS views and use some naming conventions so it's easy to recognise which objects you created and are not native EBS ones.
create view apex_per_people_vw as select * from per_people_x - Grant access on that view to the schema that is linked to your APEX workspace and application
grant select on apex_per_people_vw to apex_ebs - Create a view in your own schema that selects everything from the view in the apps schema.
We do that so that the views are a one-on-one mapping between schema's, but they show up in the APEX wizards.
create view apex_per_people_vw as select * from apps.apex_per_people_vw - Create an Interactive Report on top of the view
Posted by
Dimitri Gielis
at
12:36
3
comments
Thursday, February 02, 2012
E-Business Suite and APEX integration (overview)
- In my APEX application I want to include/integrate data that exist in EBS
e.g. I want to include my employees that are in EBS HR - The EBS application needs to be customised and I use APEX to do that
e.g. I want to show a calendar with the birthdays of my employees
or I want a chart about the different age categories in my company
or I want to bulk update some information and there is no screen to do that
In both cases you want things to go seamlessly, you shouldn't be aware that you go from one technology to another. APEX and EBS data are in the Oracle database, so accessing data is not a big issue. Updating data in EBS you need to be careful with, as directly updating data through tables is not allowed (supported).
When I was reviewing ways to retrieve data from EBS and create/update/delete data in EBS from APEX I found a couple of methods that are interesting to explore further:
Retrieve data from EBS | Update data in EBS | |
1. Views | X | |
2. APIs | X | X |
3. OITs (Open Interface Tables) | X | |
4. Webservices (incl. BPEL/SOA) | X | X |
There are other ways to integrate or interface with EBS e.g. through EDI (Electronic Data Interchange) and EAI (Enterprise Application Integration), but from an APEX perspective the above four seemed to me the most interesting ones to explore further. In my next posts I will dig into integrating APEX and EBS with the above techniques.
References to interesting readings:
- Oracle Integration Repository
- Oracle Release 12.1 Documentation Library (see Integration)
- Oracle Apps Epicenter Blog
Previous related posts:
Posted by
Dimitri Gielis
at
12:41
4
comments
Wednesday, January 25, 2012
E-Business Suite and APEX installation
The white paper states; the prerequisites for the solution given are:
- Oracle E-Business Suite 12.1.3 or above
- Oracle E-Business Suite Patch 12316083
- Oracle Database 10.2.0.3 or above
- Oracle Application Express 3.2 or above
The first thing I needed was an E-Busisness Suite environment. Oracle provides some VM Templates for E-Business Suite 12.1.3. I wanted a complete demo system, like for example the HR schema in the Oracle database or the Sample Application in APEX. The VM Template for E-Business Suite includes the Vision demo.
I never installed EBs before, so I did some research how to do that. Finally I didn't proceed with installing E-Business Suite on our servers, as MCX was happy to provide us with a complete Oracle E-Business Suite 12.1.3 Vision installation on their servers. The version of the underlying Oracle database is 11.2.0.2.0. I also asked them to apply patch 12316083.
APEX needs to be installed on the same Oracle database as the Oracle E- Business suite database server.
We went with installing the latest version of APEX at the moment: APEX 4.1.
Installing APEX is not that hard, basically running some scripts. The only bit you have to be careful with is the choice of web listener. APEX supports three web listeners: mod_plsql, EPG and the APEX Listener.
The mod_plsql gateway is disabled by default by EBs R12, so you shouldn't go with that. The EPG is not recommended either as it will add additional load on the database server, so the best choice would be the APEX Listener. The APEX Listener is the recommended choice in any circumstance anyway, regardless of EBs. (on a related note; I'm giving a presentation about my experiences moving to the APEX Listener at OGh and ODTUG.)
So after installing APEX and using the APEX Listener on an EBs configuration, the architecture looks like this:
So now all the prerequisites are met and we can concentrate on the real integration part in the next post.
Previous related posts:
Posted by
Dimitri Gielis
at
16:05
8
comments
Wednesday, January 18, 2012
APEX and E-Business Suite integration
For a couple of years now companies like for example Popay integrate APEX with E-Business Suite.
The learning curve of APEX is not that high, so people with a (technical) E-Business Suite background should be up and running in no time.
In April 2011, Oracle released a whitepaper how to Extending Oracle E-Business Suite Release 12 using Oracle Application Express. Before, although it worked, you were a bit on your own incase you had issues, with the whitepaper things changed, so now you can call Oracle support as well.
In the next days I will share my experiences trying to get up-to-speed with integrating APEX with Oracle E-Business Suite. My background with Oracle E-Business Suite is limited, but I know a lot about APEX and that whitepaper should get me a big step further in integrating with E-Business Suite.
On the 15th of February, the APEX and E-Business Suite SIGs of OBUG (Oracle Benelux User Group) hold a half day (FREE) seminar about this integration too. So if you want to see this integration live or you want to hear from companies who are successful in it, come and join us. You find the agenda below:
Posted by
Dimitri Gielis
at
11:39
3
comments
Monday, December 19, 2011
SQL Developer Application Express Reports

If you want to navigate across applications, the SQL Developer reports are really useful as it's very fast to navigate. Both APEX as SQL Developer have their strengths. If you can't find the information you need, you can also write a query yourselves based on the APEX dictionary.
Posted by
Dimitri Gielis
at
22:47
3
comments
Tuesday, November 29, 2011
APEX-Challenge.com statistics November
Summary for Oracle Application Express Weekly APEX Quiz
Played between 5 November 2011 and 12 November 2011
Total # of players: 149
Total # of answers submitted: 149
100% correct submissions: 8
Average % correct: 60
5 November 2011: Leverage the APEX data dictionary views to answer questions about your application.
166 Players ♦ Avg. Correct: 60% ♦ Avg. Time: 202 seconds ♦ Rating: 4 stars
Summary for Oracle Application Express Weekly APEX Quiz
Played between 12 November 2011 and 19 November 2011
Total # of players: 142
Total # of answers submitted: 142
100% correct submissions: 15
Average % correct: 56
12 November 2011: The question shows how to correctly pass values using page items within branches and some of the limitations.
156 Players ♦ Avg. Correct: 57% ♦ Avg. Time: 129 seconds ♦ Rating: 4 stars
Summary for Oracle Application Express Weekly APEX Quiz
Played between 19 November 2011 and 26 November 2011
Total # of players: 141
Total # of answers submitted: 141
100% correct submissions: 33
Average % correct: 76
19 November 2011: To be aware of the functions and procedures contained in the APEX_UTIL package and other APEX Packages
145 Players ♦ Avg. Correct: 76% ♦ Avg. Time: 131 seconds ♦ Rating: 4 stars
If you want to see more questions, you find the library of previous questions and answers here.
Posted by
Dimitri Gielis
at
10:48
1 comments
Labels: apex-challenge.com
Monday, October 17, 2011
APEX-Challenge.com

- stay at plsqlchallenge.com
- go to apex-challenge.com
- go to apexquiz.com
Posted by
Dimitri Gielis
at
20:14
4
comments
OBUG Benelux Connect 2012
Posted by
Dimitri Gielis
at
13:32
0
comments
Labels: obug 2012
Vote for Martin @ODTUG board
Last Oracle Open World Martin (Giffy D'Souza, left on the picture) told me he was running for the ODTUG board and without a doubt, I told him I would support him.
Posted by
Dimitri Gielis
at
09:47
0
comments
Labels: odtug board
Monday, October 10, 2011
APEX Meet-up OOW 2011
On Tuesday we had our 6th APEX Meet-up at Oracle Open World (OOW).
Posted by
Dimitri Gielis
at
13:42
2
comments
Labels: apex meetup, oow11
Thursday, October 06, 2011
APEX in the Cloud
With today's announcement of the Oracle Database Cloud, it also means Oracle gives a strong message towards the APEX community.


Posted by
Dimitri Gielis
at
02:59
1 comments
Wednesday, October 05, 2011
Live from the OOW11 Keynote
I'm writing this post while the keynote is going on... I'll update this post while we go on.

There you go, Larry comes on stage... now it will start to be interesting.

Great jokes of Larry about "False Clouds". Something like "you check data in, but you can't check it out!", "you take the plane and are in the clouds, but can't get out the plane/cloud anymore".


Thursday, September 22, 2011
Downloading Oracle software from linux server with wget
When I need to install software on a linux server, I locate all the software I need and start downloading it.


Posted by
Dimitri Gielis
at
23:43
3
comments
Labels: wget
Wednesday, September 21, 2011
Updates on APEXBlogs
Some of you might have seen that APEXBlogs wasn't updated with twitter messages anymore for some time. Since last week blog posts were not taken anymore either.
I only found a little time today to look a bit closer into these issues and am happy to share with you what is going on.
The reason for not updating the blog posts was that my package produced this error:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00217: invalid character 160 (U+00A0)
Error at line 1
Although the Oracle database is running in UTF-8 and Google is sending the posts as UTF-8, it looks like it's not doing that with the blog names. The name "João Oliveira" has some bad characters which Oracle didn't understand. After changing this name in Google Reader the procedure didn't produce the error anymore and Oracle could parse the xml again.
Concerning twitter... that is a different story. It looks like the APEXBlogs is banned to use the Twitter API. As I didn't take out the twitter api calls from the hourly sync, we stayed banned and it got worse I guess.
Although I thought I followed the guidelines of using the API, I'll change the syncing of twitter message to do it less frequently so we aren't blacklisted again in the future. The syncing worked for many months, so Twitter must have changed their policies.
Today I asked Twitter to remove APEXBlogs.info from the blacklist so hopefully the twitter syncing will work again in a few days.
Posted by
Dimitri Gielis
at
21:34
0
comments
Labels: apexblogs
Wednesday, September 14, 2011
APEX Meetup @ OOW 2011
Posted by
Dimitri Gielis
at
15:14
4
comments