Running Update Project Summary Amounts in Load Balanced Batches

The “PRC: Update Project Summary Amounts for a Range of Projects” (PAXACMPT) in Oracle Applications Projects module can take a significant amount of time.  If there are many projects, running it once for all projects may not complete on time.
Running this in batches as new projects are added means perpetual maintenance.  This program simplifies this task by
running PAXACMPT in parallel with a load-balanced number of projects in each batch dynamically determined based on your
selection of the two parameters.  There are two load-balancing options: Specify the ‘number of processes’ or specify the
‘number in each process.’  The parameters are as follows:

? Number or Processes -- Character (numbers only or NULL) Not
Required

? Number in Processes – Character (numbers only or NULL) Not
Required

? Wait for Completion – Character (‘N’ for ‘No’ – Default, ‘Y’
for ‘Yes’)

Number or Processes (Null or Number) is the number or individual submissions.  The total number of projects are divided in equal ranges (except for the last range) and submitted as Concurrent Requests.  This parameter has precedence over the next parameter if both are specified.

Number in Processes (Null or Number) is the number of projects to submit to each Concurrent Request.  All the projects are
submitted with this number of projects in each submission until the remainder is less than this number in which case the
remainder is submitted in the last submission.  This parameter is ignored if the previous parameter is specified.

BOTH PARAMETERS CANNOT BE NULL.

Wait for Completion (‘N’ for No (Default) ‘Y’ for Yes) tells this Concurrent Request to Wait until all submissions are
completed.  This takes up one Concurrent Queue, but it also provides information about any failure in the log if this is set
to ‘Y’.

This program requires that all parameters from PAXACMPT except for the first two parameters (“From Project Number” and “To Project Number”).  Define all the other (currently eight parameters) as they are defined in PAXACMPT or customize the
code to default appropriate values for your installation.

Create the appropriate Value Sets to use and register as a Concurrent Program.

PLEASE TEST THIS OUT ON A TEST SYSTEM SINCE NO WARRANTY IS IMPLIED OR UNDERSTOOD.

Provide the name of the procedure at the prompt and also sleep_interval and total_time for
FND_CONCURRENT.WAIT_FOR_REQUEST.

/*Version: 1.0
   Purpose: This Concurrent PL/SQL Program submits
      PRC: Update Project Summary Amounts for a Range of Projects (PAXACMPT)
      for a number of projects at a time.  This lets the PAXACMPT to run in parallel.
      This takes less time to complete than running once for all projects.
      Parameters:
      IN  Number of Processes (Null or Number)
            is the number of submissions.  The total
            number of projects are divided in equal ranges
            (except for the last range) and  submitted as Concurrent Requests.
            This parameter has precedence over the next parameter if both are
            specified.
          Number in Processes (Null or Number)
            is the number of projects to submit to each Concurrent Request.
            All the projects are submitted with this number of projects
            in each submission until the remainder are submitted
            in the last submission.
            This parameter is ignored if the previous parameter is specified.
      BOTH PARAMETERS CANNOT BE NULL.
          Wait for Completion ('N' for No (Default) 'Y' for Yes)

      This program also requires all the parameters that are part of PAXACMPT except for the first two
       ("From Project Number" and "To Project Number").
      Please define all the remaining parameters as they are defined in the
      program PAXACMPT.  These are: Mode, Summarize Cost,
      Expenditure Type Class, Summarize Revenue, Summarize Budgets, Budget Type,
      Summarize Commitments, and Debug Mode.

      OUT None
*/

-- CREATE OR REPLACE PROCEDURE NREL_PA_UPDATE_PROJ_SUMM
CREATE OR REPLACE PROCEDURE &procedure_name
( errbuf                 OUT VARCHAR2,
  retcode                OUT NUMBER,
  num_of_procs           IN NUMBER,
  num_in_procs           IN NUMBER,
  wait_for_completion    IN VARCHAR2 DEFAULT 'N',
  mode_for_accumulation  IN VARCHAR2 DEFAULT NULL,
  summarize_cost         IN VARCHAR2 DEFAULT 'Y',
  expenditure_type_class IN VARCHAR2 DEFAULT NULL,
  summarize_revenue      IN VARCHAR2 DEFAULT 'Y',
  summarize_budgets      IN VARCHAR2 DEFAULT 'Y',
  budget_type            IN VARCHAR2 DEFAULT NULL,
  summarize_commitments  IN VARCHAR2 DEFAULT 'Y',
  debug_mode             IN VARCHAR2 DEFAULT 'N')
IS

CURSOR proj_cur IS
  SELECT segment1
  FROM pa_projects
  ORDER BY segment1;

req_id            NUMBER;
proj_number       pa_projects.segment1%TYPE;
proj_count        NUMBER;
increment         NUMBER;
counter           NUMBER := 0;
nbr_submitted     NUMBER := 0;
first_parm        pa_projects.segment1%TYPE;
last_parm         pa_projects.segment1%TYPE;

TYPE t_request_ids IS TABLE OF NUMBER NOT NULL INDEX BY BINARY_INTEGER;
array_of_request_ids  t_request_ids;

all_done            BOOLEAN;
returned_phase      VARCHAR2(30);
returned_status     VARCHAR2(30);
returned_dev_phase  VARCHAR2(30);
returned_dev_status VARCHAR2(30);
returned_message    VARCHAR2(241);

get_problem             BOOLEAN;
get_returned_phase      VARCHAR2(30);
get_returned_status     VARCHAR2(30);
get_returned_dev_phase  VARCHAR2(30);
get_returned_dev_status VARCHAR2(30);
get_returned_message    VARCHAR2(241);

-- Local Error Buffer
errbuff           VARCHAR2(241) DEFAULT NULL;

both_param_null     EXCEPTION;
completion_abnormal EXCEPTION;
run_abnormal        EXCEPTION;

BEGIN
  errbuf := '';
  retcode := 0;

IF num_of_procs IS NULL
AND num_in_procs IS NULL
  THEN RAISE both_param_null;
END IF;

SELECT count(*)
INTO proj_count
FROM pa_projects;

IF num_of_procs IS NOT NULL
THEN
  increment := CEIL(proj_count/(num_of_procs));
ELSE
  increment := CEIL(num_in_procs);
END IF;

OPEN proj_cur;

LOOP
 FETCH proj_cur
 INTO proj_number;
 EXIT WHEN proj_cur%NOTFOUND;

counter := counter + 1;

IF counter = 1
THEN
  first_parm := proj_number;
ELSE
  IF counter = increment
  THEN
    last_parm := proj_number;

    counter := 0;

    req_id := FND_REQUEST.SUBMIT_REQUEST('PA','PAXACMPT','','',FALSE,
              first_parm,last_parm,mode_for_accumulation,
              summarize_cost,expenditure_type_class,
              summarize_revenue,summarize_budgets,budget_type,
              summarize_commitments,debug_mode,
              chr(0),'','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','',
              '','','','','','','','','','');
 

nbr_submitted := nbr_submitted + 1;

IF req_id = 0
THEN
  RAISE invalid_number;
END IF;

array_of_request_ids(req_id) := req_id;

-- Initialize the parms
    first_parm := NULL;
    last_parm := NULL;
  END IF;
END IF;

END LOOP;

IF first_parm IS NOT NULL
AND last_parm IS NULL
THEN
   req_id := FND_REQUEST.SUBMIT_REQUEST('PA','PAXACMPT','','',FALSE,
             first_parm,last_parm,mode_for_accumulation,
             summarize_cost,expenditure_type_class,
             summarize_revenue,summarize_budgets,budget_type,
             summarize_commitments,debug_mode,
             chr(0),'','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','',
             '','','','','','','','','','');

    first_parm := NULL;
    last_parm := NULL;

    nbr_submitted := nbr_submitted + 1;

  END IF;

IF req_id = 0
THEN
  RAISE invalid_number;
END IF;

array_of_request_ids(req_id) := req_id;

CLOSE proj_cur;
COMMIT;

errbuff := 'All Concurrent Programs Submitted Successfully.  ';
errbuff := errbuff||'Number Submitted: '||to_char(nbr_submitted);
errbuf := errbuff;
retcode := 0;

IF wait_for_completion = 'Y'
THEN

   req_id := NVL(array_of_request_ids.first, 0);
   WHILE req_id <> 0
   LOOP

   all_done := FND_CONCURRENT.WAIT_FOR_REQUEST(req_id,
                                               &sleep_interval,
                                               &total_time,
                                               returned_phase,
                                               returned_status,
                                               returned_dev_phase,
                                               returned_dev_status,
                                               returned_message);

   IF all_done = FALSE
     THEN RAISE run_abnormal;
   END IF;

   IF all_done = TRUE
     THEN
     get_problem := FND_CONCURRENT.GET_REQUEST_STATUS(req_id,
                                                      NULL,
                                                      NULL,
                                                      get_returned_phase,
                                                      get_returned_status,
                                                      get_returned_dev_phase,
                                                      get_returned_dev_status,
                                                      get_returned_message);
   END IF;

   IF get_returned_dev_phase != 'COMPLETED'
   AND get_returned_dev_status != 'NORMAL'
     THEN RAISE completion_abnormal;
   END IF;

   req_id := NVL(array_of_request_ids.next(req_id), 0);

   END LOOP;
END IF;

EXCEPTION

WHEN invalid_number
THEN
errbuff := 'Invalid Project Number Encountered.  ';
errbuff := errbuff||'Pertinent Info: '||first_parm||'-'||last_parm;
errbuff := errbuff||'  Number Submitted: '||to_char(nbr_submitted);
errbuf  := errbuff;
retcode := 2;

WHEN both_param_null
THEN
errbuff := 'Both Parameters are NULL  ';
errbuff := errbuff||'Must specify Number of Processes or Number in Processes. ';
errbuff := errbuff||'Number of Processes has precedence over ';
errbuff := errbuff||'Number in Processes';
errbuf := errbuff;
retcode := 2;

WHEN run_abnormal
THEN
errbuff := 'The submitted request(s) did not end successfully...  ';
errbuff := errbuff||'Returned Phase: '||returned_phase;
errbuff := errbuff||'  Returned Status: '||returned_status;
errbuff := errbuff||'  Request ID: '||to_char(req_id);
errbuff := errbuff||'  Message: '||returned_message;
errbuf := errbuff;
retcode := 2;

WHEN completion_abnormal
THEN
errbuff := 'The submitted request(s) completed with error...  ';
errbuff := errbuff||'  Returned Phase: '||get_returned_phase;
errbuff := errbuff||'  Returned Status: '||get_returned_status;
errbuff := errbuff||'  Req. ID: '||to_char(req_id);
errbuff := errbuff||'  Message: '||get_returned_message;
errbuf := errbuff;
retcode := 2;

WHEN others
THEN
errbuff := 'Following Error Encountered -- ';
errbuff := errbuff||'Oracle Error: '||to_char(SQLCODE);
errbuff := errbuff||' Oracle Message: '||SQLERRM;
errbuf := errbuff;
retcode := 2;

END;
/

Have a Oracle Question
Do you have an Oracle Question?

Oracle Books
Oracle Certification, Database Administration, SQL, Application, Programming Reference Books

Oracle Application
Oracle Application Hints and Tips

Oracle Home
Oracle Database, SQL, Application, Programming Tips

All the site contents are Copyright © www.erpgreat.com and the content authors. All rights reserved.
All product names are trademarks of their respective companies.
The site www.erpgreat.com is not affiliated with or endorsed by any company listed at this site.
Every effort is made to ensure the content integrity.  Information used on this site is at your own risk.
 The content on this site may not be reproduced or redistributed without the express written permission of
www.erpgreat.com or the content authors.