User Tools

Site Tools


tech:psoft:pdi_edit_message

Removing a NATIONAL_ID for a PDI Message

PeopleSoft PDI mappings are usually one-to-one. For example let's say you have an LDAP field called “xID”. This is mapped to PS_PERS_NID.NATIONAL_ID. Now the PS_PERS_NID table is keyed by two fields NATIONAL_ID_TYPE and NATIONAL_ID. If a person has multiple rows in the PS_PERS_NID table, say a social security number and an EDIPI number (if in the military) and any one of these values is changed the LDAP field “xID” will get the value of whichever NATIONAL_ID_TYPE was changed.

The same applies for email addresses. The PS_EMAIL_ADDRESSES table can contain many types of email addresses. What do you do?

The answer lies in removing attributes from the DSMAPINPUT message by means of a function. You put the function in FUNCLIB_EO_DS.DSDYNFUNC.FieldFormula(). An example of the function is given below:

Function z_pub_fix(&MSGIN As Message) Returns Message
   Local Rowset &RS, &RS1;
   Local number &i;
   If &MSGIN.Name = "DSMAPINPUT" Then
      
      /*
       &f = GetFile("/tmp/DSMAPINPUT.log", "A", %FilePath_Absolute);
       &f.Writeline(" ");
       &f.Writeline("In z_pub_fix() prior to writing out LDIF:");
      */
      &MSGout = &MSGIN;
      
      /* Remove Rows with NATIONAL_ID_TYPE = "PR" only leave NATIONAL_ID_TYPE = "TR" in the message */
      &RS = &MSGout.GetRowset()(1).GetRowset(Scroll.PERSON)(1).GetRowset(Scroll.PERS_NID);
      For &i = &RS.RowCount To 1 Step - 1
         If &RS(&i).PERS_NID.NATIONAL_ID_TYPE.Value = "PR" Then
            /* &f.writeline("Deleting " | &i | " " | &RS(&i).PERS_NID.NATIONAL_ID_TYPE.Value | " " | &RS(&i).PERS_NID.NATIONAL_ID.Value); */
            &RS.DeleteRow(&i);
         End-If;
      End-For;
      
      /* Remove Rows with E_ADDR_TYPE = "HOME" only leave E_ADDR_TYPE = "BUSN" in the message */
      /*&RS = &MSGout.GetRowset()(1).GetRowset(Scroll.PERSON)(1).GetRowset(Scroll.EMAIL_ADDRESSES);
      For &i = &RS.RowCount To 1 Step - 1
         If &RS(&i).EMAIL_ADDRESSES.E_ADDR_TYPE.Value = "HOME" Then
            &f.writeline("Deleting " | &i | " " | &RS(&i).EMAIL_ADDRESSES.E_ADDR_TYPE.Value | " " | &RS(&i).EMAIL_ADDRESSES.EMAIL_ADDRESS.Value);
            &RS.DeleteRow(&i);
         End-If;
      End-For; 
      */
      
      /** For debugging, publish a DSMAPINPUT message so we have a record of what is happening 
      &MSGout.Publish();
      **/
      Return &MSGout;
   Else
      Return &MSGIN;
   End-If;
End-Function;
tech/psoft/pdi_edit_message.txt · Last modified: 2024/06/21 12:04 by 127.0.0.1