Thursday, October 28, 2021

Announcing PeopleSoft Configuration Day 2021!

Announcing PeopleSoft Configuration Day! Join me online Thursday, November 18th for a full day PeopleSoft education experience filled with tips and best practices. Space is limited so register now!

Register Now!

Here are some of the topics we will cover and questions we will answer:

Configuration versus Customization

  • Are Page and Field Configurator changes really configurations?
  • What about Event Mapping or Drop Zones?
  • Why does Oracle call these features "isolating customizations?"

PeopleSoft Test Framework

Without compare reports, how do you know what to test? Learn how to use PTF to regression test configurations.

Security

Can you use characters other than "X" and "*" to mask data? How would you mask without showing the length of a field? Learn how to combine roles with Page and Field Configurator and Event Mapping to conditionally apply Data Masking.

Fluid Approvals Page Composer

Learn how to use Page Composer to alter the approval user experience.

Can Functional Analysts Create Their Own Approvals?

Find out how through Fluid Forms and Approval Builder.

Extending Oracle-delivered page Content

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.

Fluid Job Data

HCM's new Fluid Job Data is incredibly flexible and configurable, including configurable search, Drop Zones, etc. But what about those Drop Zone group box labels (Drop Zone 1, Drop Zone 2, Drop Zone 3, etc.)? Can you change them? Can you hide them? Can you automatically expand them?

Activity Guides

What is an Activity Guide and how would you use one? How hard is it to create one? How do you pass contextual data between steps in an Activity Guide?

What's new in 8.59

There are several new configuration features included with 8.59. Join us to see these new features in action!


Register now to find the answers to these and many more questions on Thursday, November 18th.

The cost for this event is $447 per person. If you have a group of 10 or more, contact us at info@jsmpros.com for a quantity discount.

Register Now!

Wednesday, September 15, 2021

Configuring Fluid Job Data Drop Zones

The new Fluid Job Data component is incredibly configurable. I love the four new Drop Zones right in the middle of the page. But there is just one problem: they are labeled Drop Zone 1, Drop Zone 2, Drop Zone 3, and Drop Zone 4. And they are collapsed, so a user would have to expand each one to find out what is inside. Wouldn't it be great if we could use Page and Field Configurator to change the labels or hide unused regions? The Drop Zone labels come from Group Boxes, and today, Page and Field Configurator doesn't support Group Boxes. Since the code is trivial, we believe this is a simple oversite the development team could remedy. If you agree, please up-vote our idea Page and Field Configurator: Add Group Boxes fields list.

The good news is Event Mapping supports any record and field combination. If we can locate the record and field associated with any group box, we can use Event Mapping to hide it or change its label. This brings us to another challenge. At this time, none of the Drop Zone group boxes are associated with fields. We put in an idea for this: Make Drop zone 1-4 on Fluid Job Data Configurable through PFC and/or Event Mapping. If you think this is a good idea, please up-vote it as well.

While we wait for a proper Oracle-delivered configurable solutions, I want to share with you how we used Event Mapping, JavaScript, and CSS to solve this problem:

Thursday, September 09, 2021

The "Unable to get image extents" Error for SVGs

At JSMpros, we love Scalable Vector Graphics! Fluid loves them because they resize (scale) well. We love them because they are just XML documents describing an image. And since they are XML, we can recolor them with browser developer tools or even a simple text editor. In fact, We have videos showing how trivial it is to clone and alter the colors of Oracle-delivered Fluid icons through browser inspector tools (watch online Manipulating SVG Images).

Since we usually just change colors, we prefer to edit Oracle-delivered SVG images through Chrome's inspector and then copy the entire document to a new SVG file. We can then upload the new file through App Designer and use it anywhere. But we discovered an interesting issue. It appears PeopleSoft's internal code doesn't like our new images. When using the Navigation Collections image inspector or uploading a modified SVG through the online branding module, PeopleSoft throws an "Unable to get image extents" error message. What we didn't realize is that copying XML out of Chrome's inspector doesn't copy the XML prolog. All XML documents begin with an XML prolog

<?xml version="1.0" encoding="utf-8"?>

Since SVG is XML, it is required to have a prolog. Browsers are forgiving and will ignore the missing prolog, but PeopleSoft's internal code doesn't.

So what's the solution? We still edit SVG using Chrome's inspector tool, but now we manually insert the XML prolog as the first line. It appears we aren't the only ones to hit this issue. Check out MOS document 2426154.1 for more details.

Are you interested in learning more about PeopleSoft Fluid and Fluid development? Check out our latest live virtual and on-demand offerings.

Tuesday, August 24, 2021

PeopleSoft Fluid Accordion: Default to Open State

The Fluid Accordion is fantastic for organizing information. My favorite place to use it is in the left sidebar (Side Page 1, Master/Detail, and PSL_TWOPANEL). But it has one interesting quirk: it defaults to closed. Wouldn't it be nice to have PeopleSoft default one of the accordion headings to expanded? We haven't found a property or delivered approach, but we do have a workaround. Check out the 10-minute video below for details. Here is our solution in a nutshell:

  1. Add a custom style class to the accordion heading group box you want to be expanded (we named ours jsm_expanded). This CSS style class acts as an identifier or selector.
  2. Add JavaScript to locate the selector and invoke the click action of the chosen heading.

Here is what that JavaScript would look like:

document.querySelector('.jsm_expanded .ps-link').click();

You can use this JavaScript as-is with the AddOnloadScript PeopleCode function but as the video demonstrates, Master/Detail requires a slightly different approach.

I love the flexibility of Fluid. It is so much easier to inject JavaScript and CSS into Fluid. Are you interested in learning more? We cover the Accordion and related challenges and workarounds in our Fluid 2 course. Be sure to check out the details and register for our next offering.

Did enjoy this PeopleTools Sound Byte? There is more where that came from! Check us out on YouTube and be sure to subscribe for more content!

Thursday, July 15, 2021

Announcing Developer Day 2021!

Announcing PeopleSoft Developer Day! Join me online Thursday, August 19th for a full day PeopleTools experience filled with tips and best practices. Space is limited so register now!

Register Now!

Here are some of the topics we will cover and questions we will answer:

Configuration versus Customization

If you use Event Mapping, is that a customization or configuration? If you replace an AWE event handler, is that configuration or customization? Does it matter? Are there lifecycle consequences? How do you confirm a solution still works after applying maintenance?

PeopleSoft Test Framework

Another way to think of a configuration alternative to customization is as a runtime customization with no compare reports or lifecycle management tools. We will show you how to use PTF to regression test configurations.

PeopleCode Application Classes

Application Classes are the foundation for every modern framework including AWE, Integration Broker, and Event Mapping. We will cover the basics of Application Classes, and then use them to override Approval Framework behavior and to implement Event Mapping.

Event Mapping and Drop Zones

We will warm up with some simple Event Mapping and Drop Zone examples to describe them, and then show you some "what's possible" ideas in Fluid Job Data

Fluid

We'll cover Fluid layout techniques, specifically focussed on Drop Zones, and we'll also show how to create Dynamic Tiles, which also require Application Classes.

JavaScript

The PeopleSoft User experience is HTML, JavaScript, and CSS. We will show you some simple ways to combine JavaScript with Event Mapping to improve the user experience.

Integration

REST is the primary modern integration strategy, so we will cover a couple of simple REST examples, and then show how we can use REST with AWE to send text messages to requesters on final AWE approval.

Approval Workflow Engine (AWE)

We want to send notifications as text messages. To do so, we will have to extend AWE. How would you do this and is it a customization? Find out at Developer Day 2021!

Do you have a group of 10 or more? Contact us at info@jsmpros.com for a quantity discount!

Register Now!

Friday, June 18, 2021

PeopleSoft Week Conference

 

PeopleSoft Week Starts Monday, June 21. Have you registered yet? If not, go here now and register for this FREE conference and join us for one week of outstanding PeopleSoft-focused presentations! Here are some details:

When: June 21 - 25
Cost: FREE for Quest members, $49 otherwise
Who: Anyone involved with PeopleSoft
Where: Live online!

The entire schedule is available on Quest's website, but here are a few highlights. Monday, strategy day, kicks off the conference with product strategy sessions led by Paco (PeopleSoft VP), Amira (Financials), Robbin (HCM), and Dave (PeopleTools). This is a fantastic opportunity to hear from product strategy. Tuesday is packed with fantastic community presenters from ERPA, Appsian, Smart ERP, and JSMpros. I close Tuesday with my signature PeopleTools Tips and Techniques session from 3:30 to 4:30 ET. Wednesday and Thursday bring us many more presentations including customer voices such as Jack Henry, AdventHealth, and FSU. The agenda also includes Q&A and panel discussion sessions.


Be sure to register now because PeopleSoft Week starts Monday!

Monday, June 07, 2021

EIS 2021

Join us Thursday, June 10th for a full day of free fantastic live virtual PeopleSoft education sessions led by PeopleSoft community experts from around the world! Check out the agenda. Times are listed in Central Europe, Eastern, and Pacific.

Wednesday, June 02, 2021

App Classes or Function Libraries: Which is Better?

As programmers, we look for patterns. And when we find them, we refactor them into reusable code. Keep it DRY: Don't Repeat Yourself. PeopleCode offers two reusable code containers:

  • Function Libraries
  • Application Classes

And this brings us to the great debate. Which is better? Object-oriented App Classes or procedure-based Function Libraries? I often ask my students this question. And if they prefer one over the other, why? Let's review the benefits of each:

Function Library:

  • Stateless
  • Simple
  • Must be declared

Application Class:

  • Stateful
  • Dynamic execution

There are other differences, but they are irrelevant for this comparison. For example, Application Classes have inheritance (some would say inheritance is NOT a benefit). The value of inheritance is reuse, but then a function can call a function, which is also reuse.

When asking students about their preference, here are a few of my favorite answers:

  • Choose App Classes because they are new.
  • Choose App Classes because they are object-oriented.
  • Choose App Classes because we are supposed to.
  • Choose App Classes because everyone is doing it.
  • Choose Function Libraries because they work!

One of the most valuable features of App Classes is dynamic PeopleCode. Unlike Function Libraries, App Classes do not have to be imported/declared before use. This is how every PeopleTools framework works. As a developer, we create an App Class and register it with the framework. At runtime, the framework reads the metadata and invokes the App Class. A framework such as AWE, for example, knows nothing about my custom App Class. But it invokes my code nevertheless through functions such as CreateObject, ObjectDoMethod, ObjectGetProperty, and ObjectSetProperty.

Which one do I choose? Here are my decision criteria:

  • If I need dynamic PeopleCode, meaning no declaration, then the only solution is an App Class. Another way to think about it is if I'm writing code that invokes another code block and I don't know that code block at design time, but will fetch the name from the database, then I have to use an App Class.
  • If I'm writing code to plug into another framework, such as Event Mapping or Integration Broker, I will use an App Class.
  • If I want testable code to test through PSUnit, I will create an App Class (because PSUnit is a framework that will invoke dynamic code).
  • If I need to maintain state between method invocations, I'll choose an App Class.
  • Otherwise, I choose a Function Library.

Which do you prefer and why? What are other benefits of one over the other? Leave a comment to let us know what you think!

At JSMpros, we recognize the value of Application Classes and offer a two-day course dedicated to teaching object-oriented best practices. In fact, our next session starts on August 9, 2021. Register now!

Tuesday, May 25, 2021

Do You "Regression Test" Your Configurations?

Do you have customzations? Do customizations slow down selective adoption? The answer, of course, is "Yes" to both questions. Our best practice is to move customizations into configurations through Event Mapping, Page and Field Configurator, Drop Zones, etc. Configuration alternatives remove changes from lifecycle management, allowing us to alter the PeopleSoft experience without the impact and overhead of a customization... or do they? It is true; configuration alternatives don't show on compare reports. They move our "customizations" into a separate layer, a runtime injected layer, allowing Oracle to swap the backend code. Another way to think of it is that configuration alternatives automate applying customizations.

Let's review a quick scenario. Let's say there is a field on a page, and you are supposed to remove it. Simple task. The PeopleCode would be record.field.visible = False; If we customized, we would add that code to a design-time event, such as PostBuild. As a configuration, however, we would put that code in an App Class and then use Event Mapping to inject the code at runtime. So the value of configuration is that you don't have to reapply code changes. They are injected at runtime.

So here is a question:

When you re-apply a customization, is design-time code merge (copy/paste) the only thing you do?

Of course not! You also analyze. You investigate. Is the customization still necessary? Is it still relevant? Do you need to refactor around Oracle's changes? You still need to ask all of those questions. Even as a configuration, not a customization, you still must answer the same questions because it is the same code. It is the same solution. It solves the same problem. And, if you customized, you would have a compare report showing you what to review and where. Context. This is proactive. But with configuration? Silence. Without a compare report, how do you know what to review? How do you know what changed? Wait for testers to catch it? Wait for go-live? This is reactive.

Let's continue with the hidden field/Event Mapping example, and you go through a selective adoption or get current cycle. Since you used Event Mapping, your code is still there. But again, should you review it? How do you know what to review? What if Oracle agrees with our "hidden field" assessment and removes that field? Because we used Event Mapping, our code is still there, but it would refer to a field that is no longer in the component buffer, and will fail. What proactive lifecycle management tool is going to help you identify this issue? Without a compare report, how do you know what requires analysis? These are fantastic questions!

One way to locate conflicts is through regression tests. Each time I create a configuration (Drop Zone, Event Mapping, Page and Field Configurator, etc.), I record a test. That test proves my configuration still works. After each get current, I can run my regression test suite and see what fails. Test metadata will point to the change request, etc. so I know what to repair and where. I bet you are already doing regression testing. Everyone does. We usually call it "End User Testing." It might be a formal process but may not include change request documentation, etc. It is more like, "Hey, that thing that used to work is broken again." Alternatively, we recommend PeopleSoft Test Framework (PTF). The PTF metadata (comments, etc.) would contain the change request details. When the test fails, we can easily drill to the supporting documentation. This is proactive.

At this point, you might be saying, "We would LOVE to do that, but we haven't implemented PTF." But here is my question. Do you have to "implement" PTF to use it? Can't you, as a developer, just start recording regression tests against your configurations? That is what we recommend, and that is what we teach in our two-day PTF training course. You already have it. It's just waiting for you to start using it.

Our next PTF course starts in a couple of days, so be sure to register here ASAP! Or, purchase our On-demand PTF training course and get 60-days access to digitally mastered content to learn PTF whenever and wherever.

New to configuration? We regularly offer event mapping, drop zones, and Page and Field Configurator classes. Check out our website to see what we are offering next! Prefer On-demand? Take a look at our new On-demand Drop Zones course and learn on your own time.

Wednesday, March 24, 2021

Announcing PeopleSoft Fluid Day! A one-day Fluid Webinar

Announcing PeopleSoft Integration Day! Are you ready to learn Fluid? Or, do you already know Fluid, but want to learn more? Join us online Thursday, May 20, 2021 for a full day Fluid Development Experience! Space is limited so register now!

Register Now!

Here are some of the topics we will cover and questions we will answer:

Classic versus Fluid

Both Classic and Fluid use App Designer to create solutions. Both support drag and drop page design. So what are the differences? And if you know Classic, what do I need to learn to be proficient with Fluid?

Mobile

Isn't Fluid mobile? If so, why aren't my grids responsive? What mobile-friendly options exist for grids?

Drag and Drop

PeopleSoft homepages allow us to drag and drop tiles. AWE allows us to drag and drop fields. How can I implement Drag and Drop on my own Fluid pages?

Branding

What does it take to create a branding theme for a PeopleSoft instance? How do you brand both Classic and Fluid? Do I have to use Branding Macros with Fluid? Are there alternatives?

Drop Zones

Where can I use Drop Zones? What can I do with them? What if a component doesn't have Drop Zones? Are there limitations with Drop Zones? Since Drop Zones and Event Mapping don't appear in compare reports, how do we know what to review after a system update?

PeopleSoft Test Framework (PTF)

How do you implement PTF? Are there any challenges to using PTF with Fluid? Are there special considerations for PTF with Event Mapping and Drop Zones?

Do you have a group of 10 or more? Contact us at info@jsmpros.com for a quantity discount!

Register Now!

Wednesday, March 17, 2021

Where do you terminate SSL for PeopleSoft?

Most PeopleSoft implementations have some sort of firewall/load balancer appliance in front of PeopleSoft. As an administrator, one question we have to answer is, "Where do we terminate SSL?" And the answer seems so obvious, most don't even ponder the question. What is the obvious answer? Terminate at the load balancer. Why? Because that is why they exist. SSL/TLS is what they do, and they do it well. What's the alternative? Carry SSL all the way to Weblogic, and terminate at the PeopleSoft web server. Weblogic is amazing at what it does, but it isn't a security appliance. And that is why the obvious answer is to terminate at the load balancer. But here is my question:

Are you reencrypting the traffic between the load balancer and PeopleSoft?

Do you encrypt all the way to Weblogic or do you terminate at the load balancer, thereby passing sensitive information in plain text behind the firewall?

Over the last several years I have heard fantastic security presenters recommend SSL termination at the load balancer level (for good reason). But they always end encryption at the load balancer. They don't encrypt behind the firewall. Why not? The most common reason is performance. Encryption isn't free. And if encryption is expensive, why encrypt behind the firewall? Here are two reasons:

  1. Your network might not be as secure as you think it is. A great example is NASA's breach implemented through a Raspberry PI.
  2. PeopleSoft-delivered service operations expect encryption.
As a developer, I defer to the network infrastructure design team. If they say the network is secure, I take their word for it. But take a look at reason #2. There are several PeopleSoft-delivered service operations that verify encryption at the Weblogic level. If I want to use those delivered service operations, I either need to:
  • Carry SSL/TLS all the way to Weblogic or
  • Modify the Service Operation.
Which would you prefer?

Monday, March 01, 2021

PeopleSoft Open Source Projects

Open Source Initiative keyhole

Did you know there is a vibrant PeopleSoft Open Source community? PeopleSoft is the most flexible ERP solution available. If we need additional functionality, we can build it. And that is exactly what several talented developers have done, and they've shared their solutions with us. Check out some of these amazing open-source projects and repositories:

Please note, I have only tested a few of these projects, and make no claims about their state or function. My objective with this post is awareness.

Do you have a solution others could benefit from? Have you thought about sharing it as an Open Source project?

Do you have a project you would like added to the list? let us know in the comments!

Wednesday, February 24, 2021

Setting IB Request Content Type

In our Integration Day 2021 One-day Webinar, we showed how to send SMS from PeopleSoft through Twilio. What makes Twilio interesting is that Twilio expects URL encoded form data. As you may know from using Integration Broker, PeopleSoft is quite happy sending and receiving JSON or XML. But what about other content types, such as application/x-www-form-urlencoded? You may know that you can set most HTTP headers using something like:

&request.IBInfo.IBConnectorInfo.AddConnectorProperties("Content-Type", "application/x-www-form-urlencoded", %Header);

That's a mouth full! But the weirdest thing happens when trying that trick with URL encoded form data. PeopleSoft URL encodes the entire body! Wait, isn't that correct? No, actually. When you and I create the body, we create the proper key=value&key2=value2 pairs. Proper URL encoded form data would look something like this:

key=This+is+some+encoded+data&key2=value2

Keys, ampersands, and equals signs should not be encoded (unless part of the value). But PeopleSoft URL encodes everything as if there were no keys. Here is what that same string above looks like when PeopleSoft finishes with it:

key%3DThis%2Bis%2Bsome%2Bdata%2Bto%2Bencode%26key2%3Dvalue

It is just supposed to URL encode the values. Or better yet, just let us URL encode the values. What's the workaround?

&request.SegmentContentType = "application/x-www-form-urlencoded";

This solution is a little strange because we aren't using a multi-part, segmented message, but it works!

While performing research for this post, I came across MOS Doc ID 2187249.1, which asks for an enhancement to allow additional, hopefully even custom, Content Types, so it appears URL encoded form data isn't the only issue. But lucky for us, we have SegmentContentType as a workaround!

Are you interested in learning more about PeopleSoft Integration Broker and integration strategies? Join one of our live virtual top-rated Integration Tools Update courses!

Friday, February 05, 2021

PeopleCode to Move a File... sort of

You ever need to move a file through PeopleCode? Perhaps an App Engine program that needs to move generated content into the process output directory? I found myself in that position today. Surely there is a PeopleCode function for that... right? If you have one, please share it, because it seems the Internet doesn't know about it. A quick Internet search turned up several examples of using Exec with mv. I'm always weary of Exec. If I have to use the command line, I prefer to control it through the Java Runtime (see Exec Processes while Controlling stdin and stdout). Speaking of Java, can we borrow anything from the JRE? I did find my old ITToolbox response showing how to use java.io.File.renameTo to move files. It is still a great solution, but with multiple mounted file systems... well... it actually might fail. So I got to thinking... what about using java.nio? Here is an example:

Local JavaObject &jSource = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST.log").toPath();
Local JavaObject &jTarget = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST_moved.log").toPath();

Local JavaObject &jFiles = GetJavaClass("java.nio.file.Files");
Local JavaObject &jOptions = CreateJavaObject("java.nio.file.CopyOption[]");

&jFiles.move(&jSource, &jTarget, &jOptions);

And, what if you want to overrwrite the destination? Try it with copy options:

Local JavaObject &jSource = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST.log").toPath();
Local JavaObject &jTarget = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST_moved.log").toPath();

Local JavaObject &jFiles = GetJavaClass("java.nio.file.Files");
Local JavaObject &jStandardCopyOptions = GetJavaClass("java.nio.file.StandardCopyOption");
Local JavaObject &jOptions = CreateJavaObject("java.nio.file.CopyOption[]", &jStandardCopyOptions.REPLACE_EXISTING);

&jFiles.move(&jSource, &jTarget, &jamp;Options);

For more details about copy options, take a look at the Java Docs.

Are you ready to take your PeopleSoft development skills to the next level? Check out our latest course offerings at jsmpros.com. Prefer a custom agenda? Contact us for details.

Thursday, January 21, 2021

Integration Broker OnError Method

Do you know what happens when an Integration Broker handler App Class throws an Exception? REST, SOAP, or plain XML over HTTP all behave mostly the same. By default, PeopleSoft returns the error message to the client. This is great! It means you and I don't have to write error handlers, right? Actually, I hadn't given it much thought until working with REST. With REST, I want to leverage HTTP status codes. For example, if a REST client requests data that doesn't exist, I want to return a 404 status code. But if you throw an exception from an OnRequest REST handler, the default Integration Broker OnError handler returns a 200 (success) status code and an HTML content type. An exception should not return a 200. Fortunately, we can override the REST HTTP response code through the recently documented OnErrorHttpResponseCode and OnErrorContentType properties of the the Request Handler interface (see MOS document 2026747.1 for more details). You set these properties from a handler's OnError method, which is the method Integration Broker invokes when the handler method throws an exception. So here is a snippet from our Integration Tools Update course:

method OnRequest
   ...
   SQLExec(...);
   
   If (%SqlRows = 0) Then
      throw CreateException(0, 0, "Item not found");
   End-If;
   
   ...
end-method;

method OnError
   /+ &request as Message +/
   /+ Returns String +/
   /+ Extends/implements PS_PT:Integration:IRequestHandler.OnError +/
   
   REM Create fault response;
   ...
   
   %This.OnErrorHttpResponseCode = 404;
   %This.OnErrorContentType = "application/json";
   
   Return "<response string goes here>";
end-method;

Notice the code throws an exception when no rows are found. When OnRequest throws an exception, Integration Broker invokes the OnError method, and the OnError method returns a hard-coded 404. So, let's think about this a little more... as you see, the OnError handler ALWAYS returns 404. What if something else goes wrong? Shouldn't I see another status code? Great question! That's a topic we'll save for another post. But let's address a different issue. What happens if your OnError handler throws an exception? PeopleSoft drops the OnError handler and returns the response it would have returned without an OnError handler, meaning a status code of 200 with HTML content type. It's sort of like PeopleSoft invoked your OnError method, which threw an exception and PeopleSoft said, "Oh, just kidding," and reverted to its default behavior.

Now, let's say you are testing your OnError handler, but it seems like Integration Broker is ignoring you. I mean, no matter what status code you set in your OnError method, PeopleSoft returns a 200. First, if this is happening to you, chances are high, your OnError method is throwing an exception. But how can you troubleshoot this? Here is my debugging strategy: Open a file object and print lines. For each line in the OnError handler, I print a line to my log file. I can then open the log file and see when PeopleSoft stopped printing to my log (I'm basically tracing my own code).

OK. Now, let's say you have all of the bugs worked out of your OnError handler, and you are ready to move to production. How can you ensure PeopleSoft will return a 400-level status code if the OnError handler throws a runtime exception? Wrap your code with a try block to catch errors. You then retain control over the HTTP response code and content type.

Are you interested in learning more about Integration Strategies? We believe Integration is one of the most important PeopleTools technologies for today's distributed enterprise. Visit ibupdate.jsmpros.com to see when we are offering our next Integration Course. Have a group of developers to train? Contact us for special group pricing!

Tuesday, January 12, 2021

Is PeopleSoft Fluid Mobile-ready? Grids

Vertical scrolling on mobile is perfectly acceptable. But horizontal scrolling is an absolute no-no! So if Fluid is mobile, why is my Fluid grid so wide? Why doesn't it reflow into a vertical rendering? Great question! A Flex Grid is the Fluid version of the plain-old Classic Grid. The only difference is the Flex Grid stretches to fill its container, whereas a Classic Grid's width is fixed. The Flex Grid is likely the most common Grid type for desktop, but it doesn't fit well on smaller form factors, as you may have experienced. So what can we do? The most common solution is to use PeopleCode to change the grid type. In the post Is PeopleSoft Fluid Mobile-ready? Setting the Browser Viewport, we said that Fluid + PeopleCode = Mobile, which holds true for grids. We can use PeopleCode to transform a Flex Grid into a mobile-friendly type, such as a List Grid, Div Grid, or Data Grid. Here is an example:

If %Request.BrowserDeviceFormFactor = %FormFactor_Small Then
   /* change to LIST grid */
   &grid.Layout = %ListGrid;
End-If;

PeopleCode alternatives include:

  • Stacked Grid Group Boxes,
  • Stacked Grid Group Boxes with Suppress-on attributes, and
  • Custom CSS with breakpoints

With this in mind, let's extend our Fluid development formula to: Fluid + PeopleCode + Style Classes + Attributes = Mobile.

We cover grids in great detail in our Fluid 2 course, including Flex, List, Div, and Data grid types, and how to transform grids using PeopleCode and CSS. Checkout fluid.jsmpros.com to see when we are offering it next. Do you have a group of developers to train? Contact us for special group pricing!

Monday, January 04, 2021

Announcing PeopleSoft Integration Day! February 11, 2021

Announcing PeopleSoft Integration Day! Join me online Thursday, February 11, 2021 for a full day integration experience! Space is limited so register now!

Register Now!

Whether integrating with "The Cloud," Twilio, or Chatbots, odds are high you will use REST and JSON. With that in mind, we are excited to devote an entire day to sharing REST and SOAP integration strategies. Join us February 11, 2021 to learn about:

  • REpresentational State Transfer (REST)
  • JavaScript Object Notation (JSON)
  • The Documents Module
  • Producing and Consuming REST
  • Testing tools, such as SoapUI
  • Security, such as bearer tokens (JWT) and other authorization schemes
  • Producing, consuming, and securing SOAP services

Who should attend this webinar?

  • PeopleSoft Developers
  • Project Managers
  • Team Leads

The cost is $250 per person, which is nearly 70% off our standard daily rate. We are recording the event and are offering 60-days access to registered attendees. This is going to be so much fun! Bring your questions. We'll have time for Q&A. The Q&A panel will be available and monitored all day.

Do you have a group of 10 or more? Contact us at info@jsmpros.com for a quantity discount!

Register Now!

Friday, January 01, 2021

Top Five PeopleTools Technologies to Learn in 2021

Today is the first day of 2021! Have you set training goals? To finish 2020, we sorted courses by enrollment. Based on training interest and enrollment, here were the top five requested courses from 2020:

1. Fluid

It is no surprise that Fluid tops the list of training initiatives. Here are some reasons why

  • Strategy: Fluid is PeopleSoft's strategic direction. All new PeopleSoft development happens in Fluid.
  • Modern and mobile: Unlike Classic, Fluid is awesome on a mobile device.
  • Support: Some Classic components have retired, replaced by their Fluid functional equivalent.

2. Integration Technologies such as REST and JSON

What do Chatbots, Texting (Twilio), Elastic Search, Multi-factor authentication, and Cloud have in common? They are all services outside PeopleSoft that require REST integration. So, just like Fluid, seeing integration at the top of the priority list is no surprise.

3. Application Classes

We've had object-oriented PeopleCode for decades, but without much adoption. I believe today's interest in Application Classes is based on PeopleTools frameworks. Here are a few of the PeopleSoft features that require Application Classes:

  • Integration Broker
  • Approval Workflow Engine
  • Event Mapping
  • Campus Solutions COMMGEN

Add to that nearly every new Fluid page using an Application Class as its PeopleCode container, and we can see why Application Classes are in the top five!

4. PeopleSoft Test Framework (PTF)

One of the primary benefits of Cloud is that Cloud solutions are always current. With Selective Adoption, your on-premise PeopleSoft has the same potential, but only if you can stay current. And end-user testing is a clear barrier to staying current. The more we can automate, the faster we can apply maintenance. There seems to be a direct relationship between currency and automation.

But with that said, I have one reason I think everyone should implement automated testing, and that is Configuration. Event Mapping, Page and Field Configurator, and Drop Zones are fantastic ways to transform customizations into configurations. But here's my problem with configurations: no compare reports. Every customization offers a compare report showing changes. Configurations don't. In fact, that is the point of a configuration. Our whole reason for configuring is to move changes into a layer above Oracle's delivered code. But configuration doesn't eliminate review. For example, configurations may reference fields that no longer exist, and will therefore fail at runtime. This is one of the challenges with configurations: no formal review process. This is a gap that I believe PTF can fill. I believe we should pair every configuration with a PTF test (or several tests). After each maintenance cycle, we can run our battery of tests to prove our configurations are still valid. Test failures immediately show us which configurations require review. Here's a short video showing an example:





5. Configuration

With selective adoption, continuous delivery, cloud pressure, support policies, and a steady stream of amazing new features, it is more important than ever that we stay current. And customizations are the enemy of currency. We can therefore, reduce the cost of getting current by replacing customizations with configurations. Page and Field Configurator, Drop Zones, and Event Mapping are some of the most important recent PeopleTools and Enterprise Components additions. Keep an eye on our online learning portal. We'll be releasing several configuration modules as on-demand recorded training.

6. Learn Something Outside PeopleTools

This is supposed to be a top-five list, but I couldn't stop. And I don't want you to stop either. Don't stop with PeopleTools. Learn something outside the traditional PeopleTools stack. If I could recommend one language to learn, it would be JavaScript. JavaScript is not a traditional PeopleTools technology, but it is the primary language of the PeopleSoft user interface. It is also the primary language of every website and the core of many Oracle PaaS frameworks.

At JSMpros, we teach all of these technologies regularly. Check out our website for our latest course offerings. Do you have a group of developers to train? Contact us for discounted group rates!

Thursday, December 31, 2020

Is PeopleSoft Fluid Mobile-ready? Setting the Browser Viewport

Have you created a Fluid component yet? Have you tested it on mobile? What did you see? Did it work as expected? When I created my first Fluid component, what surprised me was the zoom factor. My mobile device rendered Fluid content as if it were Classic. Sure, it had nice big Fluid buttons, but my mobile browser zoomed out so much that I thought I was looking at Classic, not Fluid. My first question was, "Why? Why is it doing that?" Without contrary instruction, a mobile browser will scale to fit a page. You would think a responsive page would scale accordingly, but it doesn't. It scales at large form factor, which is zoomed out. My next question was, "Isn't Fluid mobile?" Actually, Fluid has the potential to be mobile, but no. Fluid by itself is not mobile. The Fluid framework seems to be missing the meta Viewport tag, the tag that tells a mobile browser how to scale content. So how do we set the Viewport? At its core, we set the Viewport using the AddMetaTag PeopleCode function, and you are welcome to use it, but I don't recommend it. Instead, use PT_PAGE_UTILS:Utils.SetDefaultViewport. This App Class method handles the Viewport meta tag for us, including known operating-system issues. With that said, a basic Fluid component without a Flex grid is fully mobile if we set the Viewport. So is Fluid mobile? The correct answer is Fluid + PeopleCode = Mobile.

With which event should we invoke SetDefaultViewport? I've seen it in a lot of PageActivate code, but let's think about that for a minute... every time you switch between pages within a single component, PeopleSoft invokes PageActivate. Do we need to call SetDefaultViewport with every page change? No, just once per component. Meta tags exist in the head section of the rendered HTML, downloaded on the first component load, and subsequently updated upon request. So which event then? I prefer component PreBuild. Either PreBuild or PostBuild will work just fine. PostBuild triggers after the component buffer loads and usually contains a lot of component buffer manipulation logic. Setting the meta tag has no impact on the component buffer, and I hate to clutter a messy PostBuild with unrelated PeopleCode 😉.

How does Oracle handle this meta-issue? Any new component uses PT_PAGE_UTILS:Utils.SetDefaultViewport almost exclusively in one of those three events: PageActivate, PreBuild, or PostBuild. But if you review original Fluid components (early HCM, for example), you will find a mixture of AddMetaTag and SetViewPort Function library calls.

Setting the Viewport is a fundamental principle we teach in our Fluid Basic (Fluid 1) course. Checkout fluid.jsmpros.com to see when we are offering it next. Would you prefer to learn at your own pace? We cover this topic in our one-day on-demand training course Fluid Basic Development. Or, purchase the Fluid 1 Bundle and save! Do you have a group of developers to train? Contact us for special group pricing!

Thursday, October 29, 2020

PeopleSoft Configuration Day November 19th, 2020

Announcing PeopleSoft Configuration Day! Join me online Thursday, November 19th for a full day of configuration alternatives to customizations. Space is limited so register now!

Register Now!

Here is a sample of the topics:

  • Page and Field Configurator
  • Fluid Forms and Approval Builder
  • Activity Guide Composer
  • Related Content and Related Actions
  • Drop Zones and Event Mapping
  • Best practices, tips, and tricks!

A primary benefit of SaaS is that SaaS applications are always current. With selective adoption and continuous delivery, your PeopleSoft instance can stay current as well. What holds us back from always current? Is it customizations? Join me, Jim Marion, on November 19th, 2020 as I share configuration alternatives to customizations. Learn tips and techniques to replace customizations with upgrade-friendly configuration alternatives.

Who should attend this webinar?

  • Functional Business Analysts
  • PeopleSoft Developers
  • Project Managers
  • Team Leads

The cost is $250 per person, which is nearly 70% off our standard daily rate! We are recording the event and are offering 60-days access to registered attendees. This is going to be so much fun! Bring your questions. We'll have time for Q&A. The chat bar will be available and monitored all day.

Do you have a group of 10 or more? Contact us at info@jsmpros.com for a quantity discount!

Register Now!

Wednesday, July 15, 2020

Learn How to Write Code for Integration Broker, Event Mapping, Tile Wizard and AWE

What do Integration Broker, Event Mapping, Tile Wizard, and AWE have in common? These are extensible PeopleSoft frameworks that invoke your code at runtime—Dynamic PeopleCode execution! How amazing is that? Imagine... every line of event PeopleCode you've ever written was declared in advance. But somehow, these frameworks are able to invoke PeopleCode at runtime. Did you ever wonder how? Are you trying to learn Object-oriented PeopleCode by reviewing Oracle-delivered examples?

Even though it shares roots with its procedural predecessor, Object-oriented PeopleCode follows its own rules and design patterns. For example, what is an interface? How do you create properties and methods?

With so much emphasis on Application Classes, we've decided to create a two-day Application Class training course. In this two-day class, you will learn:

  • Object-oriented concepts
  • Methods
  • Instance variables
  • Properties
  • Constructors
  • Access control
  • Inheritance
  • Composition
  • Interfaces
  • Abstract classes
  • Dynamic PeopleCode
  • Design patterns and best practices
  • PSUnit and test driven development

Our material includes plenty of Event Mapping examples.

Are you ready to learn more? Register now for our next class!

Wednesday, July 01, 2020

PeopleSoft Developer Day August 20, 2020

Announcing PeopleTools Developer Day! Join me online Thursday, August 20th for a full day PeopleTools experience. I will share a full day of PeopleTools tips and best practices. Space is limited so register now!

Register Now!

Here is a sample of the topics:

FLUID

  • Layouts,
  • CSS,
  • JavaScript

I'll demonstrate a variety of Oracle-delivered style classes and how to use them to control layout. You will learn how to incorporate your own CSS into PeopleSoft and discuss when or why you might use custom CSS. And reasons you may want to avoid writing your own CSS.

REST/JSON

  • Documents
  • JSON Services
  • Content Negotiation
  • PeopleCode JSON Classes

Expose PeopleSoft data as a REST service including all of the supporting structures (Documents, Service Operations, etc.). We might even consume an Oracle HCM Cloud REST Service!

CONFIGURATION

  • Event Mapping
  • Drop Zones

With selective adoption and continuous delivery, staying current could mean continuous retrofitting. Event Mapping and Drop Zones are configurable alternatives to customization, allowing us to move forward with new projects.

The cost is $250 per person, which is nearly 70% off our standard daily rate! We are recording the event and are offering 60-days access to registered attendees. This is going to be so much fun! Bring your questions. We'll have time for Q&A. The chat bar will be available and monitored all day.

Do you want to attend for free? Contact us at info@jsmpros.com to receive your unique referral link.

Register Now!

Wednesday, April 15, 2020

Fluid Navigation Collection Tile Parameters

The Fluid navigation paradigm starts with role-based homepages and usually finishes with business process-based tiles. And, the most common way to build a business process-based tile is with a Navigation Collection published through Tile Wizard. Now I'm going to ask a question with an obvious answer. OK, so here goes, Do you build them in Dev, Test, or Production? And, I'm sure you answered, "Development, of course." Nicely done! What about migration? Here's the really cool thing: Navigation Collections are just portal registry structures, so we can migrate them just like any content reference: add them to a project. I've seen several comments and posts discussing this.

Now, perform a quick search for PTPPB_GROUPLET. Did you find anything interesting? Here, let me summarize: PTPPB_GROUPLET is an ADS used to migrate Tile Wizard metadata. Next question: Do you need to migrate Navigation Collection Tile Wizard metadata? There is a bit of debate around this one, but the real answer is: It depends. Many Tile Wizard data types depend on Tile Wizard metadata at runtime, but Navigation Collections do not. Tile Wizard is just a tool we use to create the Navigation Collection's content reference. A Navigation Collection Tile Wizard tile is actually processed through a special Activity Guide template, not through a Tile Wizard runtime. So to answer the question, no, you don't need to migrate Navigation Collection Tile Wizard metadata for a Navigation Collection Tile to work properly.

I'm going to ask you another question: Do you think you might want to use Tile Wizard to maintain your Navigation Collection tile? If yes, then you may want to think about migrating Navigation Collection Tiles through PTPPB_GROUPLET. Why? Most of us periodically copy Production over Dev. If we want our Dev resources to persist, we must migrate them to production. Otherwise, we'll lose the ability to maintain Tile Wizard metadata post copy. So no, you don't need to copy Navigation Collection Tile Wizard metadata for Navigation Collection tiles to work. But Yes, you should copy Tile Wizard metadata if you want to be able to maintain your Navigation Collections going forward.

OK, so maybe it is too late, and you now find yourself with Navigation Collection Tiles with no Tile Wizard metadata. Can you still maintain them? While reviewing CS PUM 16, I found myself in this exact situation. It appears that CS includes several Navigation Collection tiles in a "demo" category, but no Tile Wizard metadata. Fortunately, all Navigation Collection Tile metadata is stored with the content reference. All we have to do is manually update the content reference. Here is a list of the parameters, values, and descriptions of each. First, let's start with a sample content reference Portal URL:

c/NUI_FRAMEWORK.PT_AGSTARTPAGE_NUI.GBL?CONTEXTIDPARAMS=TEMPLATE_ID:PTPPNAVCOL&scname=ADMN_TILE_ADMINISTRATION&PanelCollapsible=Y&PTPPB_GROUPLET_ID=JSM_TILE_MAINT&CRefName=ADMN_NAVCOLL_1

This URL starts pretty normal, listing the Fluid Activity guide component as the starting point. Next, like any Activity Guide, we see the Activity Guide template ID. Everything after that is the domain of the Tile Wizard. Here is a list of URL attributes we can change to alter the behavior of our Navigation Collection tile:

TEMPLATE_ID
PTPPNAVCOL for "optimized" and PTPPNONOPT for "non-optimized"
scname
Navigation Collection ID (the real "name", a folder CREF ID)
PanelCollapsible
Y: Include the collapsible button beside the left panel.

The rest of the URL doesn't seem to matter.

Each week, you can find Jim Marion teaching a PeopleTools class somewhere on planet earth. Register for one of his upcoming classes at jsmpros.com.

Tuesday, April 07, 2020

Announcing: Integration Tools Update Course

PeopleSoft Integration Tools is normally taught as a five-day introductory course designed to answer questions such as:

  • What is Integration Broker?
  • How do you configure it?
  • What are Service Operations?
  • How should I integrate with PeopleSoft?

But a lot of us already know the basics of Integration Broker. So last fall, we decided to add another course to our library: PeopleTools Integration Tools Update. This is a three-day class showing what's new with Integration Broker and covers topics such as:

  • Producing and Consuming REST,
  • Constructing Documents and understanding the role of Documents in integration,
  • Creating structured and unstructured JSON responses,
  • Understanding and implementing content negotiation,
  • Responding to REST verbs,
  • Using pre-built services such as Query Access Service,
  • Securing integration points.

As we integrate Chatbots and Cloud solutions with PeopleSoft, it is critical that we understand PeopleSoft's modern integration capabilities.

Our next class begins April 14, 2020. Register now to reserve your seat!

Monday, January 13, 2020

A Refresh-able URL

I find development to be an iterative process. I often create a shell of a program (module, component, page, etc.), just enough to test, and then run my first test. I then iteratively enhance the program (module, component, page, etc.), verifying and validating each change. For online PeopleSoft pages and components, this often means pressing the browser refresh button a LOT! But here is the problem: each time I refresh a PeopleSoft component, PeopleSoft reverts to the search page. After selecting a search value, I'm then directed to the first page in the component. What if I'm testing a different page? Is it possible to craft a URL to bypass component search and open a different page within the component? Yes! We can bypass component search by placing level 0 search key field names and values in the URL. Likewise, we can specify the starting page by placing the Page=... parameter in our URL. But if you don't know the component's search keys and the target page's name, do you have to find them in Application Designer? Fortunately, no. Every PeopleSoft page contains a JavaScript variable named strCurrUrl. This variable contains the current full URL, including search keys and Page parameter. Here is an example of a URL we might use to open the Job Earnings Distribution page of the JOB_DATA component for an employee with the ID KU0001:

http://hr92u030.example.com:8000/psp/ps/EMPLOYEE/HRMS/c/ADMINISTER_WORKFORCE_(GBL).JOB_DATA.GBL?EMPLID=KU0001&EMPL_RCD=0&PAGE=JOB_DATA_ERNDIST

For the last several years, we have been showing customers a simple JavaScript console trick to move the strCurrUrl JavaScript variable into the browser's address bar, allowing us to bypass search and navigation when testing PeopleSoft pages. The real trick to this, though, is that Fluid and Classic behave a little differently, requiring different JavaScript. So today, I want to share a simple JavaScript fragment that you may use across Classic and Fluid. This small snippet is "smart" enough to apply the correct rule on Fluid or Classic. It also has a little logic to detect Classic content in Fluid Activity Guides and Fluid WorkCenters. Please note that using this script with a Fluid Activity Guide/WorkCenter will open Classic content outside of the WorkCenter/Activity Guide frame, but then for testing purposes, that is often desirable.

OK... so... wait, it gets better. Why copy and paste that script into the JavaScript console every time you want to invoke it? Why not just create a browser bookmark or favorite to accomplish this task (also known as a bookmarklet)? Here is the same script in bookmark form. Simply drag this hyperlink into your browser's bookmarks bar and you have a bookmark you may use on almost any PeopleSoft component to get a refresh-able URL.

PS Refresh-able

Are you interested in more tips like this? Jim Marion shares tons of them in his training classes. Register today for one of our upcoming classes!

Sunday, January 05, 2020

Announcing PeopleTools Sound Bytes!

Here at JSMpros, we are super excited to share our new YouTube channel with you: PeopleTools Sound Bytes! Each week we will release a new "Sound Byte" describing a PeopleTools feature, tip, or technique. Some of our sound bytes come from our prerecorded on-demand training. Others are exclusively recorded for our Sound Bytes YouTube channel. For example, we are currently producing a channel-specific series titled, "PeopleTools 8.58 features you can implement today," highlighting new features that are part of 8.58 that you can implement as early as PeopleTools 8.54. Subscribe now so you don't miss an episode!

Do you have a topic you would like us discuss? If so, share your idea with us at https://soundbytes.jsmpros.com/

Monday, September 09, 2019

OpenWorld 2019: I'm Speaking!

Are you ready for OpenWorld 2019? Have you built your schedule? If not, I suggest you get right on it! The best sessions are standing room only. If you don't build your schedule, then you have to wait outside each session until the last few minutes, whereas preregistered attendees walk right in, taking the best seats.

As you plan your PeopleSoft-focused trip to OpenWorld, I recommend starting with Rebekah Jackson's OpenWorld Preview video:

Next, visit peoplesoftoow.com for a complete list of PeopleSoft sessions at OpenWorld. You definitely want to make sure the Roadmap sessions are on your agenda.

Before leaving home, be sure to register for the Quest PeopleSoft reception being held Monday night at the Epic Steakhouse. Details are available on the Quest Community Site

And finally, where will you find me? In pretty much all of the PeopleTools sessions listed in the PeopleTools Program Guide. More specifically, Sarah and I will be leading the session Getting the Most Out of PeopleSoft PeopleTools: Tips and Techniques on Wednesday, Sep 18, 11:15 a.m. - 12:00 p.m. in Moscone West - Room 2002.

We look forward to seeing you in San Francisco!

Tuesday, September 03, 2019

Changing the Search Page Operator Version 2

In 2011, just after PeopleTools 8.50 released, I wrote the post Changing the Search Page Operator. In that post, I demonstrated how to Monkey Patch PeopleSoft to do something you can't do with core PeopleTools: change the default advanced search page operator from Begins With to Between. A lot has changed since I wrote that initial post:

  • PeopleSoft switched from net.ContentLoader to net2.ContentLoader,
  • PeopleSoft released Branding System Options, which supports global JavaScript injection,
  • We began using RequireJS to manage JavaScript dependencies, and
  • The default user experience switched from Classic to Fluid.

Let's create a new version. Before writing any code, let's discuss that last bullet point. This post will focus on Classic. Why? Two reasons:

  1. Fluid doesn't use traditional search pages built from search record metadata and
  2. Roughly 95% of the components in PeopleSoft are still Classic.

This new version of the code will take advantage of Branding System Options and JavaScript dependency management. Our scenario will use the Job Data component (Workforce Administration > Job Information > Job Data. We will cause the Name search operator to default to between:

Let's start by creating JavaScript definitions for each library. Download the following libraries directly from their sources:

In your PeopleSoft system online, navigate to PeopleTools > Portal > Branding > Branding Objects. Switch to the JavaScript tab and create a JavaScript definition for each item. So that your names match our RequireJS configuration, use the names JSM_JQUERY_JS and JSM_REQUIRE_JS. For compatibility reasons, we should also protect our version of jQuery from any other versions of jQuery that may be loaded by PeopleTools. To do this, we create a library named JSM_PRIVATE_JQ_JS that contains the following code:

Next we need a RequireJS configuration that tells RequireJS how to locate each library we intend to use. I named mine JSM_REQUIREJS_CONFIG_JS, but this name is less important because we will select it from a prompt when configuring Branding System Options. Here is our RequireJS configuration:

Note: I snuck an extra library into the RequireJS configuration. Can you figure out what it is? I will be demonstrating this extra library at my session for OpenWorld 2019. Don't worry about removing it, however. As long as we don't reference it, RequireJS will never attempt to load it.

We must create one more JavaScript library to "listen" to page changes, waiting for PeopleSoft to load an advanced search page. Create a library containing the following code. As with the previous, name isn't as important because we will select the name from a list of values during configuration. But in case you are struggling with a creative name, I named mine JSM_SEARCHOP_JS.

Your list of JavaScript files should now look something like:

After uploading our libraries, we can turn our attention to configuration. Navigate to PeopleTools > Portal > Branding > Branding System Options. In the Addtional JavaScript Objects (this should really be named libraries) section, insert the following three libraries in order. Order matters. We first want RequireJS. We then configure RequireJS. Finally, we use RequireJS.

  1. JSM_REQUIRE_JS
  2. JSM_REQUIREJS_CONFIG_JS
  3. JSM_SEARCHOP_JS

About the code that makes all of this happen (JSM_SETSEARCHOP_JS)... It is incredibly similar to the first version. One important difference is that this version is loaded globally whereas the prior iteration was locally scoped to the component. We therefore include a component-specific test. The %FormName Meta-HTML in our JavaScript helps us derive the HTML element that contains the component name. The fieldMap variable contains the mapping between component names and fields that should be changed.

Will this work in Fluid? Unfortunately, no. Fluid does not use search record metadata to generate search pages. It can (with a little work), but not in the same fashion. Fluid also doesn't support branding system options Additional JavaScript Objects. JavaScript automation is still possible, but requires a different approach (Event Mapping to inject, different variables, etc).

Are you interested in learning more about PeopleTools, JavaScript, and HTML? Attend one of our courses online or schedule a live in-person training session.

Monday, August 05, 2019

Announcing Fluid 3!

At jsmpros, we teach Fluid training courses several times a month. PeopleTools Fluid is by far our most popular course. Through our Fluid 1 and 2 courses, we teach an incredible amount of material including:

  • Fluid navigation,
  • Fluid page development strategies,
  • Oracle-delivered style classes and layout
  • External CSS libraries,
  • Fluid grid layouts
  • Fluid Group Boxes
  • Dynamic Tiles
  • Responsive and adaptive mobile design concepts, etc.

The feedback from our Fluid 1 and 2 series is overwhelmingly positive. What we are announcing today is our next level Fluid course: Fluid 3. Through this course you will learn how to:

  • Use Master/Detail to build business process based solutions,
  • Build effective secondary headers similar to PeopleSoft's self-service headers (including Related Actions),
  • Use Scroll Areas and Fluid alternatives,
  • Extend Fluid with JavaScript libraries such as d3 and Oracle JET,
  • Leverage the DataGrid to create compelling solutions,
  • Add Fluid Related Content,
  • Convert Classic components to Fluid,
  • Extend Fluid Pages with 8.57+ Drop Zones,
  • Construct robust, business-centric dynamic tiles and Fluid navigation, and
  • Learn additional PeopleSoft CSS classes not covered in the Fluid 1 and 2 courses.

To register for our upcoming August Fluid 3 session or any of our live virtual training courses, please visit our Live Virtual Training online catalog.

Has it been a while since your last Fluid training course? Are your Fluid skills a little rusty? Use our Fluid 3 course as a refresher to get you back into shape.

Note: If you have taken Fluid from other trainers, feel free to start with our Fluid 2 course. Even though we do not monitor prerequisites, we do encourage attendees with Fluid experience to attend our Fluid 2 training before continuing to Fluid 3.

Wednesday, July 10, 2019

Adding a Fluid WorkCenter to a Navigation Collection

Oracle has done an outstanding job converting Classic Self-service to Fluid to promote the modern, mobile user experience. But what about back-office functionality? We certainly can't predict the future, but it seems that back-office transactions will remain Classic for a very long time. Rather than change the appearance of the back-office user experience, I believe our best strategy is to build back-office, business process-based navigation. Our users don't seem excited about the NavBar and Navigator and we can nearly eliminate its use through properly constructed business process based navigation. Here are a couple of business process based navigation tools:

  • Navigation Collections
  • Master Detail
  • Dashboards
  • Activity Guides
  • WorkCenters

Because of its simplicity and ease of maintenance, we often recommend customers start with Tile Wizard-based Navigation Collections. Oracle, on the other hand, is providing business process based navigation by converting Classic WorkCenters to Fluid WorkCenters.

In a recent attempt to provide a segue from one business process to another, I added a Fluid WorkCenter to a Navigation Collection. Both a Tile Wizard-based Navigation Collection and a Fluid WorkCenter contain a left-hand sidebar. Embedding one in another creates a Left-panel Collision. To avoid this collision, I marked the Navigation Collection item Replace Window property. Unfortunately, trying to launch the Fluid WorkCenter from a Navigation Collection generated an SQL error. This prompted me to try launching the Fluid WorkCenter outside the Navigation Collection. To my surprise, this also generated an SQL error. The WorkCenter worked before adding it to a WorkCenter, so this was clearly unexpected. After reviewing the app server log, I discovered a single-row subquery within the Fluid WorkCenter framework was returning more than one row. It didn't do this before adding the Fluid WorkCenter to a Navigation Collection, so what changed? One thing: I added a Fluid WorkCenter to a Navigation Collection. The SQL that caused the problem looks for any CREF that uses the WorkCenter's target component and is marked as a Fluid Workcenter (contains &FLWC=Y in the CREF additional parameters). By adding a Fluid WorkCenter CREF to a Navigation Collection, I created a CREF Link to the original CREF. The end result was a second matching row in the portal registry table (PSPRSMDEF).

Lesson learned: Don't add a Fluid WorkCenter to a Navigation Collection or any other structure that will result in a second CREF with the same (or similar) target. This makes sense because Fluid WorkCenters are business process-based navigation. Adding business process-based navigation to business process-based navigation may not make sense.

Is there a workaround? Absolutely! Instead of adding the Fluid WorkCenter directly to a Navigation Collection, create a redirect iScript. The PeopleCode in the iScript will send the user to the existing Fluid WorkCenter content reference rather than duplicating the existing content reference in the Navigation Collection.

Is the workaround worth the effort? That is an entirely different question. First, the effort is minimal and will require just a few lines of PeopleCode and a Permission List update. But what is the savings and user experience impact? Fluid WorkCenters are designed to be launched as homepage tiles. To launch a homepage tile, you must be on a homepage. The user savings, therefore, is the user won't have to return to a homepage to launch the next business process but can transfer directly from one to the next. Returning to the prior business process is as simple as clicking the Fluid header back button.

Configuring productive Business Process navigation is critical to successful Fluid implementation. Are you ready to learn more? Register now for our Fluid 1 course online. Do you have a whole team to train? Contact us for group pricing and delivery options.

Monday, July 01, 2019

PeopleSoft ReConnect 2019

It is about two weeks until PeopleSoft ReConnect, and definitely time to build your schedule. I'm looking forward to a great conference with partners such as Appsian, psadmin.io, SpearMC, Presence of IT, Gideon Taylor, PS Web Solutions, New Resources Consulting, Oracle, and colleagues such as Sasank Vemana. There are so many great sessions available. I personally have several overlapping sessions on my agenda. In fact, I am delivering sessions during timeslots that list sessions I would like to attend.

If you still have room in your schedule, here are the sessions I will be presenting at ReConnect 2019. I hope you aren't leaving early because both of my sessions are on Thursday, the final day of the conference.

See you there!

Friday, June 14, 2019

HIUG Interact 2019 Conference Schedule

Tomorrow I fly to Orlando for the 2019 HIUG Interact conference. I'm almost packed. I wanted to share my schedule with anyone attending. As usual, we start the conference off right with a session Sunday afternoon.

I am on site for the whole conference and don't leave until Thursday morning. I plan to be in sessions all day every day. I look forward to seeing you there!

Are you presenting? If so, add your session to the comments below

Wednesday, May 08, 2019

Launching into the middle of a Fluid Navigation Collection

One of the greatest challenges to a successful Fluid deployment is Classic navigation and one of the most common solutions to this challenge is the Tile Wizard-based Navigation Collection. Tile Wizard-based navigation collections allow us to build business process-based navigation for our back-office users (back-office pages are primarily Classic). Let's say you have built some amazing Navigation Collections for your back-office users and now you want to drill from one collection or page to a specific target page in another Navigation Collection. You know you can easily craft a URL to a Tile Wizard Navigation Collection, but can you load a specific target component from that Navigation Collection? This is a great question that my PeopleTools Fluid course students ask me often. The answer is Yes!

When using the Tile Wizard to publish a Navigation Collection, PeopleTools uses a special Activity Guide template to display the Navigation Collection. This means that every Tile Wizard-based Navigation Collection is viewed as an Activity Guide. Each link is considered a step in the Activity Guide. Fluid Activity Guide steps have an id attribute called ptgpid. Once we find the ptgpid of a step, we can use that ID in a URL. When the Activity Guide is a Navigation Collection, the step ID is the Navigation Collection CREF Link ID. Note: this is not the base CREF ID, but the CREF link that was created by the Navigation Collection utility. If we inspect the HTML for a Navigation Collection, we can find the ptgpid in the HTML. Alternatively, we can find it in the portal registry under Portal Objects > Navigation Collections. Here is an example from the HTML:

To launch the highlighted item, copy the ptgpid and add the following to the end of the URL:

&ptgpid=<the id goes here>

For example, in the Portal Navigation Collection that is part of the PeopleSoft Developer homepage, appending the following to the URL will navigate directly to the Find Object Navigation item:

&ptgpid=HC_S201604180146095689166800

At jsmpros we believe that navigation is a critical component of a successful Fluid implementation, which is why we devote the first day of our Fluid 1 course to Fluid navigation. To learn more or to schedule a course, visit us online at jsmpros.com.

Tuesday, March 26, 2019

Documented JSON Classes

Looking through the PeopleTools 8.57 Feature Overview document, you may have noticed that 8.57 now includes support for several JSON classes as well as PeopleBooks documentation. As Chris Malek showed us a couple of years ago, the classes listed in the Feature Overview document are not new. What is new is the keyword Support and PeopleBooks documentation. Using the documentation, I was able to generate a sample on PeopleTools 8.57:

Local JsonBuilder &jbldr = CreateJsonBuilder();
Local string &json;

If &jbldr.StartArrayReturnsTrue("Employees") Then
   REM Empl 1;
   If &jbldr.StartObjectReturnsTrue("Employee") Then
      If &jbldr.StartObjectReturnsTrue("Name") Then
         &jbldr.AddProperty("First", "Jim");
         &jbldr.AddProperty("Last", "Marion");
         &jbldr.AddProperty("Middle", "J");
         &jbldr.EndObject("Name");
      End-If;
      &jbldr.AddProperty("ID", 123456);
      &jbldr.EndObject("Employee");
   End-If;
   
   REM Empl 2;
   If &jbldr.StartObjectReturnsTrue("Employee") Then
      If &jbldr.StartObjectReturnsTrue("Name") Then
         &jbldr.AddProperty("First", "Lucy");
         &jbldr.AddProperty("Last", "McGillicuddy");
         &jbldr.AddProperty("Middle", "");
         &jbldr.EndObject("Name");
      End-If;
      &jbldr.AddProperty("ID", 789123);
      &jbldr.EndObject("Employee");
   End-If;
   &jbldr.EndArray("Employees");
End-If;

&json = &jbldr.ToString();

MessageBox(0, "", 0, 0, &json);

Alternatively, we can build JSON structures using JsonObject and JsonArray directly, but I like the way the JsonBuilder structures code so that child items appear indented, etc. Notice the code above begins the JSON structure with an array? Here is the output. Notice the root node is an object, not an Array:


Even though my very first call to JsonBuilder was to start an Array, it started an Object. What if you just want an array as the outer node? We can extract the array from the JsonBuilder RootNode using the following:

&jbldr.GetRootNode().GetJsonObject().GetJsonArray("Employees");
What if we want to format the code? First, I don't recommend formatting code you will transmit to external systems as white-space compressed JSON is preferred for data transmission. But formatting for debugging purposes is perfect. We can format JsonBuilder output using the JsonGenerator class. Here is a fragment that will format the JsonBuilder result:
Local JsonGenerator &jgen = CreateJsonGenerator();
&jgen.SetRootNode(&jbldr.GetRootNode());
&json = &jgen.ToString();

One thing to note is that JsonBuilder will let you generate invalid JSON. The parameter to StartXxxReturnsTrue is the name of the node to create. If we start the first node with a zero-length string: &jbldr.StartArrayReturnsTrue(""), then the generated JSON will include curly brace object notation, but no property name before the Array start.

As I look through the documentation for 8.57, I see every Json class method and property documented, but what about the CreateJsonXxx functions? Anyone find documentation for these functions? Did I miss something?

As Chris pointed out, these JSON Classes have been in PeopleTools since 8.55.11. Assuming that just the documentation is new and not the classes, I ran all of this code on 8.56 and it works without modification.

At jsmpros, we teach JSON strategies through our Integration Broker and PeopleTools Delta courses. Are you interested in learning more? Contact us to schedule your next PeopleTools training session.