Wednesday, December 17, 2014

ORA-20002: [WF_NO_USER] NAME=XXXXX ORIG_SYSTEM=NULL ORIG_SYSTEM_ID=NULL has been detected in FND_USER_RESP_GROUPS_API.INSERT_ASSIGNMENT

I got the above error when trying to add responsibility to a FND User.

There is no any specific reason for this,

As suggested by Corvin below, do the dummy update to the 'person' field

Login to the application and query the user
Clear the 'person' field and save, re-enter the the person field and save

Try adding responsibility.

If above steps does not resolve the issue please perform below steps

1>  Run the program "Synchronize WF LOCAL tables"
      
       Parameters:
       Orig System: ALL / Specific System (Ex: FND_USER)
        Parallel Processes : Number of parallel processes
        Logging Mode:
        Temporary Tablespace:
        Raise Errors:

> Only "Orig System" is a mandatory parameter

Alternatively you can execute below script

BEGIN
  WF_LOCAL_SYNCH.BulkSynchronization('ALL');
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('ERROR: '||SQLERRM); 
END;

>> Check if the issue resolved, if not follow to step 2

2> Run the program "Workflow Directory Services User/Role Validation"
     > Change parameters 'Fix dangling users'                                -> Yes
                                             'Add missing user/role assignments' -> Yes
     > Leave other parameters with default values
     > If you want to run for a specific User/Role, please provide the related parameter value

> I hope this will resolve the issue.

Sunday, October 12, 2014

XML Gateway Transaction for PO Creation and Update using seeded map and transaction

Setup:

1. Creating Hub:
Go to ‘XML Gateway’ ResponsibilityàSelect ‘Define Hubs’
We need to Enter Protocol Address from ‘Application Diagnostics’ Responsibilityà Select Application à Select ‘Application Object Library’ à Select ‘XML Gateway Tests’ à




For HTTP Protocol Address URL Execute ‘OTA Round Trip Test’




For HTTPS Protocol Address URL Execute ‘SSL Test’





2. Trading Partner Setup:

Navigate to ‘XML Gateway’ ResponsibilityàSelect ‘Define Trading Partners’
We Created ‘Supp_Test1’ as a Trading Partner and we will use this supplier in PO.
Transaction Type PO is for Purchasing, and subtype PRO is for Process PO (i.e. a new purchasing document). For change order transmission POCO subtype is entered in the setup. The last letter of the subtype signifies the direction of messaging which is OUTBOUND.







Test

Creating a PO with the Supplier we mentioned in Trading Partner Setup Window.




Click on Approve. In Approval Window ensure that transmission method is XML.



Once PO is Approved .Go to System Administrator-àWorkFlow-àTransaction Monitor
Select ‘Outbound Messages’ and click on ‘Go’.




As Shown above For PO Number 20 the Transaction Sub Type PRO is Created Success- fully. Now we will update this PO to generate Transaction Sub Type POCO.




To View the XML Data, select Document ID and Click on Document, then click on View XML.

Following is the XML File Generated.





This example demonstrates using seeded transaction and map. I will cover custom transaction and map in next posts.

XML Gateway Engine Setup Diagnostic Test



This diagnostic test verifies the XML Gateway engine is working properly.


Go to ‘Application Diagnostics’ Responsibility à Select Application à Select ‘Application Object Library’ à Select ‘XML Gateway Tests’ à




Result : Successful

You are ready to do transactions.

Oracle XML Gateway Overview


Introduction
  • Oracle XML Gateway is a set of services that allows easy integration with the Oracle E-Business Suite to support XML messaging.
  • With Oracle XML Gateway services, you are assured consistent XML message    implementation when integrating with the Oracle E-Business Suite.
  • The majority of messages delivered with the Oracle E-Business Suite are mapped using the Open  Application Group (OAG) standard.


XML Gateway Features

  • The services supported by Oracle XML Gateway are grouped into four functional areas as follows:
         Message Designer
         XML Gateway Setup
         Execution Engine
         Transport Agent

  • Message Designers:
    Use this wizard-guided tool to define message maps containing the RDBMS-to-XML or
    XML-to-XML data transformations.

  •  Utilizes Servlet-Based Transport Agent:
     The servlet-based Transport Agent delivers and receives XML messages using
     SMTP, HTTP, or HTTPS protocols. Protocol types which can be used are as below:



XML Gateway Message Designer

  • It is a Wizard Guided Tool used to define message maps. A message map represents the relationship between the source and target data elements.
  • Each message map consists of a data source and data target representing where the data is coming from and where it is mapped to.
  • There are Two Types of Data Definitions: RDBMS Data Definition & XML Data Definition
  • RDBMS-based data definitions can be based on database tables, database views, Application Open Interface tables, or Application APIs.
  • XML-based data definitions can be based on an XML Document Type Definition(DTD).
  • In Message Designer we are doing two things:
          1. Map Source Data Structure to Target Data Structure

          2. Map Source Data Element to Target Data Element

Define Hub
  • A hub is an integration point within your network (either your intranet or the internet). Hubs are typically used to route documents to and from trading partners.
  • If we define the hub as the trading partner, you can identify all the buyers and sellers who are conducting business on the hub as Trading Partners to the hub.
  • Before defining a hub, you must first complete these setup steps:
               Define System Profile Values
               Define XML Gateway Responsibility
               Define the utl_file_dir parameters

Define Transactions

  • Use the Define Transactions form to define the transactions that will be used by the XML Gateway Execution Engine.
  • You will then associate these transactions will with a trading partner in the Trading Partner Setup form.
  • The Define Transactions form provides the following:
       i. A cross-reference between the external transaction identifiers and the internal Oracle transaction identifiers.
      ii. Identification of the queue from which to retrieve inbound messages
For Outbound and Inbound XML we can refer  ECX_OUTQUEUE and ECX_DOCLOGS tables.

Trading Partner Setup

  • Trading Partner Setup plays a vital role in XML Gateway Messaging. 
  • It enable messages for the trading partner by identifying the internal and external transaction type and transaction subtype codes, and the XML standard associated with the message.
  • In the XML Gateway, the term "Trading Partner" refers to an entity such as a customer, supplier, bank branch, or internal  locations at a particular address with which you exchange messages.
  • The Trading Partner Setup form requires an entry for each Transaction Type and Transaction Subtype associated with this trading partner.

XML Gateway Setups




1. Define System Profile Options – The required profile options are as below

  1. ECX: Log File Path - The directory path for XML messages and log files. Log File Path where the XML messages and runtime log are stored .
  1. ECX: XSLT File Path - The directory path for XSLT style sheets. 

  1. ECX: System Administrator Email Address - XML Gateway System Administrator e-mail address.  

  1. ECX: Server Time ZoneThe time zone in which the database server is running. 

2. Assign XML Gateway Responsibility – Assign ‘XML Gateway’ Responsibility using System Administrator à Security à User à Define


3. Define UTL_FILE_DIR Parameter –

To use Oracle XML Gateway, you must first create directories where the XML message process log and XSLT style sheets will be stored. Oracle XML Gateway uses the UTL_FILE package to read and write to the server.

It is set up in the system.



4. Hub Definitions Form -

A hub is an integration point typically used to route documents to and from trading partners. The Hub Definitions form is used to define the hub and the authorized users conducting business via the hub. The hub users entered in this form will appear on the Trading Partner Setup form.

XML Gateway Responsibility à Define Hubs




Name: Required Field. Enter the Hub name.

Protocol Type: Required Field. Protocol Type is the communication protocol associated with the hub, such as SMTP or HTTP. Select a value from the seeded list of values. The description for the protocol type is displayed

Protocol Address: When protocol type is HTTP or HTTPS, protocol address is prompted.
Protocol Address is the complete URL (including service/servlet) where the Transport Agent, will attempt to post the XML Document. If the Protocol type is SMTP, the protocol address is an e-mail address.

Hub Users

Username (Required): Enter the user name of the trading partner conducting business via the hub.

Password (Required): Enter the password for this user.

Hub Entity Code (Required): Enter the hub entity code for this user. It is the code found in the XML envelope to identify the source of the message.


5. Define XML Standards Form -

XML Gateway Responsibility à Define XML Standards


This form defines standards bodies for XML messages, such as OAG (Open Applications Group), ROSETTANET etc. Most probably we will be using OAG as XML Standards so need not create any entry here.


6. Define Transactions Form - 


XML Gateway Responsibility à Define Transactions



Define Transactions form is used to define the transactions that will be used by the XML Gateway Execution Engine. We then associate these transactions with a trading partner in the Trading Partner Setup form. The Define Transactions form provides the following:
• A cross-reference between the external transaction identifiers and the internal Oracle transaction identifiers.
• Identification of the queue from which to retrieve inbound messages

Party Type (Required): Party Type defines the type of trading partner, such as Supplier, Customer, Bank, or internal locations (such as warehouses). Select a value from the list of values.

Transaction Type (Required): Transaction Type is the product short name for the base Oracle Application associated with the transaction, such as "AR" for Oracle Receivables.

Transaction Subtype (Required): Transaction Subtype is a code for a particular transaction within the application specified by the Transaction Type. The last position of the code represents the direction of the transaction: "I" for inbound, "O" for outbound.

Transaction Description: Enter a description for the transaction.

Standard Code (Required): The XML standard to be used for this transaction. The Standard Codes are set up in the Define XML Standards form. Choose the code from the list of values.

Direction (Required): Direction indicates if the message is inbound or outbound. Select "IN" for inbound messages, or "OUT" for outbound messages from the list of values.

External Transaction Type (Required): External Transaction Type is the primary external identifier for the XML message.

External Transaction Subtype (Required): External Transaction Subtype is the secondary external identifier for the XML message. The combination of the External Transaction Type and the External Transaction Subtype should cross-reference this message to the Oracle internal transaction identified by the Transaction Type and the Transaction Subtype.

Queue (Required for Inbound Messages): A queue is a table in a database where transactions are staged for processing. Default queues are defined during installation. Select a queue from the list of values. The field is disabled for outbound messages.


7. Define Lookup Values –

XML Gateway Responsibility à Define Lookup Values



Seeded lookup types are defined here which are used in XML Gateway.


8. Trading Partner Setup –

XML Gateway Responsibility à Define Trading Partners

The Trading Partner Setup form is used to:
• Set up trading partners for multiple operating units.
• Enable messages for the trading partner by identifying the internal and external transaction type and transaction subtype codes, and the XML standard associated with the message.
• Access the Trading Partner User Setup form.
• Access the Trading Partner Code Conversion form.
• Select a message map for the trading partner.
• Identify the communications protocol and address for a message. Optionally, the user can be selected from a hub.



Trading Partner Type (Required):
Trading Partner Type defines the type of trading partner, such as Supplier, Customer, Bank or internal location.

Trading Partner Name (Required):
Given the selection in the Trading Partner Type, the appropriate Trading Partner
Names are displayed in the Trading Partner Name list of values.

Trading Partner Site (Required):
Given the selection in the Trading Partner Name, the appropriate Trading Partner Sites are displayed in the list of values.

Company Admin Email (Required):
This is the e-mail address of the administration contact to receive e-mails regarding warnings and errors.

Trading Partner Details

These details are discussed earlier in the document.


9. Code Conversion

The Oracle XML Gateway code conversion function provides a method to cross-reference the codes defined in Oracle E-Business Suite to codes used by trading partners, the XML standard, or other standard codes in the transactions.

XML Gateway Responsibility à Define Code Conversion




Location where BI Publisher Report Output (PDF, EXCEL, HTML, RTF, etc.) stored in server


Many a times we come across requirement wherein we want to email/FTP report output generated from BI Publisher report. Well, you can get report output using below query :

SELECT outputfile_name
  FROM fnd_concurrent_requests
 WHERE request_id = p_request_id        -- (Request ID of your report program);

However, this query will give report output in .out format.
Suppose BI Publisher report is in RTF, EXCEL, HTML or PDF format and we want to email/FTP this report output, where can we get this from server?

This is stored in server and to get the location you can use below query :

SELECT file_type, file_name
  FROM fnd_conc_req_outputs
 WHERE concurrent_request_id = p_request_id -- (Request ID of your report program);

Hope this helps !!!

Monday, September 8, 2014

Concurrent Request Delivery Option (Email) - Unable to determine SMTP server to use

Concurrent Request log of the concurrent program where delivery options were set -- +------------- 2) DELIVER -------------+ Emailing output to xyz@abc.com .............. .............. One or more post-processing actions failed. Consult the OPP service log for details. -- Get the OPP service log ----------------------- SYstem Administrator > Concurrent > Manager > Administer >> Select Outout Post Processor > Click on 'Processes' >> Now click on the 'Manager Log' and look for your request id and error details. OPP log giving below error. oracle.apps.fnd.cp.opp.PostProcessorException: Unable to determine SMTP server to use: set FND_SMTP_HOST Fix --- You just need to set below profile options (SYstem Administrator > Profile > System) FND: SMTP Host FND: SMTP Port How to get the SMTP Host Name ----------------------------- Application ----------- Oracle Application Manager > Workflow >> Click on the 'Notification Mailers' >> Click on "Workflow Notification Mailer" >> Check 'EMail Servers' section >> Check Outbound EMail Account >> Get the value 'Outbound Server Name' Database -------- select fscpv.parameter_value "SMTP Host Name" --SMTP protocol uses default port number 25 for outgoing emails ,25 "SMTP Port Number" ,fscpt.description from fnd_svc_comp_params_tl fscpt ,fnd_svc_comp_param_vals fscpv where fscpt.parameter_id = fscpv.parameter_id and fscpt.display_name = 'Outbound Server Name' --'Inbound Server Name' and fscpt.language = 'US';

Get FND User's Password

you might need it for user migration.

1> create a function
create or replace function xxta_get (key in varchar2, value in varchar2)
      return varchar2
   as
      language java
      name 'oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String) return java.lang.String'
;
/

2> use
  >> 2.1 when you know the apps password
select  xxta_get(<apps password in capital>,encrypted_user_password)
  from fnd_user
 where user_name = 'XXUSER' ;

   >> 2.2 when you do not know the apps password
select usr.user_name,
       xxta_get
          ((select (select xxta_get
                              (fnd_web_sec.get_guest_username_pwd,
                               usertable.encrypted_foundation_password
                              )
                      from dual) as apps_password
              from fnd_user usertable
             where usertable.user_name =
                      (select substr
                                  (fnd_web_sec.get_guest_username_pwd,
                                   1,
                                     instr
                                          (fnd_web_sec.get_guest_username_pwd,
                                           '/'
                                          )
                                   - 1
                                  )
                         from dual)),
           usr.encrypted_user_password
          ) password
  from fnd_user usr
 where usr.user_name = :user_name

OR

1> create below packaged procedure

  >> package specification
create or replace package xxta_get
as
   function ini_decrypt (key in varchar2, value in varchar2)
   return varchar2;
     
   function decrypt (p_user_name in varchar2)
   return varchar2;
end xxta_get;
/
     >> package body
create or replace package body xxta_get
as
   function ini_decrypt (key in varchar2, value in varchar2)
      return varchar2
   as
      language java
      name 'oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String) return java.lang.String';
   function decrypt (p_user_name in varchar2)
      return varchar2    
   as
   l_pwd varchar2(40);
   begin
   select --usr.user_name,
       ini_decrypt
          ((select (select ini_decrypt
                              (fnd_web_sec.get_guest_username_pwd,
                               usertable.encrypted_foundation_password
                              )
                      from dual) as apps_password
              from fnd_user usertable
             where usertable.user_name =
                      (select substr
                                  (fnd_web_sec.get_guest_username_pwd,
                                   1,
                                     instr
                                          (fnd_web_sec.get_guest_username_pwd,
                                           '/'
                                          )
                                   - 1
                                  )
                         from dual)),
           usr.encrypted_user_password
          ) password
  into l_pwd
  from fnd_user usr
 where usr.user_name = p_user_name;
 return l_pwd;
 end;
end xxta_get;
/


use

select xxta_get.decrypt('XXUSER')
  from dual;

--

FND User/Responsibility Create/Update/Delete

--
declare
   --
   l_mode              varchar2(10) := 'CreateUser';
   --
   l_user_name         fnd_user.user_name%type := 'AKTEST';
   l_employee_id       per_all_people_f.person_id%type := 12348;
   l_email             varchar2(40) := 'aktest@ak.com';
   l_begin_date        date := trunc(sysdate);
   l_resp_app          fnd_application.application_short_name%type := 'XXCUST';
   l_resp_key          fnd_responsibility.responsibility_key%type := 'XXAK_TEST_RESP';
   l_security_group    fnd_security_groups.security_group_key%type := 'STANDARD';
   l_responsibility_id fnd_responsibility.responsibility_id%type := 12345;
   l_app_id            fnd_application.application_id%type := 67891;
   l_security_group_id fnd_security_groups.security_group_id%type := 23456;
   --
begin
   --
   if l_action = 'CreateUser' then
      --
      --Insert new user record into FND_USER table  
      fnd_user_pkg.createuser ( x_user_name              => l_user_name
                              , x_employee_id            => l_employee_id
                              , x_email_address          => l_email
                              , x_start_date             => l_begin_date
                              , x_unencrypted_password   => 'Welcome1'
                              , x_owner                  => 'CUST'
                              , x_password_lifespan_days => 90 );
                                 
      -- For a given user, attach a valid responsibility                          
      fnd_user_pkg.addresp ( start_date            => l_begin_date
                           , end_date              => null
                           , username              => l_user_name
                           , resp_app              => l_resp_app
                           , resp_key              => l_resp_key
                           , security_group        => l_security_group
                           , description           => null);    
                             
   elsif l_action = 'UpdateUser' then                              
       
      --Update any column for a particular user record.here I am just updating the Email Address                    
      fnd_user_pkg.updateuser (x_user_name     => l_user_name
                              ,x_owner         => 'CUST'
                              ,x_email_address => l_email
                                );
                                     
      --Update an existing user/resp/group assignment            
      fnd_user_resp_groups_api.Update_Assignment( user_id                       => l_user_id
                                                 ,responsibility_id             => l_responsibility_id
                                                 ,responsibility_application_id => l_app_id
                                                 ,security_group_id             => l_security_group_id
                                                 ,start_date                    => l_begin_date
                                                 ,end_date                      => hr_general.end_of_time
                                                 ,description                   => NULL);                                    
                                   
   elsif l_action = 'Delresp' then  
   
      -- Detach a responsibility which is currently attached to this given user                            
      fnd_user_pkg.delresp(username       => l_user_name
                          ,resp_app       => l_resp_app
                          ,resp_key       => l_resp_key
                          ,security_group => l_security_group);
               
   end if;
   --
   commit;
   --                                                        
--
exception
  when others then
     dbms_output.put_line('Error :'||sqlerrm);
     rollback;
end;
--

Thursday, September 4, 2014

Reverse Termination Employee/Contingent Worker - HRMS APIs

--
declare
   --
   --Common Variables
   l_sys_person_type            varchar2(40);
   l_person_id                  number := 123456;
     
   --- Declare variables for reverse termination API
   l_act_term_date              per_periods_of_service.actual_termination_date%type;
   l_clear_details              varchar2(1) := 'Y';
   l_fut_actns_exist_warning    boolean;
   --
begin
   --
   select ppt.system_person_type
     into l_sys_person_type
     from per_all_people_f       papf
         ,per_person_types       ppt                                  
    where papf.person_id = l_person_id  
      and papf.person_type_id  = ppt.person_type_id;
   --
   if l_sys_person_type like 'EX_EMP%' then
     
      select pos.actual_termination_date                                  
        into l_act_term_date
        from per_all_people_f       papf
            ,per_periods_of_service pos
       where papf.person_id = l_person_id
       --AND papf.effective_start_date  =
         and pos.person_id  =   papf.person_id ;
     
      /*
      * This API is not published, hence not meant for public calls.
      */
       hr_ex_employee_api.reverse_terminate_employee
                                  ( p_validate                 =>  false
                                  , p_person_id                =>  l_person_id
                                  , p_actual_termination_date  =>  l_act_term_date
                                  , p_clear_details            =>  l_clear_details
                                  );
                                 
       dbms_output.put_line('Employee Reverse Terminated ');
       --
       commit;
       --
   else --CWK
 
      select pos.actual_termination_date
        into l_act_term_date
        from per_all_people_f         papf
            ,per_periods_of_placement pos
       where papf.person_id = l_person_id
       -- AND papf.effective_start_date  =
         and pos.person_id  =   papf.person_id ;
     
 
      /* This API reverses a contingent worker termination.
      * This API removes the end date from the period of placement and the
      * contingent worker assignments, and reverts the person type to Contingent Worker
     */
      hr_contingent_worker_api.reverse_terminate_placement
                                  ( p_validate                 =>  false
                                  , p_person_id                =>  l_person_id
                                  , p_actual_termination_date  =>  l_act_term_date
                                  , p_clear_details            =>  l_clear_details
                                  , p_fut_actns_exist_warning  =>  l_fut_actns_exist_warning
                                  );
                                 
      if l_fut_actns_exist_warning then
         dbms_output.put_line('Reverse Termination failed for CWK '||sqlerrm);
         rollback;
      else
         dbms_output.put_line('CWK Reverse Terminated ');
         commit;
      end if;                                  
 
   end if;                                                  
   --
exception    
   when others then
      dbms_output.put_line('Reverse Termination failed. Error Others: '||sqlerrm);
      rollback;
end;
--

Wednesday, September 3, 2014

Update Employment/Placement Details - HRMS APIs

--
declare
   --
   --Common Variables
   l_type                        varchar2(10) := 'CWK';--'EMP'
   l_person_id                   number := 123456;
 
   --- DECLARE variables for hr_periods_of_placement_api.update_pdp_details
   l_effective_date              date := trunc(sysdate);
   l_termination_reason          per_periods_of_placement.leaving_reason%type := 'AGE_REACHED';  
   l_object_version_number       per_periods_of_placement.object_version_number%type;
   l_start_date                  per_periods_of_placement.date_start%type;
   --
   cursor cur_emp_res is
   select rowid row_id      --HR_GENERAL.DECODE_LOOKUP ('LEAV_REAS',a.leaving_REASON) ter_reason
         ,pos.*  
     from per_periods_of_service  pos
    where person_id =  123456;
   --
begin
   --
   if l_type = 'CWK' then --Contingent Worker
 
      -- HR_GENERAL.DECODE_LOOKUP ('HR_CWK_TERMINATION_REASONS',a.TERMINATION_REASON) termination_reason
      select pos.object_version_number, date_start
        into l_object_version_number, l_start_date
        from per_periods_of_placement pos
       where pos.person_id = l_person_id;
     
      /*
      * This API updates period of placement information for a contingent worker.
      * Typically, this API is used to update the flexfields associated with periods
      * of placement.
      */
       hr_periods_of_placement_api.update_pdp_details(
                                    p_validate             => false
                                   ,p_effective_date        => l_effective_date
                                   ,p_object_version_number => l_object_version_number
                                   ,p_person_id             => l_person_id
                                   ,p_date_start            => l_start_date
                                   ,p_termination_reason    => l_termination_reason
                                   --,p_attribute_category    =>
                                   --,p_attribute1            =>
                                   --,p_attribute2            =>
                                   --,p_attribute3            =>
                                   );
   else --Employee
     
      for rec_per IN  cur_emp_res loop
 
          per_periods_of_service_pkg.update_row(
                          p_row_id                         => rec_per.row_id
                         ,p_period_of_service_id           => rec_per.period_of_service_id
                         ,p_business_group_id              => rec_per.business_group_id
                         ,p_person_id                      => rec_per.person_id
                         ,p_date_start                     => rec_per.date_start
                         ,p_termination_accepted_per_id    => rec_per.termination_accepted_person_id
                         ,p_accepted_termination_date      => rec_per.accepted_termination_date
                         ,p_actual_termination_date        => rec_per.actual_termination_date
                         ,p_comments                       => rec_per.comments
                         ,p_final_process_date             => rec_per.final_process_date
                         ,p_last_standard_process_date     => rec_per.last_standard_process_date
                         ,p_leaving_reason                 => l_termination_reason
                         ,p_notified_termination_date      => rec_per.notified_termination_date
                         ,p_projected_termination_date     => rec_per.projected_termination_date
                         ,p_request_id                     => rec_per.request_id
                         ,p_program_application_id         => rec_per.program_application_id
                         ,p_program_id                     => rec_per.program_id
                         ,p_program_update_date            => rec_per.program_update_date
                         ,p_attribute_category             => rec_per.attribute_category
                         ,p_attribute1                     => rec_per.attribute1
                         ,p_attribute2                     => rec_per.attribute2
                         ,p_attribute3                     => rec_per.attribute3
                         ,p_attribute4                     => rec_per.attribute4
                         ,p_attribute5                     => rec_per.attribute5
                         ,p_attribute6                     => rec_per.attribute6
                         ,p_attribute7                     => rec_per.attribute7
                         ,p_attribute8                     => rec_per.attribute8
                         ,p_attribute9                     => rec_per.attribute9
                         ,p_attribute10                    => rec_per.attribute10
                         ,p_attribute11                    => rec_per.attribute11
                         ,p_attribute12                    => rec_per.attribute12
                         ,p_attribute13                    => rec_per.attribute13
                         ,p_attribute14                    => rec_per.attribute14
                         ,p_attribute15                    => rec_per.attribute15
                         ,p_attribute16                    => rec_per.attribute16
                         ,p_attribute17                    => rec_per.attribute17
                         ,p_attribute18                    => rec_per.attribute18
                         ,p_attribute19                    => rec_per.attribute19
                         ,p_attribute20                    => rec_per.attribute20
                         ,p_pds_information_category       => rec_per.pds_information_category
                         ,p_pds_information1               => rec_per.pds_information1
                         ,p_pds_information2               => rec_per.pds_information2
                         ,p_pds_information3               => rec_per.pds_information3
                         ,p_pds_information4               => rec_per.pds_information4
                         ,p_pds_information5               => rec_per.pds_information5
                         ,p_pds_information6               => rec_per.pds_information6
                         ,p_pds_information7               => rec_per.pds_information7
                         ,p_pds_information8               => rec_per.pds_information8
                         ,p_pds_information9               => rec_per.pds_information9
                         ,p_pds_information10              => rec_per.pds_information10
                         ,p_pds_information11              => rec_per.pds_information11
                         ,p_pds_information12              => rec_per.pds_information12
                         ,p_pds_information13              => rec_per.pds_information13
                         ,p_pds_information14              => rec_per.pds_information14
                         ,p_pds_information15              => rec_per.pds_information15
                         ,p_pds_information16              => rec_per.pds_information16
                         ,p_pds_information17              => rec_per.pds_information17
                         ,p_pds_information18              => rec_per.pds_information18
                         ,p_pds_information19              => rec_per.pds_information19
                         ,p_pds_information20              => rec_per.pds_information20
                         ,p_pds_information21              => rec_per.pds_information21
                         ,p_pds_information22              => rec_per.pds_information22
                         ,p_pds_information23              => rec_per.pds_information23
                         ,p_pds_information24              => rec_per.pds_information24
                         ,p_pds_information25              => rec_per.pds_information25
                         ,p_pds_information26              => rec_per.pds_information26
                         ,p_pds_information27              => rec_per.pds_information27
                         ,p_pds_information28              => rec_per.pds_information28
                         ,p_pds_information29              => rec_per.pds_information29
                         ,p_pds_information30              => rec_per.pds_information30
                         ,p_adjusted_svc_date              => rec_per.adjusted_svc_date
                         );
      end loop;                                              
 
   end if;                                                  
                               
   --
   commit;
   --
exception    
   when others then
      dbms_output.put_line('Update Placement/Employement Details. Error OTHERS while validating: '||sqlerrm);
      rollback;
end;
--