Monday, 6 December 2021

PeopleSoft Cloud Manager 13

PeopleSoft building PeopleSoft
On 11 November 2021 Oracle posted the latest update to PeopleSoft Cloud Manager.  Cloud Manager is the PeopleSoft application which manages other PeopleSoft environments in Oracle Cloud

Here at Version 1 we use OCI to run numerous PeopleSoft systems for development, prototyping, R&D and customer demo purposes and Cloud Manager plays an important role in helping us do routine things easier and quicker.

There are 2 very interesting things I want to write about. 

Cloud Manager Self Updating 

Magic Button
The first is the Self Updating Feature of Cloud Manager.   The screenshot below shows my Cloud Manager 12 instance has detected that Image 13 is now available, downloaded and ready to apply.

This isn't the first time I've used the Manage Updates feature in Cloud Manager but this is the first time that Cloud Manager will also perform a PeopleTools upgrade of itself as part of the Make Me Current process in applying the Application Updates for Image 13.

CM Self Updating Process Steps

In summary, the Self Updating process will perform the following steps:

  1. Provision a new PUM Source Image 13 of Cloud Manager
  2. Apply any PRPs to the PUM Source Image
  3. Upgrade the Target (itself) to PeopleTools 8.59.04
  4. Create and apply a Change Package for PUM 13 to the Target
All of this in just under 4 hours !   Pretty impressive.

NOTE:  At the end of this fully automated process there is a manual step which involves running a the   This is covered in PeopleBooks and is called out in the Cloud Manager Manual Updates status page.  Two things to note:
  1. You MUST have all Environments in a Started state before running this script as one of the things this script does is it updates some scripts on each target Environment and (of course) each Environment must be available for the script to update the files.
  2. The PUM Source environment must be available (ie Running) when you run this post_upgrade_script and so make sure you don't hit the Cleanup button until after you've run this script.

Environment Infra DPK Patches

The second thing I want to call out is that Cloud Manager now supports Infra DPK Patching.   You've been able to perform PeopleTools Upgrades and Patches since Cloud Manager 6 in 2018.   Now, as of Cloud Manager 13, we can do WebLogic, Tuxedo, Java and Oracle client patching on mid-tier and Windows client nodes.  The screenshot below shows an HCM  Image 37 environment running on PeopleTools 8.59.    It shows the Current Version for the mid-tier stack and PeopleSoft Client and indicates that there is a Latest Version to apply.   The Apply process for these 2 nodes took  around 30 mins.   Very nice and now very secure!

Sunday, 11 April 2021

PeopleTools 8.59

Very excited about the latest PeopleTools 8.59 release.  Available on PeopleSoft Cloud Manager 12 from 8 April 2021 this release is packed with many new features and enhancements.

Cloud Manager 12 was released in March and so I got to work straight away installing this hoping that 8.59 was going to follow soon after.  I didn't have to wait long.

To get your hands on 8.59 you'll need Cloud Manager 12.  The CM12 install is pretty straight forward and there's some good guides out there from Oracle on how to get started.  You'll need an OCI tenancy and a little bit of cloud networking and OCI skills but you won't be able to get your hands on PeopleTools 8.59 without it so, get stuck in.  Give us a call at Version 1 if you need any help.  There's some nice features in CM12 which I've started to test and hope to write up on my experiences soon.

So, how do you get access to PeopleTools 8.59?

1) Use Cloud Manager to provision an 8.58 instance from a HCM, FSCM, Campus, ELM or CRM latest image. When I'm doing tools patches or upgrades I use the Cloud Manager Clone Environment feature to make a replica of an already provisioned Environment.  The Clone process only takes several minutes compared to nearly 2 hours to create a new Environment.  I make as many Clones as I want from the same Environment and that way I can repeat update operations to them over and over again.  This is a very nice feature! 

2) Use Cloud Manager to subscribe to the new 8.59 Linux and Windows Channels. You won't see these channels unless you upgrade to CM12 or install a fresh instance of CM12.  Once the DPKs are downloaded to your Cloud Manager Repository they are available in the \cm_psft_dpks File System mount point so if you wanted to take them on-premises I guess you could. 

3) Use Cloud Manager to perform a PeopleTools Upgrade of your PUM image.  At the time of writing (11 April 2021) the latest images are all delivered on tools 8.58.  I would expect the next HCM 38, FSCM 40, Campus 21, CRM 20 and ELM 22 images to be issued on the latest tools release but it may take a few images for the release cycle to catchup.  Until then we have to upgrade from 8.58 to 8.59 but this is super easy with Cloud Manager. 

This Upgrade PeopleTools step takes about 4 hours and it gives you plenty of time to go and do something useful.  Something like watching your 12 year old son play football in the first match after Covid-19 restrictions were lifted on outdoor sports.  They were losing 1 - 0 after a determined battle only to level it 1 - 1 in a thrilling closing few seconds of the game.  

Cloud Manager is written using Fluid so I was able to check the status of my upgrade during the match half time break.

Looking forward to exploring some exciting news features in 8.59 including 

  • Real-time Elasticsearch indexing.  Hoping that I can configure components to update the associated ES index on save.
  • Application Services Framework. Hoping to make REST web services and PeopleSoft a little bit easier to use with support for Open API standard.
  • Homepage redesign with Search front and centre.  Hoping for some innovation in UI design to shine through here.
  • Event Mapping event override feature.  Long overdue ability to have my custom code replace a delivered event code.
  • Lifecycle Management enhacnements to the customisations repository and the automatic PRP download and apply.
  • And so much more.

Tuesday, 9 March 2021

Did you know? 3-tier Debugging in Application Designer is very useful


I'm a developer and so I work with lines of code, variables and complex data types like Rowsets, Arrays and the like.   I often need to debug and troubleshoot my own code and, also code written by others. 

Application Designer is missing some features that you'd expect from a web application IDE.   I'm not going to try and defend App Designer but I will say that if you want a feature rich ERP system with a good development and configuration tool then PeopleSoft ticks a lot of boxes.  But, on the other hand, if you need a comprehensive  development tool from which you build any application then you'd probably chose some other IDE.  Anyway.... things like code folding, code completion, refactoring features, etc.  are somewhat missing in Application Designer but I'm happy to live without those things because I have access to real-time PeopleCode debugging !  

Why use a debugger?

  • Inspect variable type and values at runtime
  • Understand the structure and flow of code especially complex component, nested methods or function calls
  • Accelerate the development process

Did you know this even existed?   It's pretty cool and you'll wonder how you ever managed without it.

Quick setup guide below or watch the video if you want to learn more. 

How to setup

My quick notes are just a summary.  The PeopleSoft Online documentation will provide more details on setup and usage.  

1. Enable WSL and PC Debugger in the Application Server domain.  You need these 
  • WSL is needed because Application Designer is going to connect to the Application Server domain (3-tier) rather than directly to the database (2-tier).
  • Debugging process  PSDBGSRV is required so that the Application Server Domain can link a PIA session with your 3-tier 

2. Configure Application Designer to make a 3-tier connection by adding a new Profile.

Tuesday, 23 February 2021

Did you know? Search Keys are shared from one Component to another ?

Components which share the same Search Keys will always pass the Key values to the other.  

We can read about this standard behaviour in the  PeopleCode and the Component Processor > Search Processing in Update Modes 

Alternatively, we can see this at work in any PeopleSoft system by navigating to 

PeopleTools > Security > User Profiles > User Profile

Search for any OPRID and open the User Profile Component

Now navigate to 

      PeopleTools > Security > User Profiles > Copy User Profile

and we'll see that it's automatically passed the OPRID from the first component into this one ready for you to use.

I've worked on several PeopleTools 8.58 upgrade projects recently and discovered a bug which I thought might be useful for the community to know about and some ideas for a resolution.

To demonstrate the issue we need to create a Fluid Navigation Collection which contains the portal folder User Profiles.

We can use the Tile Wizard to create a Fluid Tile which opens this Navigation Collection.

There's a bug in PeopleTools 8.58 (Patch 9 and earlier) which means that Search Keys are not passed from one Component to another if you're operating in the context of a Fluid Navigation Collection.  This might not seem like a serious issue but when users are working on multiple components for the same entity (e.g OPRID in our case here) then they'll soon notice this.  And, of course, the very reason we created the Nav Collection in the first place is to group related Components together to reduce the amount of time spent traversing the menu.

You can see the effect of this issue in the video below.


We might need to wait until this is fixed in a PeopleTools patch (currently targeted for patch 10 under Bug ID 31890562 )  See Doc ID 2714929.1

But, depending on the impact of the issue on your users you could provide a low impact workaround using Event Mapping and a Global variable.

On Component PreBuild of each component get the Keys from the Search Record and set a Global variable,

On SearchInit of each Component simply read the Global Variable and (optionally) set the SearchDialogBehavior(0) to force the processing of the Key. 

The video below is a quick walk through of this hack.

I got this working on my two sample Components.  This is only a few hours work for a potentially big pay off and it's a totally isolated customisation because we're using Event Mapping.

Any other ideas or suggestions?

Tuesday, 12 January 2021

5 Things for 2021

5 Things to do in 2021 if you work with PeopleSoft

Happy New Year  !  

When we say this to one another, we hope that this year, this new year will be a happy one.  But no one can know what will happen this year and I don't think that by me wishing anyone a "happy new year" that it will indeed be a happy one.  So what do we really mean when we say "happy new year"?

Well, the word happy comes from the old Middle English word hap which means lucky or fortunate.  So, "happy new year" becomes a wish for someone to have a "fortunate new year".

Hmmm...?  I still have a problem with that.  Are my words magical in some way?  If I wish that someone has a fortunate year does it mean they will?  I don't think so. But I can still hope & try.

I hope that you and I together will try and contribute something positive to bring about a happy new year, in some small way, in our corner of this amazing planet and hope for a more kind, more helpful, more happy, more fortunate and more thankful world.

So, philosophical ramblings out of the way.... down to PeopleSoft business.

As a PeopleSoft professional what should you be doing this year?    Well, I'll tell what I'm going to be doing.  Maybe this will be helpful to someone.

(1) Upgrade to the latest PeopleTools release.  Right now (January 2021) that means PeopleTools 8.58.  But, have you read about some of the exciting things coming in 8.59?  Check it out here  Lots of exciting things planned for the next Tools release.  And when will PeopleTools 8.59 be released?  Well, I don't know. But, the average gap between PeopleTools releases since 8.51 has been 468 days (yes... I know... I really did work it out).  8.58 landed 18 December 2019 so add 468 days to that and you get 30 March 2021.  I'm just playing an averages game here.  It could be earlier and it could be later.

Anyway, why should you get onto the latest PeopleTools release?

  • Take learn about and take advantage of new features.  For example you don't get Kibana without 8.58.
  • Stay supported 
    • 8.57 is already out of platform and fix support.
  • Stay Secure
(2) Get involved in the PeopleSoft and Oracle Community.     It's all about the people ! 
Oracle PeopleSoft SIG 2020 - Bangalore, India
Get online... join a user group.... attend online events.... connect with the community.  Here's just a few suggestion.
Oracle Community Forums
Quest Community User Group

Get involved with Oracle Partner community events like Version 1 's Oracle Apps Day and the PeopleSoft Innovation Summit from PeopleSoft security specialists, Appsian.
All the content from 2020 event are online

17 - 18 February is the next event

If you're a PS Admin then join in the fun at

And if you're interests are also in the Oracle technology that underpins PeopleSoft then the UK based UKOUG, the India run AIOUG with their fabulous Sangam and Yatra events or the Asia Pacific user group APACOUC will have something for you.

Tune in often to countless community bloggers. You'll find a few on my Blogroll to the right of this post.  

And sign up for the free PeopleSoft Weekly newsletter.  It'll contain everything you need to know and more!

(3) Explore the value of running PeopleSoft in public cloud infrastructure.   There are many benefits to utilising cloud services for IT systems and PeopleSoft has been designed for running in the cloud. Public cloud might not be for you so make sure you use a trusted partner to help with assessing the benefits.

(4)  Exploit the Power of PeopleSoft for positive impact
Create Positive Impact
Q: Why does any company have a computer system?  
A: To secure and manage business data.

Q: What if your chosen information management system doesn't manage this data in a way that's useful to your business?
A: Modify the information system.  (I could modify my business but why should I compromise!)

Q:What should I do if my information management system can't be modified in exactly the way I need?
A: You either compromise, miss opportunities, lose revenue or incur cost.  Or, if you're happy/fortunate/lucky enough to be running PeopleSoft then you can extend and modify it in order meet those business demands.

The ability to change the delivered system to create value for my business without seriously damaging my ability to take new releases from the vendor is a powerful feature of any information system.

Exploit the power of delivered frameworks: Guided Self Service, Approval Workflow, Search, Related Content, Activity Guides, Page & Field Configurator, Chatbot Integration Framework, Kibana Dashboards, Push Notifications, to name a few.

(5) Learn something new each month.  
One thing you learn very quickly in the IT industry is that nothing stands still very long.  There's always something new, some new feature, new application, new method, new module, new script, new programming command.  Why is there so much change?  I believe it's because so many people in the IT world are innovators and creative types who are always looking for opportunities to improve life, the workplace, to save money, make money, improve customer quality, product quality, service delivery and so on.  This creativity inevitably means we live in a constantly evolving ecosystem.

Struggling to keep up?  You're not alone. Join the club.  (in fact action item (2) above and join a community group).

How best to keep up and learn?  Here's my 5 point plan for 2021

A) I'm going to get access to PeopleTools 8.59 once it's GA and use that to learn. (see 1 above)

B) I'm going to contribute the best I can to the PeopleSoft community. (see 2 above)

C) I'm going to install, access and develop PeopleSoft in Oracle Cloud Infrastructure. (see 3 above)

D) I'm going to pick a few of the new 8.59 features and understand their potential value (see 4 above)

E) I'm going to learn a little at a time and often.  (see 5 above )
Dan and Kyle, from, discussed the power of incremental improvement or "marginal gains" in their October 2020 podcast.  Highly recommend it (both the podcast and the idea).  The basic premise is that if you make a 1% improvement each week in something, like learning, then you might not notice to start with but incrementally start adding up all the 1% improvements and before you know it you'll be an expert in something.

Have a 2021 full of hope, learning and connecting with people.

I'll leave you with a few of my lockdown memories of 2020.

My workspace for most of 2020.

My Dad's 60 year old bureau desk
Fits my laptop just perfectly.

Finally get out of the house.  Working lunch by the Skatepark

Joining in virtual community events

Version 1 Oracle Apps Day with Robbin Velayedam 

Escaping to the hills

Early morning walk by the river Thames

Monday, 9 November 2020

OCI Command Line JSON File Data

Part of my day job is to manage PeopleSoft system running on Oracle Cloud Infrastructure (OCI).  I use the OCI API extensively in PeopleCode and Python but I don't often use the Command Line Interface (CLI).

Just wanted to call out an issue I hit recently when trying to pass in a JSON file as input to a CLI command.

In this example I'm using the CLI to update an existing Security List.  Security Lists in OCI define IP and Port based rules allowing traffic in or out of a subnet.

You can see an example of a network Ingress (Inbound) rule below.

Let's use the CLI to modify the Destination Port Number of this Rule from 8000 to 8001.

The CLI command for this is:

oci network security-list update --security-list-id <ocid of Security List> --ingress-security-rules file://myNewRule.json

JSON can be supplied on the command line as a string input.  However, if you're running CLI on Windows then you need to escape the " in the string (e.g. /"). It's much easier to include the JSON in a file and then input that to the --ingress-security-rules parameter.

But what does the shape of this JSON file need to be?  Well we don't need to guess or try and key from some online documentation as there's a handy parameter which will generate a JSON file template --generate-param-json

oci network security-list update  --generate-param-json-input ingress-security-rules > myNewRule.json

I'm using the standard redirect symbol > to send the output of the command to a file.  A sample fragment of this input template looks like this:

This template makes it easy to create the JSON to make the change we want.

WARNINGWhen a Security List is updated the existing Security List is replaced with the inbound definition.  You get a warning of this when you execute the command.

I ran the command and this is what I got:

Parameter 'ingress_security_rules' must be in JSON format.

But my file is in JSON format.  A few hours of tinkering around and my file is still in JSON format, looks valid but still throwing this error.

Turns out the File Encoding matters.  My JSON input file was in UCS-2 LE BOM.  This got set when I redirected the output of the OCI command which was running in the Windows PowerShell.  This file encoding is obsolete and not appreciated by the OCI CLI.   If I execute the command to redirect the template JSON to file in a regular Command Prompt window then I get a supported encoding of UTF-8 which works.

Sunday, 20 September 2020

Fetch browser data into Component Buffer

It's Hidden in the Field.
Photo by Patrick Mueller

I had to remind myself recently of how to solve a particular problem that I first solved probably over 15 years ago (probably in version 8.01 of PeopleTools).  

If I use JavaScript to fetch some data from the browser then how do I get this new local data back into the component processor and make it available to PeopleCode?

This might be useful to someone out there so here's how it's done.  I'm going super simple with this example so that hopefully the concepts are clear.  

Let's assume we have a Page with a single Field - DESCR (Description).  We're going to use JavaScript to fetch the Operating System of the local machine.  A button will then pass that back to the Component Processor and in the FieldChange event we'll display the Operating System name in the DESCR field.

(1) First I need to get my Javascript into the page.  There are many ways to do this but for this example I'm just going to add an HTML area to the page and set it's value to be my JavaScript during the PageActivate of the Page.

This is my JavaScript to get the Operating System.


// Get the Operating System name from the appVersion property*/
var OSName="Unknown Operating System"; 
if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows"; 
if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS"; 
if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux"; 

// Set the hidden field on page using the PageField Name
document.getElementById("MY_DESCR1").value = OSName;

// The hidden field can also be referenced by using RECORD_FIELDNAME
// document.getElementById("GRS_TEST_WRK_DESCR1").value = OSName;

And the code to inject this into my Page at runtime.

NOTE: When the HTMLAREA value is set in PageActivate the JavasScript at this stage has not been rendered in the browser and therefore it hasn't executed yet.  This is important to note as anything which the JavaScript does on the page at render time will not be available to the Component Processor until the next rountrip.

ALSO NOTE:  It might matter where you put your JavaScript on the page.  HTML pages do not load all at once and so HTML elements that your JavaScript reference may not have rendered at the time they execute and may not be available.  For the purposes of this simple test we can get away with adding the JavaScript to the end of the Page but a much more thorough discussion on this can be found here

(2) Pass the JavaScript variable to the local PeopleSoft Page.  Fields on a PeopleSoft Page are located inside the <FORM> object so that when the next HTTP POST event (or roundtrip) occurs the collection of Field objects or (HTML INPUT elements) in the form are posted (sent) back to the web server and then to the application server to be made available in the Component Buffer.

Normally we use data entry elements on the Page to capture human input but in this instance our JavasScript is doing the inputting.  However, we don't necessarily want our Operating System name to be visible on the Page so we add a hidden Field on the Page and set the value of this using JavaScript. In this example the hidden Field name is DESCR1 and we're going to make it invisible.

Setting the Page Field Invisible property not only makes the field hidden from human view but the way in which PeopleSoft does this (quite rightly) is to not include the Field in the HTML page response thus making it invisible to JavaScript too.  We solve this problem by also setting the Generate in HTML property and Modifiable by Javascript* property.

NOTE: If you don't set the Modifiable by Javascript property then you'll get this error.

This is because the HTML element for the Field will be present in the HTML but is not permitted to be changed. Actually, JavaScript will modify the Field value but the next roundtrip will catch this illegal operation and throw the error.  This feature might be useful if you wanted to apply some special HTML/CSS wizardry to  Field data but didn't want to display the default PeopleSoft styled Field.

One other Page Field property is useful to set on our hidden field and that's the Page Field Name.  All Page Fields can be referenced by the RECORD_FIELDNAME and this is set as the Element ID.  However, as we all know, it's possible to have the same Field appear multiple times on a page and having a method of uniquely identifying a specific instance of a Field is useful and sometimes essential.  

The line of JavaScript which sets the hidden field is this one:
/*Set the hidden field on page*/
document.getElementById("MY_DESCR1").value = OSName;
or, alternatively using the RECORD_FIELDNAME.  
// The hidden field can also be referenced by using RECORD_FIELDNAME
document.getElementById("GRS_TEST_WRK_DESCR1").value = OSName;
(There's a lot of useful information online to help understand how to reference HTML elements.  Here's a good place to start ).

(3) Pass the hidden field into the Component Buffer.  Because our JavaScript has been used to set a field  the data is still on the local browser and will not be available to PeopleCode in any events until the next roundtrip.  This can be a Save, Refresh, non-deferred FieldEdit/Change, RowInsert/Delete, etc).  Think of it as if a human had just entered the data into a field.   

In Summary

If we put all this together this is what's happening.
1) We add our JavaScript is added to the page in Page Activate. (The JS hasn't run yet).
2) The Page HTML is generated by the Application Server and returned through WebLogic to the browser.
3) The browser renders the HTML and, if we've been clever (or lucky), our JavaScript will execute once the page is loaded.
4) The JavaScript grabs the data we're interested in and sets the value property of our Invisible, Modifiable by JavaScript, Generate in HTML enabled Page Field.
5) This Page Field is part of our Form and so will be passed back to be included in our Component Buffer during the next roundtrip (Save, Refresh, non-deferred FieldChange/FieldEdit, etc).
6) Once it's in the Buffer we can get to it like any other Field.

I hope this is useful to someone.  There might be other ways of doing this and other observations, gotchas or things to look out for so please feel free to share in the comments below.