Thursday, August 14, 2008

App Class v/s CI

At somepoint in the implementation or maintenance project; you would face this Q.
Whether I should go for readily available CI or dig into complex App Class and find the right method/Class to fulfill my requirement.
PeopleSoft CRM uses a number of CIs in the out-of-the-box product for application specific purposes. As a programmer; you would have found that the out of the box CI for CDM was too slow.Also, there is limited control the programmer has over the processes triggered by the component interface.
Application classes have been provided as a solution for the performance problems. Application classes are provided out of the box in CRM8.8
In traditional in-house built PeopleSoft applications, it is recommended that the use of CI’s be replaced by referencing the methods in the Application Classes directly. Keep in mind that application class programming requires a new skillset.
Application classes can be used to simulate CI functionality. In the code where we instantiate CI to invoke a component an application class logic could be invoked instead. The developer should keep in mind that this is not a direct replacement, however, because the way you invoke applictation class methods is different than the way you invoke CI methods.


Tuesday, January 08, 2008

Adding more info for Ctrl+J command

By default the ctrl+J command in any peoplesoft online page gives you the following details

Browser IE/6.0
Operating System WINNT
Browser Compression ON (gzip)
Tools Release 8.45.18
Application Release CRM 8.80.01.000
Service Pack 1
Page RB_CUSTOMER
Component RB_CUSTOMER
Menu MAINTAIN_ALL

If you want to add the following more details to the above screen,

User ID SYSADMIN
Database Name CRM88T
Database Type ORACLE
Application Server :

Open the configuration.properties file on your webserver and set “connectionInformation=true” as shown below.

# If set to true, the database name and other potentially sensitive connection information
# will appear in the HTML generated for use in a help display.
# Default: false
connectionInformation=true

Save the configuration.properties file and reboot your webserver. Now the ctrl+J command will show the userid, database name, database type and application server name.

Thursday, December 27, 2007

Changing the PeopleSoft Logo on your Application

The client likes to have their colorful logo on these screens.So, you have a request from client to see their logo in PS screens.
You can change the PeopleSoft Logo either very easily or very complicated, depending on how much you want to do. The following is appropriate to Tools 8.44, but is similar in most other 8 series versions.

Here's the short version first.

Method 1 : Quick but Dangerous one :)

The PeopleSoft logo is delivered as an application designer IMAGE object called NEW_PS_LOGO, and is sized at 145 pixels wide and 41 pixels tall. The easiest thing to do is to design your new logo to match this size (you don't have to stretch it out... you can add white space around the edges to get it to the proper size!), open the existing image in Application Designer, and update the image by using the Edit/Update Image menu item. Please note that this will overwrite the old logo, but this is the quick and dirty method if the size is the same and if you don't mind overwriting the delivered object. You might need to drop your web and app server cache to finalize this.

Method 2 : Little code changes also needed :-O

This is a bit more complex. Let's build on the above. You have a logo image the same size as the delivered logo, but change control concerns prevent you from overwriting the delivered image file. Save that logo as a new name, something like "COMPANY_LOGO". Now, open the Application Package object PT_BRANDING, and go to the BrandingBase application class. Do a search on "NEW_PS_LOGO", and find those entries (there are a couple). Change these to the name of your new logo. This will have PeopleSoft point to your image object instead of the delivered one.

Method 3 : Dont know how this works :-)

This one builds on the earlier method. Let's say you want to modify the size of the logo. The sizing is contained in the HTML objects that build the page, which are referenced in BrandingBase. These are PORTAL_UNI_HEADER_NNS and PORTAL_UNI_HEADER_NEW... there may be others too. The size of the graphic is hardcoded in this HTML. Now, I've never bothered changing the size, so there are no guarantees here. Experiment with this carefully, but one of the first two methods should work fine for you.

Be aware that if you do overwrite the delivered image then the new image will appear everywhere that the delivered image would have, such as the Timeout warning popup message and the expired Password screen.

Friday, August 03, 2007

Quiz time again.

Usually, I get mails asking for PeopleSoft Questionnaire.
I will try to make set of Questions and Answers as and when possible so that I can build a database.
I am posting the answers which I think might be right. If you think its not, please send the corrections with proper comments to harshagatt@gmail.com.
I will do the needful :)

1. PeopleSoft reserves ALL WinHelp context numbers (in Utilities, PeopleTools Options) up to which number?
a) 10,000,000
b) 12,000,000
c) 14,000,000
d) 16,000,000
e) 18,000,000

2. You just finished customization work that involved the creation of many new objects. You must now migrate these objects from your development database (source) to a testing database (target) to conduct more elaborate testing.
Referring to the above information, why would adding your objects to a Project streamline the migration to a new database?
a) Projects do not copy the actual objects, but only the Project Definition. You must still migrate the objects individually.
b) Projects automatically overwrite the same objects in the target database and, thus, reduce the need for consistency checks.
c) Migrating projects automatically produces a comparison report of the objects in the Project and those same objects in the target database.
d) Projects enable migration of individual objects only which ensures you do not overwrite objects in the target database unknowingly.
e) Projects provide the ability to migrate all objects at once or each object type individually.

3. PeopleSoft has its own naming convention for system and non-system (application) tables. In the list below, RECORDNAME refers to the name of any table or record.
Referring to the above information, which one of the following identifies the naming convention PeopleSoft uses for system tables(ppl tools table)?
a) PS_RECORDNAME
b) SYSRECORDNAME
c) PS$RECORDNAME
d) PSRECORDNAME
e) SYS_PSRECORDNAME

4. Your company obtained the newest Application Release of PeopleSoft, and you need to prepare for the upgrade. Upon reading the new Release Notes, you notice that changes were made to two COBOL modules (batch programs).
You need to decide how to compare the current versions of these COBOL programs with the versions delivered with the new PeopleSoft application release. Which would be the fastest method of comparing these different versions?
a) Find Object References.
b) Application Designer, Compare Batch Programs.
c) Application Designer, Upgrade View.
d) Use non-PeopleSoft comparison tools.
e) Application Designer, Tools, Upgrade, Compare & Report.
(since COBOL is a non PS delivered product)

5. Which one of the following tree types is NOT supported in the PeopleSoft tree manager?
a) Node-Oriented trees
b) Query trees
c) Detail trees
d) Summary trees
e) Combination trees (if only 1 is asked)
(types of trees: Standard Detail, Dynamic Detail, Node oriented, Summary )

6. Which of the following menu options allows you to modify the Last Process Instance Number used within the system?
a) Process Scheduler, Use, Job Definitions
b) Process Scheduler, Use, Process Servers
c) Process Scheduler, Use, System Settings, Process System (8.42)
d) Process Scheduler, Use, Administration
e) Process Scheduler, Use, Process Definitions

7. Which one of the following PeopleCode debugging tools automatically converts values of any data type other than object into string values for viewing during debugging?
a) MsgGetText (for message catalog, only message)
(msg-set, msg no, def text, [parameters])
b) MsgGet (for message catalog, msg with the message set no.)
(msg-set, msg no, def text)
c) MessageBox (style, title, msg-set, msg no, def str, parameters)
d) WinMessage (msg, style, title)
e) ExpandBindVar (str)

8. In which one of the following views would you see the fields, criteria, and other details associated with the current query?
a) Object view
b) Record view
c) Component view
d) Designer view
e) Query view

9. In which PeopleCode event does ALL data validation take place?(SaveEdit)
a) SavePostChange
b) FieldFormula
c) SavePreChange
d) FieldEdit
e) FieldChange

10. Which one of the following is NOT a valid PeopleSoft query type?
a) Message agent queries
b) Reporting queries
c) Role queries
d) Ad-hoc queries
e) View queries
(rpt qry, role qry, user qry, process qry, view qry, DB agent qry)

Answers
--------
  1. a
  2. e
  3. d
  4. d
  5. b,e
  6. c
  7. d
  8. d
  9. d
  10. a

Saturday, March 24, 2007

Bypassing the Search page :)

As usual, Clients are always there to come up with strange requests. We as Consultants end up tweaking the code or sometimes doing what PeopleSoft also wont have advised us to do :-D
One of such requests was taken by my Client, the users were complaining that they were losing lot of time in searching for the tasks which are due in their bucket. So they wanted to bypass the search page and directly get the tasks (read results) once they click on the "My Task List" in PS CRM.
The users were requesting the Task List page to show the pending and open tasks for the last 2 weeks of a Sales User logged in to be shown. Initally, we were like this is not possible, blah blah and all.. but when the client was firm on this requirement, we were left with no choice but to work on this requirement.
To start off with; all requirements were captured . Functional design and technical design was done. The ral change came when the coding phase started. We were just thinking how will we do this :-)
We took a trace on the click of Search button and what we got :-( a trace file of around 45 Mb!!!!!!!!!!
tht was like some 2 to 3 textbook of 5,000 pages :-) I bet even my whole engineering material (softcopy) will not cross 45 Mb
Painstakingly, we started analysing the trace file . one day, over.. two days, over..
it took around 8 painstaking days to realise the whole flow of the RB_FILTER_FORM app package and related app packages for the Task List component.
But at the end of 8 days, we were just wondering what a brain would those PS designers would hve possessed.
In RB_FILTER_FORM, there is a search object created for that app package and it is configured to run for any component in PS. Once the search object is created, the component name should be fed into this search object.
Now, using this search object created, we can pass various search parameteres like =,>,<,<>,and,or, etc etc. This is done by using the property.value = ;
Also, the search fields can be specified in the same way.
the magic starts when u type "Search_object.Execute". This piece of code is similar to chossing all values in the search page of PeopleSoft and clicking on the Search button.
Try this concept on any of your components and see the power of PeopleSoft code. :-)


Sunday, February 18, 2007

PeopleSoft Quiz!!!!!

After spending some months in PeopleSoft and attending quite a few number of interviews, I have complied some set of good questionarie.
This can be used by both the candidate and the panel also. Some of the question I have added based on the interviews attended by my friends also.
I am purposely not adding the answers to the questions listed below so that the suspense is retained and we dont tend to memorize the answers :-D

Try finding out the answers for the following Questions :
1. Which PeopleCode events can run in both two-tier and three-tier environments on either the client or application server?
2.How do you set up table-sharing in PeopleTools applications?
3. When running PS Query to output to Excel, how would you prevent the space between Excel columns being printed?
4.select max(effdt) from ps_car_alloc where emplid = &EMPLID and effdt <= %currentdate and end_dt is null; What problem exists in the above PeopleCode statement?
5.PS reserves ALL Message Sets (in Utilities, Message Catalog) up to which number?
6. Why is the record description is important when creating a new record?
7, PeopleSoft uses which tables to automate the process of creating large volumes of users on tables?
8.Your UNIX system administrator have just informed you that they are reorganizing some directory structures on the UNIX machine. They want you to determine if the PeopleSoft architecture will be affected. You quickly realize that your CAB and JAR files locations will be changed.
Referring to the above, how do you ensure the Web client will perform correctly once these directory structures have changed?
9.How would you run SQL Alter to alert you to discrepancies between your record definitions and underlying SQL tables, without actually performing changes to the object in the database?
10.
How many security layers are involved in the PeopleSoft environment?
11.
How are PeopleCode programs saved within the database?
12.
What is PeopleSoft's recommended way to access panel groups and the business logic associated with them outside of PeopleSoft online panels?
13.
Your application users are experiencing problems with one of the customizations your development team has recently worked on. The customization involved changes to a PeopleCode object within the database. You decide to use Application Reviewer to debug the PeopleCode. When you try to start the Application Reviewer you receive an error that the Reviewer cannot be started.
Referring to the above, why is the Application Reviewer unable to start in your normal three-tier client configuration?
14.A user requests a new field to be added to the data entry application used by the company. This new field will capture large amounts of text, up to 2000 characters long. As a developer, you must decide what type of field to use to store this data.
Referring to the above information, which one of the following field types would you create to store this amount of data?
15.
If an object is removed from the database, it will NOT automatically be removed from the project(s) to which it was added. How do you determine if a project contains valid objects without checking every object manually?


Much more Questions will be added!!!! keep watching this space.

Oder Capture component

PeopleSoft CRM runs mainly on Application package code and it is reducing its dependency on the Function Library with each release.
HRMS, FSCM, EPM and other modules of PeopleSoft are yet to adopt the Application Package totally.

Application package is the heart of the PeopleSoft where in it will allow reusability, Object oriented programming, building complex architecture for representing component and also expose PeopleSoft business logic through CI adapters.

Order Capture module in CRM is one such example for displaying the power of the Application package. The whole component is captured into RO_CAPTURE and RO_CAPTURE_TYPES application package.

The logic is built so well that it closely integrates with other application packages. We all know that PeopleSoft doesn’t support multiple inheritances while building/creating the classes. To bring the business logic of the other application packages, PeopleSoft uses a combination of property, super class and get/set concepts.
Our team was facing a complex problem in Order Capture module, it goes something like this:
1. Pricing Engine currently runs on Header level keys; configure it run on combination of Header and Line level keys.
2. Currently, Price List cannot be associated to a Catalog code so build the customization for the same
3. We will not be using the PS delivered Catalog functionality, so on the line level details add a new field Catalog Code. On the field change event, run the pricing engine with the Catalog code as line level key.

The above one liners were looking simple to read and understand, but as we started to look into the code and architecture of the Order Capture component, we realized one thing. It doesn’t look as simple as the requirements are written in the document. :-(
But, we were determined to crack this complex puzzle. Yeah, the whole application package looked like one complex jigsaw puzzle with all pieces thrown around. It required complete understanding of these huge code and classes to get the complete picture.
So, we started understanding the requirements and breaking down this huge task into smaller ones.

Initially, we started understanding the Order Capture and Pricing engine (Price Rule + Price list + Arbitration Plan) linkage.
While the CSR (Customer Service Rep) takes the Order, PeopleSoft calculates the discounts and offers on Products using the Header level information (record.RO_HEADER). The Price Rule, Price List and Arbitration plan are built in the PeopleSoft which will identify the information on the Header level records.
The above scenario was existent in the earlier versions of PeopleSoft i.e before PeopleSoft CRM 9.0.

One of the major enhancements in the PS CRM 9.0 was that PeopleSoft is able to calculate discounts and offers now on line level also. This was what the client wanted in our case and it matched with their requirement.
Strangely, the gap analysis was done against PS CRM 8.9 by the functional team and they had listed this request by the client as one the major enhancement as it was changing the whole logic of the Pricing Engine.

Now, once we started work in this aspect we found that Pricing engine could be configured to recognize the keys not just on the Order Header level but also in the Line level.
But, we wanted to confirm this with the Functional team whether we are on the right track. We told them about our finding, they too were surprised and asked us whether we can give them a demo of our work till now.

We smelled some success, after so many hours of understanding, reading and searching. We readily agreed and we were excited also at the same time.
The summary of our customizations are as follows:
1. We built a Price Key for Catalog Code. This will be used to capture the Transactions data of the Order Capture component. (Homeà Setup CRMàEnterpriser PriceràBuild Price key by transaction)
2. Once this is done, check whether the newly built key is available as “Related object” in Price List, Price Rule, Arbitration plan. If this is done, then you are on the right track.
3. Now build your own Price Rule, Price List, and Arbitration Plan for testing purposes (Homeà Pricing Configurationà Price Rule, Price List and Arbitration plan).
4. Go to Homeà Pricing Configurationà Simulator. Simulator is equal to Order Capture logic and this is used by the Marketing Team to determine whether the Price Rules and Price lists created are working as intended.
5. Here, create a new Order and check whether the Pricing engine is running as intended. (Line level keys can be added or deleted by clicking on Key symbol in the line level details section)

Finally, the D-day arrived. We were all tensed, will we able to pull it off or not. But it turned out to be a smooth one with the functional team happy with our findings and told us that we are on the right track.

A complex puzzle solved with great team effort and some own thinking helped :-D

App


Sunday, January 14, 2007

How to use application packages effectively

All of us would have done the customer data conversion or company data conversion while clients migrate from legacy systems to PeopleSoft CRM systems.
This piece of code which I developed is really efficient and makes the best use of application packages.
Steps to follow :
1. Create an application engine and store the file details into a temp table or state record depending on the technical design.
2. In the peoplecode section,
a) import the RB_CDM:objectcollection and Individual:contact objects.
b) Create a object collect of RB_CDM.
c) Once done, instantiate the object in add mode and set the properties.
d) Invoke the save method which would create a new record.

Once this is done, just run the app engine and see the magic.
The best part of this code is that the speed at which it runs in the process schedluer and you will be amazed.
I did a test run of inserting 100 rows into the PeopleSoft CRM system and it ran just under 2 minues. Roughly, 1.2 sec for insertng every customer.
Hope this approach helps for the other developers.
If you have any other code/examples , mail me on harshagatt@gmail.com. I will post the same on my blog.
Regards,
Harsha Gatt

PS: I got to know that example code is copyrighted material and not supposed to be posted.
Thanks to Chris Speer for letting me know about the same.