This blog post takes you through a step-by-step guide to how to add a new menu item (that will punch out to this Knol) to the root menu of an existing responsibility using the Oracle API's (so the change can be scripted rather than done in the forms).
A completed example script (with error checking and reporting) is included.
Step 1: Getting The Responsibility Details
In order to add a new menu item you need to know which set of menus your responsiblity is currently using. To find this out you need to go into the e-Business Suite and choose the "System Administrator" Responsibility and then under Security > Responsibility choose "Define".
Search for the Responsibility you wish to use. For the purposes of this example I'm going to use the "Alert Manager" responsibility as it should be one that is installed on every instance and will have a fairly limited user base.
When you view the Responsibility you will see something like this;
Figure 1: "Alert Manager" Responsibility |
Stage 2: Adding a Simple HTML-redirect Script To Oracle
See Linking Directly to Microsoft Reporting Services from Oracle e-Business Suite (Stage 2)
Stage 3: Creating a Function using FND_FORM_FUNCTIONS_PKG.INSERT_ROW
This API provides a quick way of creating records in the FND_FORM_FUNCTIONS set of tables, in order to use the API you first need to get a new ID from the the FND_FORM_FUNCTIONS_S sequence. As we're going to be doing nothing more than a simple punch-out to Google the API call will look something like this;
fnd_form_functions_pkg.insert_row(
x_rowid => v_RowID,
x_function_id => v_Id,
x_web_host_name => null,
x_web_agent_name => null,
x_web_html_call => 'verysimpleredirect.html?redirect=http://knol.google.com/k/andy-pellew/creating-new-menu-items-in-oracle-e/',
x_web_encrypt_parameters => 'N',
x_web_secured => 'N',
x_web_icon => null,
x_object_id => null,
x_region_application_id => null,
x_region_code => null,
x_function_name => 'GOOGLEKNOL',
x_application_id => null,
x_form_id => null,
x_parameters => null,
x_type => 'JSP',
x_user_function_name => 'Google Knol Viewer', --:x_user_function_name,
x_description => 'Google Knol Viewer', --:x_description,
x_creation_date => sysdate,
x_created_by => 0,
x_last_update_date => sysdate,
x_last_updated_by => 0,
x_last_update_login => -1,
x_maintenance_mode_support => 'NONE',
x_context_dependence => 'RESP',
x_jrad_ref_path => null);
I've called the function "GOOGLEKNOL" and it's being created by the System Administrator (if you look in FND_USER it's ID 0). If you have disabled this user then it's best if you create it as someone else. You can always use your ID but I prefer to distance myself from these created objects (it's one less thing to worry about if I ever choose to leave my job and have to hand all this over to someone else!).
Unfortunately there seems to be a bug with this API in the the "Type" (FND_FORM_FUNCTIONS.TYPE) does not appear to be being written correctly into the database. In order to fix this you need to do a SQL update;
update applsys.fnd_form_functions t
set type = 'JSP'
where function_id = v_ID;
Where v_ID is the ID you retrieved from the sequence earlier.
Stage 4: Associating Function with Existing Oracle Menu
This uses the FND_MENU_ENTRIES_PKG.INSERT_ROW API as published by Oracle to hook together the new menu item with the existing menu. In stage 1 we learnt that the menu we wish to alter is called "ALR_OAM_NAV_GUI" and by querying the FND_MENUS and FND_MENU_ENTRIES tables we can get the Menu ID and the next available menu sequence number as follows;
select fm.menu_id, max(entry_sequence) + 1
from fnd_menus fm, fnd_menu_entries fme
where fm.menu_name = 'ALR_OAM_NAV_GUI'
and fm.menu_id = fme.menu_id
group by fm.menu_id;
Using these values we can call the API;
fnd_menu_entries_pkg.insert_row(
x_rowid => v_RowID,
x_menu_id => v_MenuId,
x_entry_sequence => v_EntrySequence,
x_sub_menu_id => null,
x_function_id => v_Id,
x_grant_flag => 'Y',
x_prompt => 'Google Knol Viewer',
x_description => 'View Google Knol',
x_creation_date => sysdate,
x_created_by => 0,
x_last_update_date => sysdate,
x_last_updated_by => 0,
x_last_update_login => -1);
Now we have created all the records we're almost there.
Stage 5: Running the "Compile Security" Concurrent Request
This is performed using the FND_REQUEST.SUBMIT_REQUEST concurrent request API;
apps.FND_REQUEST.SUBMIT_REQUEST(
application => 'FND',
program => 'FNDSCMPI',
argument1 => 'No')
This is function so you'll need to do something with the returned value.
Summary
After completing these steps you'll find that when you log-in and switch to the "Alert Manager" responsiblity you will have a new menu item and clicking on that will bring up this Knol;
Figure 2: Completed System |