October 22, 2010

Can we have two main functions in an application engine? OR Can we have two sections in application engine with same name?


The answer is YES.

The section name is stored with the combination of the Name, Market, Platform and effective date.
Eg : Main.GBL.0.1900-01-01

From the above eg if we change any of the parameter we can save it with same name (name like Section01)

Possible cases are Section01.GBR.0.19-01-01 and Section01.USA.0.1900-01-01 is a valid case and will not throw any error. Here the difference is in the market.

If all the parameters in the name are same we will get the error like :


The fun in this is we can write a single application engine which can work in different market. From main you have a call section and you want the same application engine to work different for different market. In this case you will call the same section but based on the market the call will be handled to the respective sections. 
The above eg shows a single application engine with 2 Main functions but the markets are different.

Some PeopleCode sample for quick reference

Stand alone rowset

Stand alone rowset is used to create a record structure and traverse using that. We use the &rowset = CreateRowset(Recorc.record_name); to create a standalone rowset. When we create a stand alone rowset the data will not be filled in this. For filling the data we can use Fill property (as shown in below example).

Local rowset &rowset;
&rowset = CreateRowset(Recorc.record_name);
&rowset.Fill(“WHERE EMPLID = :1”, Record.Fieldname);


We can copy a rowset from one to another using the Copyto function

Local Rowset &MYRS1, MYRS2;
Local String &EMPLID;

&MYRS1 = CreateRowset(RECORD.SOMEREC);
&MYRS2 = CreateRowset(RECORD.SOMEREC);

&EMPLID = '8001';

&MYRS1.Fill("where EMPLID = :1", &EMPLID);
&MYRS1.CopyTo(&MYRS2);


To add a child rowset for a created rowset.
• RECORD1
• RECORD2
• RECORD3
To build rowsets with child rowsets, use code like the following:
Local Rowset &rsREC1, &rsREC2, &rsREC3;

&rsREC3 = CreateRowset(Record.RECORD3);
&rsREC2 = CreateRowset(Record.RECORD2, &rsREC3);
&rsREC1 = CreateRowset(Record.RECORD2, &rsREC2);


OR in a single line we can write like

&rsREC3 = CreateRowset(Record.RECORD1, CreateRowset(Record.RECORD2, CreateRowset(Record.RECORD3)));

Component buffer access using PeopleCode

Buffer access is used to access the value for the current active component. When a component is modeled and displayed in the page the records/fields/values are stored in the hierarchical structure in the memory. We can use the component buffer access classes to get these values.

There are four data buffer classes: Rowset, Row, Record, and Field.

These four classes are the foundation for accessing component buffer data.

A field object, which is instantiated from the Field class, is a single instance of data within a record and is based on a field definition.

A record object, which is instantiated from the Record class, is a single instance of a data within a row and is based on a record definition. A record object consists of one to n fields.

A row object, which is instantiated from the Row class, is a single row of data that consists of one to n records of data. A single row in a component scroll area is a row. A row may have one to n child rowsets. For example, a row in a level two scroll area may have n level three child rowsets.

A rowset object is a data structure used to describe hierarchical data. It is made up of a collection of rows. A component scroll area is a rowset. You can also have a level zero rowset.

Getlevel0 is used to access the level0 record or the primary record.

Local Rowset &ROWSET;
&ROWSET = GetLevel0()(1).GetRowset(SCROLL.LEVEL1_REC);
Example:
&Rowset0 = GetLevel0();
&Rowset1 = &Rowset0(1).GetRowset(Scroll.RECORD1);
&Rowset2 = &Rowset1(CurrentRowNumber(1)).GetRowset(Scroll.RECORD2);
&z_ats_sw = &Rowset2(1).RECORD2.FIELD.Value;


OR

GetLevel0()(1).GetRowset(Scroll.dept_tbl).GetRow(getcurrentactiverow(1)).GetRecord(Record.Z_HRS_JO_CMP_WK).GetField(Field.SS_HIST_GRPBOX_LBL)

To get the current active number for a record use

geteffectivenum(effdt)
geteffectiveitemnum(effdt,effseq)


To read data from a file layout

rem***********************************************************;
rem * PeopleCode to Import Data *;
rem **********************************************************;
Local File &FILE1;
Local Rowset &RS1, &RS2;
&FILE1 = GetFile("specify the path here", "r", "a", %FilePath_Absolute);
&FILE1.SetFileLayout(FileLayout.PMD_FILE1);
&RS1 = &FILE1.CreateRowset();
&RS1 = &FILE1.ReadRowset();
While &RS1 <> Null;
    rem code
End-While;



Call the CI using Peoplecode


Local ApiObject &oSession, &oPmdComp1;
&oSession = %session;
&oPmdComp1 = &oSession.GetCompIntfc(CompIntfc.PMD_COMP1);
If &oPmdComp1 = Null Then errorHandler(); throw CreateException(0, 0, "GetCompIntfc failed"); End-If;
rem ***** Set the Component Interface Mode *****; &oPmdComp1.InteractiveMode = False; &oPmdComp1.GetHistoryItems = True; &oPmdComp1.EditHistoryItems = False;
rem ***** Set Component Interface Get/Create Keys *****;
&oPmdComp1.EMPLID = [*];
&oPmdComp1.get();


To Schedule a job using PeopleCode

This sample code is used to submit a sqr to the scheduler.

REM Declare your Variables;
Local ProcessRequest &MYRQST;
Local String &MySQR;

&MySQR = "MYSQR"
REM Create My Process Request Object;
&MYRQST = CreateProcessRequest("SQR Process", &MySQR);

REM Set Properties of My Process Request Object;
&MYRQST.RunControlID = "MYRUNCNTRL_ID"

REM Set Properties of My Process Request Object;
&MYRQST.SetOutputOption("Web", "PDF", "", &MySQR);


The above example creates a ProcessRequest object for the MYSQR SQR named &MYRQST.

&MYRQST.Schedule();
If &MYRQST.Status = 0 then
/* Schedule succeeded. */
Else
/* Process (job) not scheduled, do error processing */
End-If;

Methods to create dynamic prompt.

1. We will create two views for the prompt. Suppose Country and State. Here we will create one view for Country and another for state with country as the key field, then place these fields in the page but make sure that the country is above the state in the page order.
2. Using the %EDITTABLE
In this post I will attempt to explain how to dynamically assign a prompt table depending on a drop down value (see image below)



The table behind the grid is PORTAL_SECDYVW and as you can see from the image below, the PORTAL_AUTHNAME field has %EDITTABLE defined as a prompt table. The PORTAL_AUTHNAME is the "Name" column you see on the grid.



Now, we would want to assign table PSCLASSDEFN_SRC as prompt if the drop down value is Permission list and PSROLEDEFN_SRCH if the value is Role.
/*Record PeopleCode: PORTAL_SECDYVW.PORTAL_AUTHNAME.FieldChange*/
Evaluate PORTAL_SECDYVW.PORTAL_PERMTYPE2
When "P"
DERIVED.EDITTABLE = "PSCLASSDEFN_SRC";
PORTAL_SECDYVW.DESCR = PSCLASSDEFN.CLASSDEFNDESC.Value;
Break;
When "R"
DERIVED.EDITTABLE = "PSROLEDEFN_SRCH";
PORTAL_SECDYVW.DESCR = PSROLEDEFN.DESCR.Value;
Break;
When-Other

End-Evaluate;

3. Using a dynamic view to fetch the value from the backend table based on the value in the country field. For example
Create a dynamic view with the following query
Select state from ps_table where country = :1
Then using the value from the country table in the field change of the country table we can fill the state table

Peoplesoft Techiinical

This post is created as a repository for my research work on peoplesoft. This could be used as a quick refrency on all questions that we go through in Peoplsoft. Will try to add all those materials that i go through....

If you have any questions related peoplesoft technical side you can mail me at prashobmdas@yahoo.co.uk

Page field configurator

Peoplesoft study   Page field configurator This is an enterprise component and not a tools feature ( https://docs.oracle.com/cd/F138...