September 10th, 2011

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.

September 6th, 2011

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.

September 5th, 2011

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.

September 1st, 2011

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.

August 29th, 2011

The advantages of the use of Application Package PeopleCode

Recently we had to make quite some customizations in Vanilla PeopleCode in the ePerformance module of HCM. In this case we decided to use an Application Package. We decided to put all our code for the modifications in a class. This worked out quite elegant.
We created a component object in the PostBuild PeopleCode of the Component.

Example:

    import KP_EP_FUNCTIONS:BonusSheetCalc;

    &oBonusSheetCalc = create KP_EP_FUNCTIONS:BonusSheetCalc(&sBonusStat);

In the private section we could put all the variables, which we would put normally as component variables. Example:

   private

   instance boolean &bBnsMtxChg;
   instance boolean &bEditStat;
   instance Rowset &rsBnsShtTgtDpt;

Then at every piece of PeopleCode where we need to use one of the methods, we only needed to put the declaration of the component object and all the defined methods and variables are then available:

   Component object &oBonusSheetCalc;
   &oBonusSheetCalc.SavePreChange(EP_APPR.PERIOD_BEGIN_DT, &PushButton);

There is a disadvantage though. If you are working in a project with several people, then only person can work on the Application Package at a time.