Monday, December 04, 2023

Customization Versus Configuration

During PeopleSoft Reconnect 2023, I posted a LinkedIn poll asking if Event Mapping is a Customization or a Configuration. Here is the final tally:

To apply maintenance faster and more often, we must reduce customizations, and configurations are the best alternative to customization. But how would you define a customization? How about a configuration?


My friend Graham Smith got it right in the poll comments when he said, "The definition of customisation is the changing of a delivered object." 100% correct. If you change a delivered definition, that change will appear in a compare report. If it appears in a compare report, you must analyze and retrofit that change. It is this "analyze and retrofit" effort that delays and even derails Get-current projects. But what if that "change" to a delivered definition happens at runtime through injection rather than design time through a direct code change? Is it still called a customization if the change happens at runtime?


This is where it gets tricky. Are Event Mapping, Drop Zones, and Page and Field Configurator configurations? They certainly facilitate configuration. But true configuration is an application-specific construct. Take data masking as an example. We can mask data through Event Mapping and Page and Field Configurator. Masking in this manner requires code that identifies component buffer fields. What if PeopleSoft removes those fields from the component buffer? Our solution would then fail. We might consider this a configuration because we didn't change Oracle-delivered code at design time. Alternatively, we could call it a customization because we changed Oracle-delivered code at runtime.

A true data masking configuration alternative is the Data Privacy Framework, which allows analysts to configure data masking across the application.

One way to think of it is, "who is responsible for fixing the solution if it breaks?" If the answer is Oracle, then it is a configuration. If the answer is you, then it may be a customization.

Isolated Customization

Think of an Isolated Customization as if you isolated your customization from Oracle's delivered codebase and configured PeopleSoft to reinject your customization at runtime. This describes Event Mapping, Drop Zones, and Page and Field Configurator. The value is that your customization no longer shows in a compare report because you have not modified Oracle's delivered code... or have you? Does the point of injection matter? Put another way, does it change the classification if you inject your modification at design time or runtime?

With the introduction of Event Mapping we also might need to see customization as "additional (custom) code to the delivered code." -- Malik Chagani

So here are my tests to help categorize items:

  • Does it show on a compare report? Customization
  • If it breaks, is it my responsibility to fix it? Customization or Isolated Customization
  • If it breaks, is it Oracle's responsibility to fix it? Configuration

Customization, Isolated Customization, or Configuration... why does it matter?
  • Customizations appear on compare reports. We must analyze and retrofit every customization. It is this effort that stalls Get-Current projects.
  • Isolated Customizations don't show on compare reports but have the potential to break when applying maintenance. We must analyze and retrofit Isolated Customizations when they are broken. The challenge with Isolated Customizations is finding them since they don't appear on compare reports.
  • Configurations are not supposed to impact maintenance. You should be able to get current without touching configurations.
What do you think? How do you handle Customizations, Isolated Customizations, and Configurations? Let us know in the comments!

At JSMpros, we regularly teach a course called Configure, Don't Customize, with hands-on activities showing you how to apply dozens of Configuration and Isolation strategies. The table of contents is available online at

Wednesday, November 08, 2023

Base64 Encoding with Emoji

PeopleSoft's Pluggable Encryption Technology (PET) is used to apply base64 encoding. The first step of the base64 algorithm chain is to convert from PeopleSoft Unicode to ASCII. The conversion makes sense since PeopleCode is a Unicode language, and the base64 algorithm is not. But what if you have Unicode characters you want to base64 encode? So I tried the following "Hello World" example with emoji:

&crypto.UpdateData("Hello World 🤔");

Unfortunately, the PET algorithm dropped the Unicode Emoji. Understandable because Emoji is Unicode. So, what alternatives do we have? The good news is my older PL/SQL approach still works. However, my older Java example no longer works. So, for those who want a cross-platform solution, here is an updated PeopleCode/Java code listing. The good news is this version is documented and much simpler!

REM ** What would you like to encode?;
Local string &textToEncode = "Hello World 🤔";

REM ** Pointer to Java encoder;
Local JavaObject &encoder = GetJavaClass("java.util.Base64").getEncoder();

REM ** Be sure to change the character set to match your source;
Local JavaObject &bytes = CreateJavaObject("java.lang.String", &textToEncode).getBytes("UTF-8");

Local string &result = &encoder.encodeToString(&bytes);

REM ** print the result;
MessageBox(0, "", 0, 0, &result);

At JSMpros, we teach advanced PeopleTools concepts such as this all the time! Check out our events page to see what we are offering next, and become a subscriber to get 24x7 access to all of our on-demand videos, activity guides, and code samples!

Wednesday, October 18, 2023

PeopleSoft ReConnect 2023

Join me at PeopleSoft Reconnect 2023 for some amazing sessions covering a variety of PeopleTools Topics:

  • Wednesday, Oct 25, 7:30 AM Pacific: PeopleSoft Integration Strategies
  • Thursday, Oct 26, 8:30 AM Pacific: Getting the Most out of PeopleSoft PeopleTools: Tips and Techniques
  • Thursday, Oct 26, 09:45 AM - 10:45 AM PacificMoving from Customized to Configured, Make it Your PeopleSoft
Be sure to add these sessions to your agenda, and keep an eye on the schedule, as sessions are subject to change. Event details and registration are available on the Quest PeopleSoft Community website.

See you online on Monday, October 23 for Paco's executive session, the first session of the conference!

Wednesday, October 04, 2023

Stop Retrofitting and Analyzing Every Customization!

When applying maintenance, we must retrofit every customization. And we will have to continue analyzing and retrofitting as long as we have customizations. The process involves running Compare Reports to identify changes, analyzing customizations, and copying/pasting our old solutions into Oracle's new code base. Occasionally, we must alter a customization to account for Oracle's changes. My point is that we must touch every single customization identified in a Compare Report. The alternative is modern isolation strategies, such as  Page and Field Configurator, Event Mapping, and Drop Zones. We call these isolated customizations because changes are isolated from Oracle's delivered code base. They don't appear in Compare Reports. But should they still be analyzed? Do they require retrofits? Do they break during maintenance?

Without a Compare Report, how do you find isolated customizations? Do you need to find them? We have been discussing this lack of transparency since Event Mapping was released in PeopleTools 8.55. In fact, we've written SQL to help you locate code that includes Event Mapping that was touched by maintenance. But do we need to review every isolated customization? Here is an example. In 2016, I used Event Mapping to change the appearance of the Addresses Page. Notice the iconography next to the Home and Mailing Address in the following screenshot:

I haven't touched this isolated customization in 7 years. That is 7 years and possibly 21 "Get Currents" without a single care for this Isolated Customization! And then, I applied HCM PUM 46. Here is the result:

Event Mapping Failure

I've Waited 7 years for this to happen! Shouldn't a compare report have caught this? No. That is the point of an isolated customization. Our code is isolated from Oracle's code. Therefore, there is no Compare Report. But as you can see, sometimes our code still breaks after maintenance.

So what is the solution? How do we identify isolated customizations that broke while applying maintenance? Regression Tests. The solution to this challenge is the PTF Regression Test. Each time you create an Event Mapping, Drop Zone, or Page and Field Configurator solution, you should create a corresponding PTF regression test to prove your solution still works. A PTF Regression Test would have caught the error message and instantly failed the test. I would then analyze and retrofit just this one broken solution, not every single system change.

Compare Reports for Event Mapping, Drop Zones, and Page and Field Configurator? Do you really need them? Wouldn't a proper Regression Testing strategy save you hours, even days, of analysis by avoiding report reviews?

At JSMpros, we teach developers and business analysts how to create PTF Regression Tests through our two-day PeopleSoft Test Framework course. Find out when we are offering it next, or learn at your own pace through on-demand!

Thursday, August 03, 2023

"Technical Details" in Page and Field Configurator

I've had this challenge with Page and Field Configurator: 

Some components include the same field but on different records. When selecting fields, Page and Field Configurator shows the record and field, but when viewing the configuration grid, the record name is hidden.

But there is a new-ish feature in Page and Field Configurator: The Configure Field Properties grid now includes a Technical Details tab!

We can now see the record, field, page, and Occurs level for each field in the configuration! It seems simple but has such a huge impact! No more guessing!

Want to learn more about Page and Field Configurator? Sign up for our next Configure, Don't Customize class at!

Tuesday, June 20, 2023

Enabling Search Framework Real Time Indexing (RTI)

As we prepare our HCM PUM 46 training servers, we decided to enable Real Time Indexing (RTI). We found several great sample videos and resources but still made a few mistakes. We are sharing our adventure to help you as you implement RTI.

Before implementing RTI, we have a couple prerequisites. First, we must have a working Elasticsearch (OpenSearch) service. Second, we should have some indexes deployed. Since our training focus is PeopleTools, we usually deploy the PTSF_RECENTMENU and the PTPORTALREGISTRY indexes. To summarize the prerequisites, we need a:

  • Working Elasticsearch (OpenSearch) installation and
  • Deployed indexes

Elasticsearch (OpenSearch) does not store its data in the PeopleSoft database. Instead, we move data into the Elasticsearch (OpenSearch) index storage through scheduled batch processes. The point of RTI is to reduce latency by eliminating scheduling; get data into indexes as fast as possible: Enter data → Search for data.

RTI works by using the following:

  • Triggers to insert rows into a staging table and
  • A Process Scheduler server process that checks for new rows in the staging table

Enabling RTI is a multi-step process requiring:

  • Process Scheduler-specific configurations and
  • Index-specific configurations

Process Scheduler Configuration

Let's start with the Process Scheduler Server. Using the psadmin command, make sure Real Time Indexing is enabled, as demonstrated in the following screenshot:

This turns on the "watcher" process. On interval, the PSRTISRV service polls the RTI staging table, PS_PTSF_RTISTG, for new rows to process. We can tune the number of RTI instances through the psprcs.cfg file.

; Settings for Real Time Indexing watchdog
Min Instances=1
Max Instances=1

We may configure the polling interval through the Search Instance Search Options Config (PeopleTools > Search Framework > Administration > Define Search Instances). The last several options relate to RTI:

The Heartbeat Interval determines how often the RTI process checks for new rows in the RTI staging table (PS_PTSF_RTISTG). The Real Time Indexing Set Size specifies how many rows to process on each interval. The point is to tune these two numbers for optimal performance. The shorter the interval, the closer to real time, but with a performance cost. The longer the interval, the less the performance impact. Too long of an interval, however, and the number of transactions per interval may exceed the Set Size threshold, meaning RTI may only clear the queue after hours, creating a larger backlog with each run.

As a side note, PeopleSoft queues transactions for RTI through database triggers. A bulk update to a triggered table may generate more transactions than RTI can clear in a single polling interval, creating a latency effect for online transactions. Given the default configuration parameters, PeopleSoft will index 300 transactions every 2 seconds. If we batch update 30,000 rows of data, we may have to wait 4 minutes before that data clears the queue. 300,000 rows of data? Roughly 35 minutes. With this in mind, we may want to remove an index from RTI before a batch update, run the update, re-enable, and then schedule an incremental build to catch up. That way, intermittent, unusual batch processing doesn't interfere with online RTI processing.

Index Configuration

After configuring server settings, we choose which indexes to enable. Navigate to PeopleTools > Search Framework > Configure Realtime Indexing to select an index. To start with, pick indexes that are Disabled. These are indexes that contain RTI metadata, making them trivial to enable. Indexes marked as Not Configured may be enabled but will require additional configuration before enabling.

In our demo environments, we enabled PTSF_RECENTMENU. To enable an index:

  • Check the box Enable Real Time Indexing,
  • Save, and
  • Click the Trigger SQL link to download database-specific triggers.

When you click the Trigger SQL link, PeopleSoft will either open three new tabs or download three new files (it depends on browser configuration and registered handler for SQL files). The file name identifies the database: ora for Oracle, mss for Microsoft SQL Server, and db2 for DB2. If your browser opens them in new tabs instead of downloads, scroll to the end of the address bar to confirm the file name. This is where I made a mistake. I had so many open tabs that I didn't notice PeopleSoft opened three new ones. I only saw one and kept trying to run the DB2 script against my Oracle database.

Alternatively, as described by Ravi and Ramasimha in their Quest Recorded Webcast, we can let App Designer build the proper database triggers for us. I appreciate the App Designer integration because it ensures future record changes won't delete the RTI trigger scripts. It also means I don't have to log into a separate SQL tool or verify that I chose the correct database script.

After enabling RTI for an index, PeopleSoft recommends running a full or incremental sync to ensure all data exists in the target index. After that, you can cancel any scheduled run controls for that index, as RTI will now manage the incremental updates for that specific index.

Here are some great resources with additional information about RTI:

Is RTI Really "Real time"?

Realtime usually means data automatically flows from one system to the next. Create data → Send data. If RTI were truly real time, each update would send immediately. But if you have up to 300 updates within a 2-second period, a real time interface would create 300 connections to incrementally send 300 updates. PeopleSoft's near real time approach, however, is a lot like App Engine's Bulk Update. Another way to think of it is that RTI is a shuttle with room for 300 passengers. A shuttle arrives once every 2 seconds to pick up however many passengers are waiting. This is far more efficient than sending up to 300 vehicles individually. And even better, through parameters, we can tune the interval and passenger count to achieve the best experience for our users.

Which Indexes Should You Enable?

We recommend starting with PTSF_RECENTMENU. This allows the portal search feature to suggest user and enterprise recent items within search results. Next, we suggest enabling indexes used by component keyword search so your users may view transactions immediately after creation.

At JSMpros, we teach PeopleTools concepts every week. Each student who attends a live training class receives a properly sized, personal training server with relevant PeopleTools and application versions for the duration of training. This is one of the ways we provide you with an unparalleled training experience! Check out our website to see what we are offering next!

Access all of our content anytime from anywhere through our all-access subscriptions. Check it out!

Saturday, May 20, 2023

PeopleTools Learning Subscriptions

Are you looking to take your PeopleSoft Development skills to the next level? Look no further than our All-access Learning Membership.

With this membership, you'll gain access to a wealth of resources to help you improve your PeopleSoft Development knowledge and skills. From video tutorials to code samples and webinars, you'll have everything you need to become a PeopleSoft Development pro.

The membership also includes access to PeopleSoft experts, where you can ask questions and get feedback.

But what sets the All-access Learning Membership apart from other online learning platforms is its focus on real-world applications. You'll learn how to use PeopleTools to build practical, functional applications that you can use in your own projects.

And with new content added regularly, you'll always have something new to learn and explore.

So if you're ready to take your PeopleTools skills to the next level, sign up for the All-access Learning Membership at Your future self will thank you!