Archive for the ‘Technical’ Category
Fusion Applications: Extending the Domain with Oracle Directory Service Manager (ODSM)
In my previous post I described the steps to configure Oracle Internet Directory. In this post I will describe the steps you need to take to configure Oracle Directory Service Manager (ODSM). ODSM is a java application that runs as a Managed Server on Weblogic and it’s purpose is to manage Oracle Internet Directory and Oracle Virtual Directory.
PeopleSoft Quick-Tip: Find all objects in a project
Just a SQL quick-tip for an overview of all the objects in your project.
This is one possible SQL statement to get the PeopleSoft objects from your PeopleSoft project:
SELECT (CASE OBJECTTYPE WHEN 0 THEN 'Record'
WHEN 1 THEN 'Index'
WHEN 2 THEN 'Field'
WHEN 3 THEN 'Field Format'
WHEN 4 THEN 'Translate Value'
WHEN 5 THEN 'Pages'
WHEN 6 THEN 'Menus'
WHEN 7 THEN 'Components'
WHEN 8 THEN 'Record PeopleCode'
WHEN 9 THEN 'Menu PeopleCode'
WHEN 10 THEN 'Query'
WHEN 11 THEN 'Tree Structures'
WHEN 12 THEN 'Trees'
WHEN 13 THEN 'Access group'
WHEN 14 THEN 'Color'
WHEN 15 THEN 'Style'
WHEN 16 THEN 'N/A'
WHEN 17 THEN 'Business process'
WHEN 18 THEN 'Activity'
WHEN 19 THEN 'Role'
WHEN 20 THEN 'Process Definition'
WHEN 21 THEN 'Server Definition'
WHEN 22 THEN 'Process Type Definition'
WHEN 23 THEN 'Job Definitions'
WHEN 24 THEN 'Recurrence Definition'
WHEN 25 THEN 'Message Catalog'
WHEN 26 THEN 'Dimension'
WHEN 27 THEN 'Cube Definitions'
WHEN 28 THEN 'Cube Instance Definitions'
WHEN 29 THEN 'Business Interlink'
WHEN 30 THEN 'SQL'
WHEN 31 THEN 'File Layout Definition'
WHEN 32 THEN 'Component Interfaces'
WHEN 33 THEN 'AE program'
WHEN 34 THEN 'AE section'
WHEN 35 THEN 'Message Node'
WHEN 36 THEN 'Message Channel'
WHEN 37 THEN 'Message'
WHEN 38 THEN 'Approval rule set'
WHEN 39 THEN 'Message PeopleCode'
WHEN 40 THEN 'Subscription PeopleCode'
WHEN 41 THEN 'N/A'
WHEN 42 THEN 'Component Interface PeopleCode'
WHEN 43 THEN 'AE PeopleCode'
WHEN 44 THEN 'Page PeopleCode'
WHEN 45 THEN 'Page Field PeopleCode'
WHEN 46 THEN 'Component PeopleCode'
WHEN 47 THEN 'Component Record PeopleCode'
WHEN 48 THEN 'Component Rec Fld PeopleCode'
WHEN 49 THEN 'Image'
WHEN 50 THEN 'Style sheet'
WHEN 51 THEN 'HTML'
WHEN 52 THEN 'Not used'
WHEN 53 THEN 'Permission List'
WHEN 54 THEN 'Portal Registry Definitions'
WHEN 55 THEN 'Portal Registry Structures'
WHEN 56 THEN 'URL Definitions'
WHEN 57 THEN 'Application Packages'
WHEN 58 THEN 'Application Package Peoplecode'
WHEN 59 THEN 'Portal Registry User Homepage'
WHEN 60 THEN 'Problem Type'
WHEN 61 THEN 'Archive Templates'
WHEN 62 THEN 'XSLT'
WHEN 63 THEN 'Portal Registry User Favorite'
WHEN 64 THEN 'Mobile Page'
WHEN 65 THEN 'Relationships'
WHEN 66 THEN 'Component Interface Property Peoplecode'
WHEN 67 THEN 'Optimization Models'
WHEN 68 THEN 'File References'
WHEN 69 THEN 'File Type Codes'
WHEN 70 THEN 'Archive Object Definitions'
WHEN 71 THEN 'Archive Templates (Type 2)'
WHEN 72 THEN 'Diagnostic Plug In'
WHEN 73 THEN 'Analytic Model'
ELSE 'UNKNOWN OBJECT TYPE' END) AS OBJECTTYPE
, RTRIM(RTRIM(OBJECTVALUE1) || '.' || RTRIM(OBJECTVALUE2) || '.' || RTRIM(OBJECTVALUE3) || '.' || RTRIM(OBJECTVALUE4),'.') OBJECTNAAM
FROM PSPROJECTITEM
WHERE PROJECTNAME = 'RFC123456' --- Replace with your project name...
ORDER BY OBJECTTYPE, OBJECTVALUE1, OBJECTVALUE2, OBJECTVALUE3;
Just note the following line and replace it with the desired project name
WHERE PROJECTNAME = 'RFC123456' --- Replace with your project name...
The output could be something like this, for a small project:
OBJECTTYPE OBJECTNAAM
AE program TEMP
AE section TEMP.MAIN
Job Definitions TEMP
Process Definition Application Engine.TEMP
Recurrence Definition Something about TEMP
AE PeopleCode TEMP.MAIN GBLdefault 1900-01-01.Step01.OnExecute
Very useful for documenting purposes, for example!
Disclaimer: this code is in use with us for a long time, but the origin of this code may very well be the interwebs…so hereby credit where credit’s due.
A different way of creating workflow items within an Application Engine program.
When you want to create workflow items in an Application Engine program, you have to build a component, that will generate the workflow items. In the Application Engine program you will use a component interface to make use of the component.
Often when you have to loop through data and update data using a component interface in an Application Engine program, you will create a loop and within the loop you will perform a component interface “get” for every item you want to update or you want create a workflow item for.
We tried out a different approach, where we created a component with a grid, in which we loaded all the items where we wanted to create a workflow item for. So we needed to open the component interface only once. In the Application Engine we looped through the buffer and performed a save for every record in the grid:
&oSession = GetSession();
&oSession.Connect(1, “EXISTING”, “”, “”, 0);
&oKpBotsWfCi = &oSession.GetCompIntfc(CompIntfc.KP_BOTS_WF_CI);
If &oKpBotsWfCi = Null Then
Error MsgGet(30520, 2, “Bericht niet gevonden”);
End-If;
If Not &oKpBotsWfCi.Get() Then
Error MsgGet(30520, 3, “Bericht niet gevonden”);
End-If;
&oKpBotsWfVwCollection = &oKpBotsWfCi.KP_BOTS_WF_VW;
For &i = 1 To &oKpBotsWfVwCollection.Count;
If Not &oKpBotsWfCi.Save() Then;
Error MsgGet(30520, 5, “Bericht niet gevonden”, &oKpBotsWfCi.EMPLID);
End-If;
End-For;
In the component code we put PeopleCode so that at every save action, a workflow item was created for next record in the grid. To be a able to do that, we defined a component integer variable, a counter, where we kept track of the recordnumber in the grid.
In the SavePreChange PeopleCode we copied the data needed for the workflowitem to a work record on level 0 of the component buffer. Also there we incremented the counter.
Component integer &iCount;
Local Rowset &rsBots;
Local Record &rcBots;
&rsBots = GetLevel0()(1).GetRowset(Scroll.KP_BOTS_WF_VW);
&rcBots = &rsBots(&iCount).GetRecord(Record.KP_BOTS_WF_VW);
/* Fields containing input for creating workflowitems */
KP_BOTS_DERIVED.EMPLID.Value = &rcBots.EMPLID.Value;
KP_BOTS_DERIVED.KP_BOTS_ID_NBR.Value = &rcBots.KP_BOTS_ID_NBR.Value;
&iCount = &iCount + 1;
In the component workflow event we put the code to generate the workflow, which was based on the values of the fields from the work record on level 0 of the component.
PeopleTools and Oracle 11g installation issues
Until now I was used to installing PeopleSoft on SQLServer 2005/2008 or Oracle 9i/10g. For this particular installation, PeopleTools 8.51 on a Unicode Oracle 11g database, I ran into two issues I never ran into before. Luckily fixes were easy, but finding a solution usually takes a lot of time.

PeopleSoft Quick-Tip: Find navigationpath of a component
Getting lost while searching for the correct navigation path of a (custom) page or component?
Here is a quick tip to get a a breadcrumbs description of the navigation path of a specific component:
DECLARE
CURSOR c_comp
(p_comp IN VARCHAR2)
IS
SELECT DISTINCT portal_prntobjname
FROM psprsmdefn
WHERE portal_uri_seg2 = p_comp
AND portal_cref_usgt = 'TARG';
CURSOR c_object
( p_comp IN VARCHAR2
, p_object IN VARCHAR2)
IS
SELECT portal_objname
FROM psprsmdefn
WHERE portal_uri_seg2 = p_comp
AND portal_cref_usgt = 'TARG'
AND portal_prntobjname = p_object
AND portal_objname <> 'PORTAL_ROOT_OBJECT';
g_pad VARCHAR2(20000);
g_lan ps_portal_obj_lng.LANGUAGE_CD%TYPE := 'DUT';
g_object psprsmdefn.portal_objname%TYPE := 'RC_CASE_HD_SS_RPT'; --Replace component name...
l_object psprsmdefn.portal_objname%TYPE;
FUNCTION find_portal_name(p_portal IN VARCHAR2)
RETURN VARCHAR2
IS
CURSOR c_object_name
(p_object IN VARCHAR2)
IS
SELECT *
FROM ps_portal_objects
WHERE portal_objname = p_object;
CURSOR c_object_name_lng
( p_object IN VARCHAR2
, p_lan IN VARCHAR2)
IS
SELECT *
FROM ps_portal_obj_lng
WHERE portal_objname = p_object
AND language_cd = p_lan;
l_portal_name ps_portal_objects.portal_label%TYPE;
BEGIN
FOR r_object_name_lng IN c_object_name_lng(p_portal, g_lan)
LOOP
l_portal_name := r_object_name_lng.portal_label;
END LOOP;
IF l_portal_name IS NULL THEN
FOR r_object_name IN c_object_name(p_portal)
LOOP
l_portal_name := r_object_name.portal_label;
END LOOP;
END IF;
RETURN(l_portal_name);
END;
PROCEDURE search_and_find
(p_object IN VARCHAR2)
IS
CURSOR c_object
(p_object IN VARCHAR2)
IS
SELECT DISTINCT portal_objname
, portal_prntobjname
FROM psprsmdefn
WHERE portal_objname = p_object
AND portal_objname <> 'PORTAL_ROOT_OBJECT';
BEGIN
FOR r_object IN c_object(p_object)
LOOP
IF g_pad IS NULL THEN
g_pad := find_portal_name(r_object.portal_objname);
ELSE
g_pad := find_portal_name(r_object.portal_objname) || ' - ' || g_pad;
END IF;
search_and_find(r_object.portal_prntobjname);
END LOOP;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('Path(s) found for component: ' || g_object || ', Language: ' || g_lan);
FOR r_comp IN c_comp(g_object)
LOOP
g_pad := NULL;
OPEN c_object(g_object, r_comp.portal_prntobjname);
FETCH c_object
INTO l_object;
CLOSE c_object;
search_and_find(l_object);
DBMS_OUTPUT.PUT_LINE('Root - ' || g_pad);
END LOOP;
END;
Just note the following line and replace it with the desired component name
g_object psprsmdefn.portal_objname%TYPE := 'RC_CASE_HD_SS_RPT'; --Replace component name...
Note: We’re using this code for PopelTools 8.47 and it’s working fine. For PeopleSoft 9.1 and above you can use the vanilla feature as described here: Path to in PeopleSoft 9.1 with tools 8.50 and higher