tag:blogger.com,1999:blog-340203932024-03-15T08:31:17.889-07:00Jim's PeopleSoft JournalA blog containing development tips I have learned through the years as a PeopleSoft developer.Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.comBlogger300125tag:blogger.com,1999:blog-34020393.post-30187902291218680402024-02-08T12:09:00.000-08:002024-02-08T12:09:37.231-08:00Alliance Conference 2024<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSKB6BxjACyhihRVI-KnhvKuNCeOgjTQJZP5YgSCPn0ZGZK4k5ucQpTZdDKWvR50d_Tzm4Ab_rT0sEYSLKvdoZ6J5squlAuZy7KrUubsjoKdpFsguTldJUjzlLXOpxVAFAjiMHK-FyZxsS6hxRGDUSuDKiJvspo4b410S38kyoMd0akoPe2LxF/s1200/Alliance%202024%20(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="628" data-original-width="1200" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSKB6BxjACyhihRVI-KnhvKuNCeOgjTQJZP5YgSCPn0ZGZK4k5ucQpTZdDKWvR50d_Tzm4Ab_rT0sEYSLKvdoZ6J5squlAuZy7KrUubsjoKdpFsguTldJUjzlLXOpxVAFAjiMHK-FyZxsS6hxRGDUSuDKiJvspo4b410S38kyoMd0akoPe2LxF/w400-h209/Alliance%202024%20(1).jpg" width="400" /></a></div><br /><p style="clear: both; text-align: left;">Alliance 2024 is just a few weeks away, and I look forward to meeting with friends and colleagues from the PeopleSoft community. I hope to see you in the exhibition hall and in customer sessions.</p><p style="clear: both; text-align: left;">I am excited to present the following sessions:</p><p style="clear: both; text-align: left;"></p><ul style="text-align: left;"><li>Getting the Most out of PeopleSoft PeopleTools: Tips and Techniques on March 5 at 2 PM in North 122 ABC.</li><li>Get Current Faster by Isolating Customizations on March 6 at 2 PM North 122 ABC.</li></ul><p></p><p style="clear: both; text-align: left;">See you there!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-16622784403478427952024-01-18T10:54:00.000-08:002024-01-18T10:54:10.789-08:00Generating LARGE JSON Files<p>The PeopleCode native JsonObject and JsonArray classes allow us to create JSON structures as in-memory representations. But what if you need to generate a really LARGE JSON structure? An in-memory JSON Array may consume more memory than you can reasonably allow. Fortunately, PeopleTools includes the Jakarta JSON library, which allows us to write a JSON structure to a stream during construction.</p><p>The following code snippet demonstrates creating 10 million JSON objects in an array without any change in memory consumption. The generated file was 2.5 GB in size, but my memory utilization didn't change the entire time the program ran.</p><pre><span style="color: #3d85c6;">Local JavaObject</span> &Json = <span style="color: #3d85c6;">GetJavaClass</span>("jakarta.json.Json");
<span style="color: #3d85c6;">Local JavaObject</span> &writer = <span style="color: #3d85c6;">CreateJavaObject</span>("java.io.FileWriter", "C:\temp\users-big.json");
<span style="color: #3d85c6;">Local JavaObject</span> &gen = &Json.createGenerator(&writer);
<span style="color: #3d85c6;">Local number</span> &iteration = 1;
<span style="color: #6aa84f;">REM ** 10 million iterations;</span><span style="color: #38761d;">
</span>Local number &maxIterations = 10000000;
&gen.writeStartArray();
For &iteration = 1 To &maxIterations
<span style="color: #6aa84f;">REM ** start person/user object;</span><span style="color: #38761d;">
</span> &gen.writeStartObject();
&gen.write("id", "" | &iteration);
&gen.write("firstName", "John");
&gen.write("lastName", "Smith");
<span style="color: #6aa84f;">REM ** start child address object;</span>
&gen.writeStartObject("address");
&gen.write("streetAddress", "21 2nd Street");
&gen.write("city", "New York");
&gen.write("state", "NY");
&gen.write("postalCode", "10021");
&gen.writeEnd();
<span style="color: #6aa84f;">REM ** start phone number array;</span>
&gen.writeStartArray("phoneNumber");
<span style="color: #6aa84f;">REM ** start home phone object;</span>
&gen.writeStartObject();
&gen.write("type", "home");
&gen.write("number", "212 555-1234");
&gen.writeEnd();
<span style="color: #6aa84f;">REM ** start fax number object;</span>
&gen.writeStartObject();
&gen.write("type", "fax");
&gen.write("number", "646 555-4567");
&gen.writeEnd();
<span style="color: #6aa84f;">REM ** end array of phone numbers;</span>
&gen.writeEnd();
<span style="color: #6aa84f;">REM ** end person/user object;</span>
&gen.writeEnd();
End-For;
<span style="color: #6aa84f;">REM ** end array;</span>
&gen.writeEnd();
<span style="color: #6aa84f;">REM ** cleanup to flush buffers;</span>
&gen.close();
&writer.close();
</pre><p>The hard-coded values come directly from the <a href="https://jakarta.ee/specifications/platform/9/apidocs/jakarta/json/stream/jsongenerator">Jakarta generator API documentation</a>. In real life, you would replace these values with database data. I converted numbers to strings to simplify the example to avoid Java Reflection.</p><p>Are you interested in parsing rather than generating large JSON files? Check out our post on <a href="https://blog.jsmpros.com/2023/12/json-stream-processing-with-peoplecode.html">JSON Stream Parsing</a>.</p><p>We teach PeopleTools and PeopleCode tips like this every week! Check out our upcoming <a href="https://www.jsmpros.com/events/">course schedule</a> to see what we are offering next! We would love to have you join us. Want to learn at your own pace? Check out our <a href="https://www.jsmpros.com/groups/all-access/">subscriptions</a> and <a href="https://www.jsmpros.com/on-demand-courses/">on-demand</a> offerings as well. Or do you have a group you would like to train? <a href="https://www.jsmpros.com/contact/">Contact us</a> for group and quantity discounts.</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com4tag:blogger.com,1999:blog-34020393.post-36810702187316392162023-12-18T22:30:00.000-08:002023-12-18T22:30:09.333-08:00JSON Stream Processing with PeopleCode<p>Our Integration Tools courses emphasize the importance of utilizing PeopleSoft's native JSON support to parse and process JSON. This feature provides excellent functionality for most scenarios, as PeopleSoft's native JsonObject and JsonArray offer fast and efficient JSON processing. They are particularly useful for generating small integration responses or handling tasks like <a href="https://www.jsmpros.com/classes/jwt/">JWT</a> (JSON Web Token) generation.</p><p>It's important to note that PeopleSoft's native JSON definitions employ a DOM-based parser, which builds an in-memory JSON structure. While this is effective in many cases, it does require your server to have enough memory to accommodate the entire JSON document without impacting its normal workload. Large files, therefore, can be problematic.</p><p>Stream-based parsing provides an alternative approach. With a stream-based parser, events are emitted as they occur, enabling immediate processing of data identified by these events. Once processed, the parser discards the data and proceeds to the next event. For instance, let's consider a scenario where you have a massive array of users. A DOM parser would load the entire array into memory, whereas a stream-based parser would only load one user at a time, allowing you to process the user and then discard it. Stream-based parsers are often more efficient in terms of resource utilization, as they process and discard data right away instead of constructing a traversable in-memory document.</p><p>Although PeopleCode itself doesn't include a stream-based parser, it does include the Java Jakarta stream-based JSON parser, which we can leverage through PeopleSoft's built-in Java support. Let me share an example with you. For testing purposes, I obtained a sample JSON file from <a href="https://jsonplaceholder.typicode.com/users">https://jsonplaceholder.typicode.com/users</a>. This file is small and perfect for testing. I then incorporated the following PeopleCode into an App Engine step, which you can run locally through App Designer:</p>
<pre>REM ** JavaDoc: https://jakarta.ee/specifications/jsonp/2.0/apidocs/jakarta.json/jakarta/json/stream/jsonparser;
REM ** Data: https://jsonplaceholder.typicode.com/users;
Local JavaObject &Json = GetJavaClass("jakarta.json.Json");
Local JavaObject &reader = CreateJavaObject("java.io.FileReader", "C:\temp\users.json");
Local JavaObject &parser = &Json.createParser(&reader);
Local string &email;
While (&parser.hasNext())
Local JavaObject &next = &parser.next();
If (&next.equals(&next.START_OBJECT)) Then
Local JavaObject &user = &parser.getObject();
REM ** do something with the object;
&email = &user.getString("email");
MessageBox(0, "", 0, 0, "email: %1", &email);
End-If;
End-While;
</pre><p>Here is some sample output generated by this short App Engine program:</p><pre>email: Sincere@april.biz (0,0)
Message Set Number: 0
Message Number: 0
Message Reason: email: Sincere@april.biz (0,0) (0,0)
email: Shanna@melissa.tv (0,0)
Message Set Number: 0
Message Number: 0
Message Reason: email: Shanna@melissa.tv (0,0) (0,0)
email: Nathan@yesenia.net (0,0)
Message Set Number: 0
Message Number: 0
Message Reason: email: Nathan@yesenia.net (0,0) (0,0)
email: Julianne.OConner@kory.org (0,0)
Message Set Number: 0
Message Number: 0
Message Reason: email: Julianne.OConner@kory.org (0,0) (0,0)</pre><p>Are you interested in learning more about PeopleSoft <a href="https://www.jsmpros.com/classes/ib-update/">Integration</a>, <a href="https://www.jsmpros.com/classes/pt1-2/">PeopleTools</a>, Or <a href="https://www.jsmpros.com/classes/peoplecode/">PeopleCode</a>? If so, check out our <a href="https://www.jsmpros.com/groups/all-access/">subscriptions</a>, <a href="https://www.jsmpros.com/on-demand-courses/">on-demand</a>, and upcoming <a href="https://www.jsmpros.com/events/">course schedule</a>. We would love to have you join us!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-12308727534205807162023-12-04T11:18:00.000-08:002023-12-04T11:18:48.728-08:00Customization Versus Configuration<p>During PeopleSoft Reconnect 2023, I posted a <a href="https://www.linkedin.com/feed/update/urn:li:activity:7123001833555468288/">LinkedIn poll asking if Event Mapping is a Customization or a Configuration</a>. Here is the final tally:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgzuqRNuDYqWWc7h0Oa38Jv0FoejjvIpgT_YQICBvT4QFX25Sk4M6-UiU4QWnWKvXymgTnLw4dYKe711cTUHLmyn1f0agS3YhA6gY5XkA-kAIqclwAlJW1J0sL982HQMAhd9f5s8b4apFUTq9c9F7rOmr_Apn5H2zbwP2XJwyCVoC86e50Rkpsh" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="142" data-original-width="829" height="69" src="https://blogger.googleusercontent.com/img/a/AVvXsEgzuqRNuDYqWWc7h0Oa38Jv0FoejjvIpgT_YQICBvT4QFX25Sk4M6-UiU4QWnWKvXymgTnLw4dYKe711cTUHLmyn1f0agS3YhA6gY5XkA-kAIqclwAlJW1J0sL982HQMAhd9f5s8b4apFUTq9c9F7rOmr_Apn5H2zbwP2XJwyCVoC86e50Rkpsh=w400-h69" width="400" /></a></div><br /><br /><p></p><p>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?</p><p><b>Customization</b></p><p>My friend <a href="https://i-like-trains.blogspot.com/">Graham Smith</a> 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?</p><p><b>Configuration</b></p><p>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.</p><p>A true data masking configuration alternative is the Data Privacy Framework, which allows analysts to <i>configure</i> data masking across the application.</p><p>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.</p><p><b>Isolated Customization</b></p><p>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 <i>customization</i> 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?</p><blockquote> With the introduction of Event Mapping we also might need to see customization as "additional (custom) code to the delivered code." -- <a href="https://www.linkedin.com/in/malikchagani/">Malik Chagani</a></blockquote><p><br /></p><p>So here are my tests to help categorize items:</p><p></p><ul style="text-align: left;"><li>Does it show on a compare report? Customization</li><li>If it breaks, is it my responsibility to fix it? Customization or Isolated Customization</li><li>If it breaks, is it Oracle's responsibility to fix it? Configuration</li></ul><div><br /></div><div>Customization, Isolated Customization, or Configuration... why does it matter?</div><div><ul style="text-align: left;"><li>Customizations appear on compare reports. We must analyze and retrofit every customization. It is this effort that stalls Get-Current projects.</li><li>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.</li><li>Configurations are not supposed to impact maintenance. You should be able to get current without touching configurations.</li></ul><div>What do you think? How do you handle Customizations, Isolated Customizations, and Configurations? Let us know in the comments!</div></div><div><br /></div><div>At JSMpros, we regularly teach a course called <a href="https://www.jsmpros.com/classes/cdc-ag/">Configure, Don't Customize</a>, with hands-on activities showing you how to apply dozens of Configuration and Isolation strategies. The table of contents is available online at <a href="https://www.jsmpros.com/classes/cdc-ag/">jsmpros.com</a>.</div><p></p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-57878695765860056162023-11-08T19:32:00.001-08:002023-11-08T20:41:55.039-08:00Base64 Encoding with Emoji<p>PeopleSoft's <a href="https://blog.jsmpros.com/2009/05/base64-encoding-with-pluggable.html">Pluggable Encryption Technology</a> (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:</p><pre>&crypto.UpdateData("Hello World 🤔");</pre><p>Unfortunately, the PET algorithm dropped the Unicode Emoji. Understandable because Emoji is Unicode. So, what alternatives do we have? The good news is my <a href="https://blog.jsmpros.com/2009/05/base64-encoding-for-peoplesoft.html">older PL/SQL approach</a> still works. However, my older <a href="https://blog.jsmpros.com/2009/05/base64-encoding-for-peoplesoft.html">Java example</a> 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!</p><pre><span style="color: #38761d;">REM ** What would you like to encode?;</span>
<span style="color: #2b00fe;">Local string</span> &textToEncode = "Hello World 🤔";
<span style="color: #38761d;">REM ** Pointer to Java encoder;</span>
<span style="color: #2b00fe;">Local JavaObject</span> &encoder = <span style="color: #2b00fe;">GetJavaClass</span>("java.util.Base64").getEncoder();
<span style="color: #38761d;">REM ** Be sure to change the character set to match your source;</span>
<span style="color: #2b00fe;">Local JavaObject</span> &bytes = <span style="color: #2b00fe;">CreateJavaObject</span>("java.lang.String", &textToEncode).getBytes("UTF-8");
<span style="color: #2b00fe;">Local string</span> &result = &encoder.encodeToString(&bytes);
<span style="color: #38761d;">REM ** print the result;</span>
<span style="color: #2b00fe;">MessageBox</span>(0, "", 0, 0, &result);
</pre><p>At <a href="https://www.jsmpros.com/">JSMpros</a>, we teach advanced PeopleTools concepts such as this all the time! Check out our <a href="https://www.jsmpros.com/events/">events page</a> to see what we are offering next, and <a href="https://www.jsmpros.com/groups/all-access/">become a subscriber</a> to get 24x7 access to all of our on-demand videos, activity guides, and code samples!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com2tag:blogger.com,1999:blog-34020393.post-17995523111070249172023-10-18T10:31:00.001-07:002023-10-18T10:31:30.927-07:00PeopleSoft ReConnect 2023<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn59tm5wOn5PTKbp0k4hw1sEV7KrvKywSpjq7fbnZh5sf48WyOa0pDcJHuxYA8kbK73WrkCcQk5hxVdDabXMCsv8fEav1SvhLChEO4AjTez_qkj6GvstWhiyxB4byvM8vGczMfmA5SDwKssmpet3vF8eA4AdmPb1op29xS124hi5yJCwujXJkS/s1200/Reconnect%202023%20Presenting%20copy.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="628" data-original-width="1200" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn59tm5wOn5PTKbp0k4hw1sEV7KrvKywSpjq7fbnZh5sf48WyOa0pDcJHuxYA8kbK73WrkCcQk5hxVdDabXMCsv8fEav1SvhLChEO4AjTez_qkj6GvstWhiyxB4byvM8vGczMfmA5SDwKssmpet3vF8eA4AdmPb1op29xS124hi5yJCwujXJkS/w400-h209/Reconnect%202023%20Presenting%20copy.png" width="400" /></a></div><br /><p><br /></p><p>Join me at PeopleSoft Reconnect 2023 for some amazing sessions covering a variety of PeopleTools Topics:</p><p></p><ul style="text-align: left;"><li>Wednesday, Oct 25, <i>7:30 AM Pacific</i>: <b>PeopleSoft Integration Strategies</b></li><li>Thursday, Oct 26, <i>8:30 AM Pacific</i>: <b>Getting the Most out of PeopleSoft PeopleTools: Tips and Techniques</b></li><li>Thursday, Oct 26, <i>09:45 AM - 10:45 AM Pacific</i>: <b>Moving from Customized to Configured, Make it Your PeopleSoft</b></li></ul><div>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 <a href="https://questoraclecommunity.org/events/conferences/peoplesoft-reconnect-dive-deep/">Quest PeopleSoft Community website</a>.</div><div><br /></div><div>See you online on Monday, October 23 for Paco's executive session, the first session of the conference!</div><p></p><p><br /></p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-50958012306252260282023-10-04T22:12:00.001-07:002023-10-04T22:12:34.678-07:00Stop Retrofitting and Analyzing Every Customization!<p>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 <i>isolated customizations</i> because changes are <i>isolated</i> 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?</p><p>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 <a href="https://blog.jsmpros.com/2017/12/event-mapping-lifecycle-management-lcm.html">SQL to help you locate code that includes Event Mapping that was touched by maintenance</a>. 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:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEibrmlNEO9jsh0VOmNu7U13d5H4SilAmeqUmQIC5JMT0__95zsvdFBb6Fd-xm1x033LR_CPOb54q_afFUaXFMfa92dCnZPxlQP4sYdqj0XuKZQ79TXITPhgqA0_PM5njMoIkBkKywNqYu4jkFJH2NRZo7Mt0ne_ZFpNjjEsYucD6Muv8Af0byv0" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="517" data-original-width="1056" height="196" src="https://blogger.googleusercontent.com/img/a/AVvXsEibrmlNEO9jsh0VOmNu7U13d5H4SilAmeqUmQIC5JMT0__95zsvdFBb6Fd-xm1x033LR_CPOb54q_afFUaXFMfa92dCnZPxlQP4sYdqj0XuKZQ79TXITPhgqA0_PM5njMoIkBkKywNqYu4jkFJH2NRZo7Mt0ne_ZFpNjjEsYucD6Muv8Af0byv0=w400-h196" width="400" /></a></div><br />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:<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgBQQgIVIDUGKIDpeKSx5cEy54jl-wxckTBUX8yo4TQh4pRuIFHNG8gBQnh97AjuVnldW03wRRCvt4gvLlw0ZbMdfvfvRzlns6ZbyP1ZmFqk-GmbnapzDI0o55ykYSRXQmv2wu7IIZhsj-FFAP1vqFOswJgJiaOeqoGX-KuyoeLv1c9qziJZsgl" style="margin-left: 1em; margin-right: 1em;"><img alt="Event Mapping Failure" data-original-height="713" data-original-width="1982" height="144" src="https://blogger.googleusercontent.com/img/a/AVvXsEgBQQgIVIDUGKIDpeKSx5cEy54jl-wxckTBUX8yo4TQh4pRuIFHNG8gBQnh97AjuVnldW03wRRCvt4gvLlw0ZbMdfvfvRzlns6ZbyP1ZmFqk-GmbnapzDI0o55ykYSRXQmv2wu7IIZhsj-FFAP1vqFOswJgJiaOeqoGX-KuyoeLv1c9qziJZsgl=w400-h144" width="400" /></a></div><br /><br /><p></p><p>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 <i>isolated</i> from Oracle's code. Therefore, there is no Compare Report. But as you can see, sometimes our code still breaks after maintenance.</p><p>So what is the solution? How do we identify isolated customizations that broke while applying maintenance? <b>Regression Tests</b>. 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.</p><p>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?</p><p>At JSMpros, we teach developers and business analysts how to create PTF Regression Tests through our two-day <a href="https://www.jsmpros.com/classes/ptf/">PeopleSoft Test Framework course</a>. Find out when we are offering it next, or learn at your own pace through on-demand!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-10250555149125826642023-08-03T14:07:00.003-07:002023-08-03T14:42:06.517-07:00"Technical Details" in Page and Field Configurator<p>I've had this challenge with Page and Field Configurator: </p><blockquote>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.</blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgKhZr28E3FF1ciXTGPDzcRrsjQ72PzufKinbPPUddiEpYjDHyFygaUKlLsBQ2K5PNgnpD3QEGm32RTMvrgqcOPjTq4kgBU7mj28NbXgDDo_ucy7u_c2F8G3qi-a6QRFpu3clW6bv6GhUr-IYligvJGqIxOUhKz_K07oKT4cgoNwBR8cyYV-K-I" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="260" data-original-width="599" height="174" src="https://blogger.googleusercontent.com/img/a/AVvXsEgKhZr28E3FF1ciXTGPDzcRrsjQ72PzufKinbPPUddiEpYjDHyFygaUKlLsBQ2K5PNgnpD3QEGm32RTMvrgqcOPjTq4kgBU7mj28NbXgDDo_ucy7u_c2F8G3qi-a6QRFpu3clW6bv6GhUr-IYligvJGqIxOUhKz_K07oKT4cgoNwBR8cyYV-K-I=w400-h174" width="400" /></a></div><br /><p>But there is a new-ish feature in Page and Field Configurator: The Configure Field Properties grid now includes a <b>Technical Details</b> tab!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhGgjZratBMoa6biRjtzmLkVD_tZYn5UJgkWGW7soHzPVUiz7XREuPYLCsHu9gi590gU-nHx0XL5y8UM9ufw4BPv-z5CAH0nVzO3vBpfGE_RvbUdeyL4J3wn1NGd1hxfrU9DGZjCbRtHjlqlgh_qOboSCOXEZZF98aku8BBR7n83eUIp1sQk49L" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="298" data-original-width="647" height="184" src="https://blogger.googleusercontent.com/img/a/AVvXsEhGgjZratBMoa6biRjtzmLkVD_tZYn5UJgkWGW7soHzPVUiz7XREuPYLCsHu9gi590gU-nHx0XL5y8UM9ufw4BPv-z5CAH0nVzO3vBpfGE_RvbUdeyL4J3wn1NGd1hxfrU9DGZjCbRtHjlqlgh_qOboSCOXEZZF98aku8BBR7n83eUIp1sQk49L=w400-h184" width="400" /></a></div><br />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!<p></p><p>Want to learn more about Page and Field Configurator? Sign up for our next <a href="https://www.jsmpros.com/classes/cdc-ag/">Configure, Don't Customize</a> class at <a href="http://jsmpros.com">jsmpros.com</a>!</p><p><br /></p><p><br /></p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-18565775206118898282023-06-20T08:36:00.003-07:002023-06-20T08:36:52.985-07:00Enabling Search Framework Real Time Indexing (RTI)<p>As we prepare our <a href="https://youtu.be/riScZZ8FIZw">HCM PUM 46</a> 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.</p><p>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 <b>PTSF_RECENTMENU </b>and the <b>PTPORTALREGISTRY </b>indexes. To summarize the prerequisites, we need a:</p><ul style="text-align: left;"><li>Working Elasticsearch (OpenSearch) installation and</li><li>Deployed indexes</li></ul><p style="text-align: left;">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.</p><p style="text-align: left;">RTI works by using the following:</p><div><ul><li>Triggers to insert rows into a staging table and</li><li>A Process Scheduler server process that checks for new rows in the staging table</li></ul></div><p style="text-align: left;">Enabling RTI is a multi-step process requiring:</p><p style="text-align: left;"></p><ul style="text-align: left;"><li>Process Scheduler-specific configurations and</li><li>Index-specific configurations</li></ul><p></p><h3 style="text-align: left;">Process Scheduler Configuration</h3><p style="text-align: left;">Let's start with the Process Scheduler Server. Using the <b>psadmin </b>command, make sure <b>Real Time Indexing</b> is enabled, as demonstrated in the following screenshot:</p><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi7GEnj2Ppu9vknrF0w7tCF0M0DULycckiHHAGgNTgniyAYvAlat0PeN9itFABe8fKp2F1ob4khdLCmXUWblw4yISXPfCWUcg-3-fscNUf2yUd-M4K52XDBvXxnMkxx5q8br-LBKSm_nq-2Ui_5vh-Lyyft3csdh6SY8Rzx-kpvqj5TGdWeBg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="512" data-original-width="979" height="167" src="https://blogger.googleusercontent.com/img/a/AVvXsEi7GEnj2Ppu9vknrF0w7tCF0M0DULycckiHHAGgNTgniyAYvAlat0PeN9itFABe8fKp2F1ob4khdLCmXUWblw4yISXPfCWUcg-3-fscNUf2yUd-M4K52XDBvXxnMkxx5q8br-LBKSm_nq-2Ui_5vh-Lyyft3csdh6SY8Rzx-kpvqj5TGdWeBg" width="320" /></a></div><p>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 <b>psprcs.cfg</b> file.</p><pre>[PSRTISRV]
;=========================================================================
; Settings for Real Time Indexing watchdog
;=========================================================================
;-------------------------------------------------------------------------
Min Instances=1
Max Instances=1</pre><p></p><p>We may configure the polling interval through the Search Instance <i>Search Options Config</i> (PeopleTools > Search Framework > Administration > Define Search Instances). The last several options relate to RTI:</p><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgzj2bGHVbJaFJQP9WXQIvw-_WY8jxB4SHFN4IWApdmAGv00V3NwOjMgclElnU-yiASYoQVQfPlSImH4owSNF5sFV0VLH_a39WJ-3FQvdZbGugReVuIJ-g_ME2VnLqtX2cBqFf786hysKZg1UgxZfYo266OJuKX0Qqk6TV7IBucqADQNv2L5g" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="235" data-original-width="640" height="118" src="https://blogger.googleusercontent.com/img/a/AVvXsEgzj2bGHVbJaFJQP9WXQIvw-_WY8jxB4SHFN4IWApdmAGv00V3NwOjMgclElnU-yiASYoQVQfPlSImH4owSNF5sFV0VLH_a39WJ-3FQvdZbGugReVuIJ-g_ME2VnLqtX2cBqFf786hysKZg1UgxZfYo266OJuKX0Qqk6TV7IBucqADQNv2L5g" width="320" /></a></div><br /><p style="text-align: left;">The <b>Heartbeat Interval</b> determines how often the RTI process checks for new rows in the RTI staging table (PS_PTSF_RTISTG). The <b>Real Time Indexing Set Size</b> 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 <b>Set Size</b> threshold, meaning RTI may only clear the queue after hours, creating a larger backlog with each run.</p></div><p style="text-align: left;">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.</p><h3 style="text-align: left;">Index Configuration</h3><p style="text-align: left;">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 <b>Disabled</b>. These are indexes that contain RTI metadata, making them trivial to enable. Indexes marked as <b>Not Configured</b> may be enabled but will require additional configuration before enabling.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhUuq5JtOIZJlMJB7MAXfFc5uJdBGepQgtYIQBNwZM50frZTfAuH2g8rNByQGCzQj04RsiJ-5iDuWG1KlTZA76emXXUxqoefL4_fzSIdKBjPhP3JBWzFvpAkzq5uBhM0zCTnpiDoj4911xqwDF_89zp762bOmY2TTI5ArgqZ3z-MS0SR-D3hA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="891" data-original-width="1219" height="234" src="https://blogger.googleusercontent.com/img/a/AVvXsEhUuq5JtOIZJlMJB7MAXfFc5uJdBGepQgtYIQBNwZM50frZTfAuH2g8rNByQGCzQj04RsiJ-5iDuWG1KlTZA76emXXUxqoefL4_fzSIdKBjPhP3JBWzFvpAkzq5uBhM0zCTnpiDoj4911xqwDF_89zp762bOmY2TTI5ArgqZ3z-MS0SR-D3hA" width="320" /></a></div><br /><br /><p></p><p>In our demo environments, we enabled PTSF_RECENTMENU. To enable an index:</p><p></p><ul style="text-align: left;"><li>Check the box <b>Enable Real Time Indexing</b>,</li><li>Save, and</li><li>Click the <b>Trigger SQL</b> link to download database-specific triggers.</li></ul><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEib9Q8qm99i7FmUxYfK-WoJPYG3_AUXR7zy_4qqDiWK35jnnafPydAnDuywmrbWElGWwHPhApQXzII0kxldtLVNKckCRvq8ajcY-H2ALOPN_D4JKz4v8Zro7jyG91s4_N80W_87dAD4j2DEFwau6vZOoyNm3GW0qu9eKWBlw56bGOqXfdjGvw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="891" data-original-width="1219" height="234" src="https://blogger.googleusercontent.com/img/a/AVvXsEib9Q8qm99i7FmUxYfK-WoJPYG3_AUXR7zy_4qqDiWK35jnnafPydAnDuywmrbWElGWwHPhApQXzII0kxldtLVNKckCRvq8ajcY-H2ALOPN_D4JKz4v8Zro7jyG91s4_N80W_87dAD4j2DEFwau6vZOoyNm3GW0qu9eKWBlw56bGOqXfdjGvw" width="320" /></a></div><br /><br /><p></p><p>When you click the <b>Trigger SQL</b> 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: <b>ora</b> for Oracle, <b>mss</b> for Microsoft SQL Server, and <b>db2</b> 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.</p><p>Alternatively, as described by Ravi and Ramasimha in their <a href="https://questoraclecommunity.org/learn/recordings-presentations/peopletools-8-59-enabling-real-time-indexing/">Quest Recorded Webcast</a>, 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.</p><div>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.</div><p>Here are some great resources with additional information about RTI:</p><p></p><ul style="text-align: left;"><li><a href="https://youtu.be/REkTDyGcPNk">Siva Koya's RTI YouTube Video</a></li><li><a href="https://peoplesofttutorial.com/understanding-real-time-indexing/">PeopleSoft Tutorial</a></li><li><a href="https://questoraclecommunity.org/learn/recordings-presentations/peopletools-8-59-enabling-real-time-indexing/">Quest Recorded Webcast</a></li></ul><h3 style="text-align: left;"><b>Is RTI Really "Real time"?</b></h3><p style="text-align: left;">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.</p><h3 style="text-align: left;">Which Indexes Should You Enable?</h3><p style="text-align: left;">We recommend starting with <b>PTSF_RECENTMENU</b>. 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.</p><p style="text-align: left;"><br /></p><p style="text-align: left;">At <a href="http://jsmpros.com/">JSMpros</a>, 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! <a href="https://www.jsmpros.com/events/">Check out our website to see what we are offering next</a>!</p><p style="text-align: left;">Access all of our content anytime from anywhere through our <a href="https://www.jsmpros.com/groups/all-access/">all-access subscriptions</a>. <a href="https://www.jsmpros.com/groups/all-access/">Check it out</a>!</p><p></p></div>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com1tag:blogger.com,1999:blog-34020393.post-1808463410228446712023-05-20T09:41:00.000-07:002023-05-20T09:41:35.035-07:00PeopleTools Learning Subscriptions<p>Are you looking to take your PeopleSoft Development skills to the next level? Look no further than our <a href="https://www.jsmpros.com/groups/all-access/">All-access Learning Membership</a>.</p><p>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.</p><p>The membership also includes access to PeopleSoft experts, where you can ask questions and get feedback.</p><p>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.</p><p>And with new content added regularly, you'll always have something new to learn and explore.</p><p>So if you're ready to take your PeopleTools skills to the next level, sign up for the All-access Learning Membership at <a href="https://www.jsmpros.com/groups/all-access/" rel="nofollow" target="_blank">https://www.jsmpros.com/groups/all-access/</a>. Your future self will thank you!</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://www.jsmpros.com/groups/all-access/" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="628" data-original-width="1200" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3CIUHj_WRNgAdNN33zUQ2xerI1-jjhHvgr8U3dskWm6EuvBmGniL2WuygrqJ78iBi6LOMHC0SBijedfw1PK2dtF2l-woc81-Z20wOxs0M4YYdO_LPQ3JxPzlqtZjtBRDLixmE_s-NSkkXKDAhPNKyLqXH2aR32AVPDA-cAkAMnA4pFp1c5g/w400-h209/All%20Access.png" width="400" /></a></div><br /><div><br /></div><div><br /></div>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-62316719580458654282023-05-16T14:36:00.004-07:002023-05-16T14:36:45.400-07:00HIUG Interact 2023<div class="separator" style="clear: both; text-align: center;"><a href="https://www.hiug.org/higherlogic/s/p/cm/ld/fid=694" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="1280" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMuMbZmRz0vNOTk7oNBIW6Kyq2QhdPzpjbNwVq-xwkTcB5zxqwwvAIcCDes3OjileQb2mPS6pZwWelHwgGE5Dk0C-eoo2fn1lSvJYWhiE6qV_cjmDg3G3BkYxkYaPJvT4ef3RNSPs3qGkTkolItr_1TQ4ymYqdpHXX_mlg750zJhDsPXlmJw/w400-h100/tsztbqll.png" width="400" /></a></div><br /><p>User group conferences are a fantastic opportunity to network with and learn from peers. And we are just a few weeks away from the Healthcare PeopleSoft Industry User Group meeting Interact 2023! I am presenting my signature session, <a href="https://www.hiug.org/higherlogic/s/p/cm/ld/fid=724&eaid=2744">Getting the Most out of PeopleSoft PeopleTools: Tips and Techniques</a> on Tuesday, June 13 from 9:30 AM - 10:30 AM in room Condesa 3.</p><p>See you there!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com2tag:blogger.com,1999:blog-34020393.post-66776168306235784232023-05-07T14:50:00.000-07:002023-05-07T14:50:36.252-07:00Eliminate Extra Spacing in JSON<p>PeopleCode's JsonObject and JsonArray are incredibly important to building a modern PeopleSoft integration, and we teach our students how to leverage them directly. Both have a ToString method that converts the internal object into a String perfect for integration. But the ToString method returns pretty-printed, nicely formatted, human-readable JSON output. This is fantastic for debugging and development! But it wastes valuable bandwidth and disk space with unnecessary characters. Computers ignore those extra spaces. Here is a trick we teach our students to help them reduce their JSON Payloads.</p><pre>REM ** compress extra space;
Local JsonGenerator &jgen = CreateJsonGenerator();
Local JsonNode &root = CreateJsonNode();
Local string &json;
&root.SetJsonObject(&someJsonObject);
&jgen.SetRootNode(&root);
&jgen.SetPrettyMode( False);
&json = &jgen.ToString();
</pre><p>Got a JSON tip to share? Leave it in the comments. We would love to hear it!</p><p>At <a href="https://www.jsmpros.com/">jsmpros</a>, we teach Integration Tricks like this regularly. Be sure to check our <a href="https://www.jsmpros.com/events/">schedule </a>to see what we are offering next! Want to learn more, but at your own pace and in your own time? Check out our <a href="http://jsmpros.com/classes/ib-update/">on-demand Integration Tools course</a> and <a href="https://www.jsmpros.com/groups/all-access/">All Access Pass</a>!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-62591784910220552912023-04-13T11:28:00.001-07:002023-04-13T11:28:54.955-07:00RECONNECT Live 2023 at Blueprint 4D!<p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="628" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHrnIO4qzAPg3JV3UCu8DQgh7NJ14_2YHCRWy5g3qx4zpZgH-q17C_WwtGMf9TEzbpGgYaPPKkahNbLuTCTcMjmdsTMXmTXROBKSSph-olzSi5VWUEvJ3Q1hSBqK9bH_3koDrSQRlE5Y6xEA-yvuJXNnIw9B5gUdYjlj0GTEA5rGnlmMDyw/w640-h334/BP4D%20Reconnect%202023.png" width="550" /></div><p>Reconnect Live is just around the corner, and I'm looking forward to <em>reconnecting</em> with you and the rest of the PeopleSoft community. As you plan your schedule, here is a list of sessions I am presenting:</p><p></p><ul style="text-align: left;"><li><b>PeopleSoft Integration Strategies:</b> Tuesday, May 9, 2023, from 3:30 PM to 4:15 PM in Metropolitan</li><li><b>Getting the Most out of PeopleSoft PeopleTools: Tips and Techniques:</b> Wednesday, May 10, 2023, from 11:15 AM to 12:00 PM in Monet</li></ul><p></p><p>Are you presenting? If so, share your session details in the comments. See you there!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-75438668421880649222023-03-23T11:47:00.000-07:002023-03-23T11:47:41.811-07:00Fluid Page Naming Conventions<p>Best practices are an essential part of our curriculum. When creating Fluid pages, we recommend the following page name pattern:</p><pre><site-prefix><purpose><page-type></pre><p>For example, when creating a Fluid subpage to manage widgets, we would name it <code>JSM_WIDGETS_SBF</code>. Here is a list of page-type suffixes derived from Oracle-delivered pages:</p><dl><dt>FL</dt><dd>Fluid Page</dd><dt>SBF</dt><dd>Subpage Fluid</dd><dt>SCF</dt><dd>Secondary Page Fluid</dd><dt>SFL</dt><dd>Side Page (1 or 2)</dd><dt>FFL</dt><dd>Footer Page</dd><dt>LFL</dt><dd>Layout Page</dd></dl><p>But four more page types aren't used enough to have a suffix pattern: Header Page, Search Page, Prompt Page, and Master&Detail Target Page. For those page types, we've come up with our own suffixes:</p><dl><dt>HFL</dt><dd>Header Page</dd><dt>SRF</dt><dd>Search Page</dd><dt>PFL</dt><dd>Prompt Page</dd><dt>MDF</dt><dd>Master&Detail Target Page</dd></dl><p>For the most part, the convention is easy to understand. First initial of page type, and then <b>FL</b>. But what about SRF? Where did that come from? There are four page types that start with the letter S. Adding the R after the S looked more like <i>Search</i> than any of the other options we considered.</p><p>With Classic already having the suffixes SEC, SUB, and POP, we have suffixes for every page type except Classic standard pages. Should we, therefore, adopt <b>_CL</b> for Classic pages? PeopleSoft uses exception-based design. For example, the page bar is on until you turn it off, and the standard component toolbar is on until you turn it off. Changing these properties would be exceptions. Naming conventions are no different. Our naming conventions document the exceptions. With over 12,000 Classic pages in HCM, Classic is clearly the norm, and everything else is an exception.</p><p>What do you think? Do you have different naming conventions you use for page development? If so, share your ideas in the comments!</p><p>At <a href="https://www.jsmpros.com/">JSMpros</a>, we teach PeopleSoft <a href="https://www.jsmpros.com/fluid/">Fluid training</a> and best practices regularly. We look forward to hosting you in a <a href="https://www.jsmpros.com/events/">future class</a>!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com2tag:blogger.com,1999:blog-34020393.post-35086951037513919862023-02-24T09:55:00.001-08:002023-02-24T09:55:45.381-08:00Does Event Mapping Apply to Content References?<p>Help! My Event Mapping code isn't firing! Because this happens occasionally, I have a simple debugging process:</p><p></p><ol style="text-align: left;"><li>Insert a "Hello World!" Message Box statement into my code. The point is to prove whether or not Event Mapping is properly configured. If I don't see the Message Box, then I know PeopleSoft ignored my code, and I may have a misconfiguration. If the MessageBox appears, then the configuration is correct, and the problem is in my code.</li><li>If the Message Box does not appear, the next step is to confirm the correct Content Reference. We apply Event Mapping through Content References. Selecting the wrong Content Reference will keep the code from executing. This is an easy mistake to make because several Content References use the same label. Sometimes the solution is a bit of trial and error, testing various Content References until we find one that works. We can also <a href="https://blog.jsmpros.com/2017/12/event-mapping-lifecycle-management-lcm.html">query PeopleTools metadata</a> to confirm we selected the correct Content Reference.</li></ol><p style="text-align: left;">Those two steps usually identify any issues. But this time was different. First, my "Hello World" Message Box did not appear. Second, I confirmed I was using the correct Content Reference. I was puzzled. What could it be?</p><p style="text-align: left;">As I dug through the metadata, I found something interesting! There were two Content References pointing to the same menu/component combination! The point of a Content Reference is to generate a unique URL fragment. PeopleSoft Component Content References use the menu, component, and market to generate that unique URL fragment. Have you ever tried to create two content references that point to the same menu/component combination? It doesn't work. PeopleSoft won't let you save until you make the URL unique. An old trick that developers use is to add Additional Parameters. A simple "X=X" is usually enough. Or in this case, it was "Tile=Y." (Note: While there may be a reason to create a redundant Content Reference, a better approach is usually to use a Content Reference Link).</p><p style="text-align: left;">Actually, finding redundant Content References is commonplace in today's Fluid Portal Registry. Fluid's framework components, such as Activity Guides, Dashboards, and Homepages require creating Content References that all point to the same menu/component combination, with Additional Parameters identifying uniqueness. We have done extensive research on Event Mapping and found this is normally not an issue. What we found is that applying Event Mapping to any one of those redundant Content References results in Event Mapping applying to all of the Content References. The example we use in our Event Mapping course is applying Event Mapping to Tile Wizard's runtime component.</p><p style="text-align: left;">This is what puzzled me with today's scenario. I already knew there were multiple Content References pointing to the same Menu/Component combination. I've repeated this many times without issue. If I apply Event Mapping to one of those redundant Content References, all exhibit the same behavior. But this time, nothing happened. Or more appropriately, the system didn't do what I thought it should do. Upon further inspection, I found that someone else had used Page and Field Configurator to apply Event Mapping to the other Content Reference. It appears that PeopleSoft properly found Event Mapping for the menu/component combination, but the configuration it found wasn't mine. It seems that Event Mapping queries the database for the first configuration. Mine happened to be second.</p><p style="text-align: left;">I find it interesting that we configure Event Mapping through Content References, not Menu/Component combinations. Based on my experience today, and the fact that we must apply a Menu to a Component Interface to leverage Event Mapping against Component Interfaces, it seems that Event Mapping really applies to Menu/Component combinations, not Content References. What if the Event Mapping configuration asked us to select a Menu, and then gave us a list of Components attached to that menu? What if we configured Event Mapping through Menu/Component combinations, not Content References?</p><p style="text-align: left;"></p><ul style="text-align: left;"><li>Redundant Content References would be irrelevant.</li><li>We wouldn't have to create Content References against hidden components simply to apply Event Mapping.</li><li>We wouldn't have to guess if we chose the proper Content Reference based on a label and a root folder.</li><li>We would know for sure that we selected the correct Menu/Component.</li></ul><p></p><p style="text-align: left;">With that in mind, <a href="https://community.oracle.com/mosc/discussion/4535919/configure-event-mapping-through-menu-component-combinations-not-crefs">I created a new Idea in the PeopleSoft Idea Labs</a>. If you like this idea, please upvote, share, and leave comments.</p><p></p><p>At <a href="https://www.jsmpros.com/">JSMpros</a>, we teach Event Mapping regularly. Check out our <a href="https://www.jsmpros.com/events/">website</a> to see what we are offering next!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-32794807477727784622023-02-09T14:52:00.003-08:002023-02-13T10:21:45.730-08:00Did Event Mapping Break Your Update?<p>I love Event Mapping. But I have a concern:</p><blockquote>The benefit of Event Mapping is that your customizations no longer appear on a compare report, and the problem with Event Mapping is that your customizations no longer appear on a comapre report.</blockquote><p>I know what you are thinking: "Wait, didn't he just contradict himself?" Yes! Let me explain with a scenario:</p><blockquote>Let's say you move a customization into Event Mapping. Later you apply an update. You run a compare report and see the beautiful "change/change" with no asterisks. Perfect! You have no customized code, and therefore nothing to retrofit. And then you test the upgraded system. And you find the system is broken. Since you have no customizations identified in the compare report, you should be fine, right? If this happened to me, my first thought would be that something is wrong with the update, and I would file a support ticket. But unfortunately, Oracle support can't replicate the issue. After escalation and further analysis, Oracle discovers that custom Event Mapping is causing the problem.</blockquote><p>I share this scenario because it is possible, but it seems like a worst-case scenario. Does it really happen? Do custom, invisible event mapping "configurations" ever break an update/get current? It turns out they do! MOS doc <a href="https://support.oracle.com/epmos/faces/DocumentDisplay?id=2798164.1">2798164.1</a> was posted in 2021 and demonstrates this scenario.</p><p></p><div>The problem with broken Event Mapping code is that it fails just like any other code, so we can't tell that the failure was caused by Event Mapping. Event Mapping is not a configuration. It is an isolated customization.</div><p></p><p>Event Mapping is amazing! But until Oracle provides us with LCM tools that identify potential Event Mapping issues, we must perform our own analysis. Here are some options to help you catch troublesome Event Mapping:</p><p></p><ol style="text-align: left;"><li>Use SQL <a href="https://blog.jsmpros.com/2017/12/event-mapping-lifecycle-management-lcm.html">in this blog post</a> to create your own Event Mapping analysis.</li><li>Use <a href="http://www.jsmpros.com/classes/ptf/">PTF</a> to create Event Mapping and Page and Field Configurator Regression tests.</li><li>Wrap Event Mapping in a try/catch block to log and notify.</li></ol><div>We teach Event Mapping and <a href="https://www.jsmpros.com/classes/ptf/">PeopleSoft Test Framework</a> regularly. Check out our <a href="https://www.jsmpros.com/events/">website</a> to see what we are offering next!</div><p></p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-66327248099778213902023-01-19T14:21:00.002-08:002023-01-19T14:21:44.172-08:00See you in St Louis for Alliance 2023!<p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://www.alliance-conference.com/p/cm/ld/fid=4659&aid=25477"><img border="0" data-original-height="628" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguhQJ3A_sathXE1cDGsU4fexOMQSpC0lhGzW07izyUNoa0IboQpBqAk8AQRGicW1mzxsAIJ7tyxpLzy55GhzBVXi1JU1ZMdELCelMO31elSwbTorHj5yYeKiRJUz9vA8tSBe5ai5TX89vOi4MnpthwGYdbhgkduOxJgU_uDSo_7fouyZMbiA/w640-h334/Alliance%202023.jpg" width="100%" style="border: none;margin: 0;padding: 0;
"></a></div><br />The HEUG <a href="https://www.alliance-conference.com/">Alliance 2023</a> conference begins next month! I've been reviewing the schedule, and there are some incredible sessions on the agenda.<p></p><p>I am presenting the following sessions:</p><h4 style="text-align: left;">Monday, Feb 27th</h4><p>9:00 AM - 10:00 AM: PeopleSoft Fluid: Zero to Hero in 60 Minutes</p><p>1:00 PM - 2:00 PM: Getting the most out of PeopleSoft PeopleTools: Tips and Techniques</p><h4 style="text-align: left;">Tuesday, Feb 28th</h4><p>9:00 AM - 10:00 AM: PeopleSoft Integration Strategies</p><p>See you there!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com1tag:blogger.com,1999:blog-34020393.post-60364811871485115842022-11-21T11:33:00.000-08:002022-11-21T11:33:20.704-08:00"Find Definition References" for Page and Field Configurator<p>A student recently asked:</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><blockquote>Is there an Edit | Find Definition References equivalent for Page and Field Configurator?</blockquote></blockquote><p>Great question! In Application Designer, we can open a field and choose Edit | Find Definition References to find all usages of that field. Unfortunately, Page and Field Configurator does not have an equivalent. The good news, however, is Page and Field Configurator is metadata driven. In other words, we can create our own "Find Definition References" equivalent by writing SQL. Here is a short example to get you started:</p><pre>SELECT *
FROM PS_EOCC_CONFIG_FLD
WHERE FIELDNAME = 'DESCR'</pre>
<p>The <code>EOCC_CONFIG_FLD</code> record contains the Component name, Record name, and Field name, allowing us to effectively "Find Definition References" for any of those three items.</p><p>At JSMpros, we teach PeopleTools Tips like this every week. Be sure to <a href="https://www.jsmpros.com/events/" target="_blank">check our website</a> to see what we are offering next!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-91301391215892118002022-11-08T07:26:00.003-08:002022-11-08T07:31:20.662-08:00TokenChpoken<p style="text-align: left;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxLAiSoBYP38v7lPGDb4EqgGeoU65t-Q4tTUNRcY3zTiUC6MH7XtaSXNKNtdb5Omm4Fveai2nq5xuZaiPUAPTr9cjB9q-PE2YAAFtqNrGmjOik5DhCsWhW9Lg_allITAa73mo3IMvnxReLGF2O66l5MiVTvtOYXtey8172bk8PSU_VSQOAAA/s1200/SparkyAndCookies.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="628" data-original-width="1200" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxLAiSoBYP38v7lPGDb4EqgGeoU65t-Q4tTUNRcY3zTiUC6MH7XtaSXNKNtdb5Omm4Fveai2nq5xuZaiPUAPTr9cjB9q-PE2YAAFtqNrGmjOik5DhCsWhW9Lg_allITAa73mo3IMvnxReLGF2O66l5MiVTvtOYXtey8172bk8PSU_VSQOAAA/w400-h210/SparkyAndCookies.png" width="400" /></a></div><br />Several years ago, ERPScan published a <a href="https://erpscan.io/tag/tokenchpoken/">series of articles</a> describing PeopleSoft security attack vectors. While reading the series, keep in mind it was written nearly a decade ago, and PeopleSoft has made changes to security to mitigate the issues raised by ERPScan. For example, their article about the Access Token ends with the note, "this vulnerability was patched in Oracle CPU for October 2014." Note to self: Apply CPUs! But the topic that keeps coming up is <b>TokenChpoken</b>.<p></p><h2 style="text-align: left;">What is TokenChpoken?</h2><p style="text-align: left;">When you authenticate (log in) to PeopleSoft, PeopleSoft sends a cookie to your browser. Thereafter, PeopleSoft identifies you by that cookie. For every request, PeopleSoft asks, "who are you?" and that cookie supplies the answer. This cookie is critical to cross-product SSO for unified navigation, Interaction Hub, etc. <a href="https://erpscan.io/press-center/blog/peoplesoft-security-part-3-peoplesoft-sso-tokenchpoken-attack/">TokenChpoken</a> describes how to decrypt that cookie, change the OPRID, and assume the identity of someone else. Pretty scary! But is it legitimate? As described by the TokenChpoken write-up, someone leveraging this approach must know your user ID, the SSO node name, and the node password must be discoverable through a modern brute-force attack. If you renamed your nodes and use strong passwords, you are a long way from a TokenChpoken "vulnerability." But that doesn't eliminate the potential. It is now a risk calculation.</p><p style="text-align: left;">Is TokenChpoken still relevant for today's PeopleSoft? In PeopleTools 8.56, PeopleSoft implemented a "knock knock/callback" pattern with a check token. Dan Iverson has a great <a href="https://psadmin.io/2017/10/25/understanding-the-check-token-id-in-peopletools-8-56/">write-up</a> on this 8.56 feature. Likewise, as of 8.56, if I restart my web server while browsing PeopleSoft, PeopleSoft renders the message "unauthorized token detected." It seems like PeopleSoft now keeps a list of issued tokens in memory, and a restart clears that list. These are fantastic safeguards against a potential TokenChpoken Switch User. My thought is,</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">"If PeopleSoft won't accept its own token after a restart, why would it accept a modified token?"</p></blockquote><p style="text-align: left;">But is this enough?</p><p style="text-align: left;">A few years ago, Colton Fischer came up with a simple way to test functionality as a different user. You log into PeopleSoft as yourself, press a bookmark in your web browser, supply the node name, node password, and the target user ID, and instantly become someone else. You may find his project <a href="https://github.com/coltonfischer/ps-switchtoken">here</a>. As a developer and tester, this sounds fantastic! Through a "master password," I can assume the identity of anyone for testing purposes, of course. How does it work? It is essentially TokenChpoken in the web browser. What does that mean? TokenChpoken is alive and well.</p><h2 style="text-align: left;">Mitigation</h2><p style="text-align: left;">As documented by <a href="https://psadmin.io/2017/10/25/understanding-the-check-token-id-in-peopletools-8-56/">Dan Iverson</a>, setting the Check Token and node password on your nodes, as well as changing node names from something other than the default PSFT_xx, is a great start. And that start may be enough. But you might want to try Colton's <a href="https://github.com/coltonfischer/ps-switchtoken">bookmarklet</a> to see if you can become someone else. If so, here is another idea: Eliminate the PS_TOKEN cookie. Eliminating the PS_TOKEN is a bit controversial as this is the "key" to PeopleSoft SSO, and it may not be the right solution for you. But here is how it works: As a request leaves a load balancer or web server, the web server/load balancer replaces PS_TOKEN with a different, randomized cookie. On re-entry, the web server/load balancer maps that random cookie to the original PS_TOKEN. PeopleSoft is unaware and functions as usual. If all of your PeopleSoft instances are behind the same load balancer and use the same domain, then SSO may work as usual, and token replacement may be a great option. If you want an off-the-shelf solution, check out P<a href="https://pathlock.com/contact/">athlock's ERP Firewall</a>, which has built-in TokenChpoken mitigation.</p><p style="text-align: left;">Since most PeopleTools classes involve nodes and security, we talk about TokenChpoken regularly. To learn more about this topic and other PeopleTools tips, <a href="https://www.jsmpros.com/events/">check out our website</a> to see what we are offering next!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-70446957544045309232022-10-28T08:06:00.001-07:002022-10-28T08:06:22.386-07:00Triggering FieldChange from JavaScript<p>We love a challenge, and we believe anything is possible with PeopleTools. It is never a question of "can you?" but "how?" A customer recently shared a challenge with us:</p><blockquote>We use a handheld scanner to enter values into a text field of a Fluid Page. After scanning, we want FieldChange PeopleCode to load data into the remainder of the page. Our solution worked great in PeopleTools 8.58, but quit working after upgrading to 8.59.</blockquote><p>Since many scanners act as automated keyboards, sending keystrokes derived from barcodes, there are several ways to handle this. The simplest way is to include a button immediately following the data entry field and use this button to trigger FieldChange. But this got us thinking about another scenario:</p><blockquote>How do you trigger FieldChange if you use JavaScript to update a data entry field?</blockquote><p> The process involves three steps:</p><p>1. Use JavaScript to update a data entry field. The JavaScript might look something like this:</p><pre>document.getElementById('MYRECORD_MYFIELD_ID').value = 'The new value';</pre><p>2. Stage field changes by triggering the onchange handler</p><pre>document.getElementById('MYRECORD_MYFIELD_ID').onchange();</pre><p>3. Trigger PeopleSoft's Ajax processing</p><pre>submitAction_win0(document.win0, id);</pre><p>Notice the <code>win0</code> in step 3? That is a system-generated name that reflects the current window ID. PeopleSoft uses the Meta-HTML <code>%FormName</code> at design time.</p><p>Here is a short example I put together for the PeopleTools 8.59 Event Mapping configuration page, complete with HTML element IDs, that demonstrates using <code>%FormName</code>. The purpose of the fragment is to set the service name for an event and trigger PeopleSoft processing:</p><script src="https://gist.github.com/jsmpros/86bdba835a75c94a8a2e18f28c3ad9cb.js"></script><p>Please note: this is an unsupported example that worked for a specific use case but may not work for others. We provide it as an example of what's possible and as a starting point for your own solution.</p><p>Are you interested in learning more PeopleSoft Fluid tips and tricks? Be sure to enroll in one of our <a href="https://www.jsmpros.com/events/">upcoming events</a>!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-26774033608840639402022-10-26T14:08:00.006-07:002022-10-26T14:08:39.242-07:00Decustomization Strategies Free Webcast!<p style="text-align: left;">Join us Thursday, November 3, 2022, for a free 30-minute webcast describing PeopleSoft decustomization strategies such as:</p><p style="text-align: left;"></p><ul style="text-align: left;"><li>When should you Decustomize?</li><li>What tools are available?</li><li>How do you use those tools?</li></ul><p style="text-align: left;">Be sure to <a href="https://www.jsmpros.com/event/free-config-webcast-22/?source=blog">register</a> immediately, as the webcast is next week! It all starts at 12:15 Central.</p><br /><div style="padding: 56.25% 0px 0px; position: relative;"><iframe allow="autoplay; fullscreen; picture-in-picture" allowfullscreen="" frameborder="0" src="https://player.vimeo.com/video/764232703?h=5dac513647&badge=0&autopause=0&player_id=0&app_id=58479" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;" title="Strategies for Decustomizing PeopleSoft!"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-26207389429133094512022-10-25T08:18:00.001-07:002022-10-25T08:18:39.579-07:00Announcing Configuration Day 2022!<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/743261617?h=7601bea1ea&badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Announcing Configuration Day 2022!"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
<p>
Announcing PeopleSoft Configuration Day! Join me online Thursday, November 17th for a full day PeopleSoft education experience filled with tips and best practices. Space is limited so register now!
</p>
<p style="text-align: center;"><a href="https://www.jsmpros.com/event/cd22/?source=blog" style="background: rgb(216, 88, 66); border-radius: 0.4em; color: white; display: inline-block; padding: 0.5em 1em; text-decoration: none;" target="_self">Register Now!</a>
</p><p>Here are some of the topics we will cover and questions we will answer:</p><h2 style="text-align: left;">Configuration versus Customization</h2><p></p><ul style="text-align: left;"><li>Are Page and Field Configurator changes really configurations?</li><li>What about Event Mapping or Drop Zones?</li><li>Why does Oracle call these features "isolating customizations?"</li></ul><p></p><h2 style="text-align: left;">PeopleSoft Test Framework</h2><p>Isolated customizations do not appear on compare reports. But without compare reports, how do you know what to test and what to retrofit? Learn how to use PTF to regression test configurations and isolated customizations. Experience the new PTF Chrome-based recorder when you join us Thursday, November 17th.</p><h2 style="text-align: left;">Security</h2><p>Learn about the data privacy framework and how it differs from Page and Field Configurator's Data Masking. Learn how functional business analysts may use roles to secure, hide, and mask fields.</p><h2 style="text-align: left;">Extending Oracle-delivered page Content</h2><p>Learn how to use Related Content and Drop Zones to add more content to Oracle-delivered pages. Find out where these features are similar and where they differ. Learn when to use which tool.</p><h2 style="text-align: left;">HCM Application-Specific Configurations</h2><p>What do My Team, Job Data, and Benefits have in common? HCM-specific configuration options. Should you use these options or the more generic PeopleTools configuration alternatives? Join us on Thursday, November 17th to find out!</p><h2 style="text-align: left;">Activity Guides</h2><p>Should you use PeopleTools Activity Guides directly or Activity Guide Composer? Find out on Thursday, November 17th!</p><p><br /></p><p>Register now to find the answers to these and many more questions on Thursday, November 17th.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://dd21.jsmpros.com/?source=blogger&utm_source=blogger&utm_medium=20210708&utm_campaign=dd21" style="border: none; clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="299" data-original-width="387" height="148.5" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCRD4AIkq3QSzcgUjjg7z5da4zI0p51xzRdzNVjyJw8Eu1bMRzpZh-mP3p09wL4o49AyxoK_EfacpL1z9bI2Tt-DrBwwyLztt6hsB7q8gmK-0RJHR6-VKtzlyhyphenhyphenG64-VRTmVQ4/w256-h198/%2528tickets%2529.png" width="192" /></a></div>
<p>The cost for this event is $447 per person. If you have a group of 10 or more, contact us at <a href="mailto:info@jsmpros.com">info@jsmpros.com</a> for a quantity discount.</p>
<p style="margin-top: 2em; text-align: center;"><a href="https://www.jsmpros.com/event/cd22/?source=blog" style="background: rgb(216, 88, 66); border-radius: 0.4em; color: white; display: inline-block; padding: 0.5em 1em; text-decoration: none;" target="_self">Register Now!</a>
</p><p></p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-23797732100207647502022-10-22T09:50:00.002-07:002022-10-22T09:50:37.908-07:00REST Consumer Base URL Maintenance Idea<p>"Legacy" Integration Broker used nodes to identify endpoints, and we migrated nodes separately from Messages and modern Service Operations. This design offered the following benefits:</p><p></p><ul style="text-align: left;"><li>Reuse across 8.47- Messages and 8.48+ Service Operations,</li><li>Different endpoints between development and production, and</li><li>The ability to test node connectivity without invoking a live service.</li></ul><div>Modern PeopleSoft REST consumption, however, requires us to specify the full endpoint URL on every Service Operation. Here is an example. Let's say I want to send absence requests to the Oracle HCM cloud. Since the current version is 11.13.18.05, I would post to a URL that looks something like: <b>https://some.server.com/hcmRestApi/resources/11.13.18.05/</b>absences. If I also wanted to create workers, I would post to <b>https://some.server.com/hcmRestApi/resources/11.13.18.05/</b>workers. Do you see the similarities? I would have two service operations pointing to the same URL base. And that is just for POST. There are also GET, PUT, and PATCH operations, which would result in further redundancy. Now, let's say I need to change my server domain name or service version. That would require me to locate and update every Service Operation that uses the old base URL.</div><p></p><p>My other concern with the current design relates to the separation between development and production. Since the full endpoint URL is stored with each Service Operation, a migration from development through to production may require an update to the endpoint URL. In a sense, this requires us to place untested configurations in production.</p><p>To work around the current design, many developers resort to <a href="http://blog.jsmpros.com/2022/09/simple-code-only-rest-request.html">code-only metadata-less integrations</a> where they use simpler metadata constructs such as URL definitions, App Classes, and Message Catalog entries for shared reusable fragments.</p><p>We believe there is value in Integration Broker metadata, but I think we just need one change. I just proposed the following idea in the PeopleSoft IdeaLabs to simplify the maintenance of both REST Service Operations and the new 8.60 Application Services Framework consumer services. Please vote for this idea if you believe it would be beneficial.</p><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"><p></p><div style="text-align: left;"><a href="https://community.oracle.com/mosc/discussion/4529074/allow-rest-consumer-base-url-to-be-shared-across-service-operations-asf/">Allow REST Consumer Base URL to be shared across Service Operations/ASF</a></div><p></p></blockquote>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-70437614968542097072022-10-17T22:27:00.003-07:002022-10-17T22:27:41.178-07:00What if Component App Classes Were Configurable?<p>With Fluid, PeopleSoft implemented an interesting design pattern: <a href="https://www.jsmpros.com/courses/app-classes/">App Classes</a> as Event Handlers. Properly implemented, there are some fantastic reasons to choose this pattern:</p><ul style="text-align: left;"><li><a href="https://youtu.be/xSDluaVTA7s">Writing testable code (PSUnit)</a></li><li>Code reuse</li></ul><p>You can see Oracle's latest pattern on just about every Fluid component. A component that uses this pattern might have PreBuild PeopleCode that looks something like this:</p><pre>import SOME_PACKAGE:SomeClass;
Component SOME_PACKAGE:SomeClass &handler;
&handler = create SOME_PACKAGE:SomeClass();
&handler.PreBuild();</pre><p>But I had this idea... What if the code looked more like this:</p><pre>import SOME_PACKAGE:SomeBaseClass;
Component SOME_PACKAGE:SomeBaseClass &handler;
Local string &className;
REM ** Select actual implementation of SomeBaseClass from a configuration table;
SQLExec("...", %Component, &className);
&handler = CreateObject(&className);
&handler.PreBuild();</pre><p>Then we could override delivered behavior by subclassing and configuring our own handlers to override the delivered handlers. And I think this is the best reason to use App Classes as component event handlers. What would it take to implement this solution? Oracle would need to select the implementation class from SQL rather than hard-code its implementation into component PreBuild. But is it worth it? You know that is a fantastic question! You might say <a href="https://www.jsmpros.com/courses/event-mapping/">Event Mapping</a> offers the same result but is more flexible. Let us know your thoughts in the comments!</p><p>At JSMpros, we teach PeopleTools and PeopleCode concepts like this regularly <a href="https://www.jsmpros.com/events/">check out our website</a> to see what we are offering next!</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0tag:blogger.com,1999:blog-34020393.post-3725022957140066302022-10-15T15:47:00.005-07:002022-10-20T09:51:44.337-07:00PeopleTools 8.60 PTF: Where is IE 11?<p>I was just reviewing the fantastic <a href="https://youtu.be/_E6HqPR8Krs">PeopleTools 8.60 Highlights video</a> and noticed something missing from the PTF Execution/Runtime Options. Here is a screenshot</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkxmvAYHWxdipQulIxL8ihuY3J5cre7SK_SlU6vVQAVcJmKDVKRup7GscDkCkjQq0QCxy_UJEaMu1A4dOZyc6n9c-7Uvqyb1NRsK70eMteykXDMrJMSM7msX9ZnnWFmQ1U-YNqxwiVsLjzyruc5_DbzccRdy3rm3KMwTCeKEpIpWEo9V89YQ/s1056/Screenshot%202022-10-15%20153713.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="784" data-original-width="1056" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkxmvAYHWxdipQulIxL8ihuY3J5cre7SK_SlU6vVQAVcJmKDVKRup7GscDkCkjQq0QCxy_UJEaMu1A4dOZyc6n9c-7Uvqyb1NRsK70eMteykXDMrJMSM7msX9ZnnWFmQ1U-YNqxwiVsLjzyruc5_DbzccRdy3rm3KMwTCeKEpIpWEo9V89YQ/w400-h297/Screenshot%202022-10-15%20153713.png" width="400" /></a></div><br /><p>Do you see something missing? Where is Internet Explorer? Internet Explorer retired on June 15, 2022, and is no longer a "supported" browser (see MOS Doc <a href="https://support.oracle.com/epmos/faces/DocContentDisplay?id=2834591.1">2834591.1</a>). Releases of 8.59 still allowed us to use IE for recording and playback as long as we chose IE from the browser list, even after support ended. But as you can see, IE 11 is not in the 8.60 screenshot. This is an important consideration as you evaluate PeopleTools 8.60. What do you think of this change? Share your thoughts in the comments! Here is a thought that I have: Dropping IE 11 as a playback and record browser means the PeopleTools team may use modern CSS features, such as Flexbox and CSS variables, without concern for legacy browsers.</p><p>Ready to learn more about PeopleSoft's Test Framework and the Chrome-based recorder? Check out our <a href="https://www.jsmpros.com/courses/ptf/">on-demand recorded and live virtual offerings</a>. Want to train your whole team? <a href="https://www.jsmpros.com/contact/">Contact us</a> for group pricing and scheduling.</p><p>Not sure how to get started with PTF? Here is what we recommend: As a developer, start by recording regression tests. Every time you apply a Drop Zone, Event Mapping, or Page and Field Configuration, record a simple regression test to prove your alteration still works. This approach will help you build an amazing maintainable regression test library over time.</p>Jim Marionhttp://www.blogger.com/profile/12995110203807924786noreply@blogger.com0