Wednesday, October 4, 2017

Script to create New Item copying existing SKU, it's attributes and all categories and also Assign it to all Inventory Organization.

Please test the script first in NON PROD instance.

DECLARE
   k                                            NUMBER;
   l_api_version                                NUMBER := 1.0;
   l_init_msg_list       VARCHAR2(2) := fnd_api.g_true;
   l_commit              VARCHAR2(2) := fnd_api.g_false;
   l_item_tbl            ego_item_pub.item_tbl_type;
   l_role_grant_tbl                             ego_item_pub.role_grant_tbl_type := ego_item_pub.g_miss_role_grant_tbl;
   x_item_tbl        ego_item_pub.item_tbl_type;
   x_message_list    error_handler.error_tbl_type;
   x_return_status                              VARCHAR2(2);
   x_msg_count                                  NUMBER := 0;

   l_user_id                                    NUMBER := -1;
   l_resp_id                                    NUMBER := -1;
   l_application_id                             NUMBER := -1;
   l_rowcnt                                     NUMBER := 1;
   l_user_name         VARCHAR2(30) := '<USER_NAME>';
   l_resp_name         VARCHAR2(30) := '<EGO_DEVELOPMENT_MANAGER>';

   CURSOR c_query_org
   IS
      SELECT organization_id FROM mtl_parameters;

   TYPE organization_id_tbl_typ IS TABLE OF NUMBER
      INDEX BY SIMPLE_INTEGER;

   organization_id_tbl       organization_id_tbl_typ;

   PROCEDURE item_assignment(p_organization_id                            IN NUMBER
                           , p_inventory_item_id                          IN NUMBER)
   IS
      p_api_version                                NUMBER;
      p_init_msg_list                              VARCHAR2(32767);
      p_commit                                     VARCHAR2(32767);
      p_item_number                                VARCHAR2(32767);
      p_organization_code                          VARCHAR2(32767);
      p_primary_uom_code                           VARCHAR2(32767);
      x_return_status                              VARCHAR2(32767);
      x_msg_count                                  NUMBER;
      l_rowcnt                                     NUMBER := 1;
      x_message_list                               error_handler.error_tbl_type;
   BEGIN
      p_api_version             := 1.0;
      p_init_msg_list           := fnd_api.g_true;
      p_commit                  := fnd_api.g_false;
      DBMS_OUTPUT.put_line( '=====================================');
      DBMS_OUTPUT.put_line( 'Calling EGO_ITEM_PUB.assign_item_to_org API');
      apps.ego_item_pub.assign_item_to_org(p_api_version
                                         , p_init_msg_list
                                         , p_commit
                                         , p_inventory_item_id
                                         , p_item_number
                                         , p_organization_id
                                         , p_organization_code
                                         , p_primary_uom_code
                                         , x_return_status
                                         , x_msg_count);
      DBMS_OUTPUT.put_line( '=====================================');
      DBMS_OUTPUT.put_line(   'Return Status: '
                           || x_return_status);

      IF (x_return_status = fnd_api.g_ret_sts_success)
      THEN
         DBMS_OUTPUT.put_line(   'Inventory Item Id :'
                              || TO_CHAR( p_inventory_item_id));
         DBMS_OUTPUT.put_line(   'Organization Id   :'
                              || TO_CHAR( p_organization_id));
      ELSE
         DBMS_OUTPUT.put_line( 'Error Messages :');
         error_handler.get_message_list( x_message_list => x_message_list);

         FOR i IN 1 .. x_message_list.COUNT
         LOOP
            DBMS_OUTPUT.put_line( x_message_list( i).MESSAGE_TEXT);
         END LOOP;
      END IF;

      COMMIT;
      DBMS_OUTPUT.put_line( '=====================================');
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line( 'Exception Occured :');
         DBMS_OUTPUT.put_line(   SQLCODE
                              || ':'
                              || SQLERRM);
         DBMS_OUTPUT.put_line( '=====================================');
         COMMIT;
   END;

   PROCEDURE process_item_cat_assignment(
             p_source_item_id           IN NUMBER
           , p_desti_item_id            IN NUMBER)
   IS
      CURSOR c1
      IS
         SELECT /*+ CARDINALITY (MSI 1)*/
               msi.organization_id
              , msi.inventory_item_id
              , mic.category_id
              , mic.category_set_id
           FROM mtl_item_categories_v mic
              , mtl_system_items_b msi
          WHERE 1 = 1
            AND msi.organization_id = mic.organization_id
            AND msi.inventory_item_id = mic.inventory_item_id
            AND msi.inventory_item_id = p_source_item_id
            AND msi.organization_id = &&&Mas_org_id;

      l_api_version                                NUMBER := 1.0;
      l_init_msg_list          VARCHAR2(2) := fnd_api.g_true;
      l_commit                 VARCHAR2(2) := fnd_api.g_false;
      l_item_tbl               ego_item_pub.item_tbl_type;
      l_role_grant_tbl                    ego_item_pub.role_grant_tbl_type := ego_item_pub.g_miss_role_grant_tbl;
      x_item_tbl           ego_item_pub.item_tbl_type;
      x_message_list       error_handler.error_tbl_type;
      x_return_status                              VARCHAR2(2);
      x_msg_data                                   VARCHAR2(2000);
      x_msg_count                                  NUMBER := 0;
      x_errorcode                                  NUMBER;
   BEGIN
      FOR z IN c1
      LOOP
         -- call API to load Items
         DBMS_OUTPUT.put_line( '=====================================');
         DBMS_OUTPUT.put_line( 'Calling EGO_ITEM_PUB.process_item_cat_assignment API');
         ego_item_pub.process_item_cat_assignment(p_api_version                             => 1.0
         , p_init_msg_list               => fnd_api.g_true
         , p_commit                      => fnd_api.g_true
         , p_category_id                 => z.category_id
         , p_category_set_id             => z.category_set_id
         , p_old_category_id             => NULL
         , p_inventory_item_id           => p_desti_item_id
         , p_organization_id             => z.organization_id
         , p_transaction_type            => 'CREATE'
         , x_return_status               => x_return_status
         , x_errorcode                   => x_errorcode
         , x_msg_count                   => x_msg_count
         , x_msg_data                    => x_msg_data);

         DBMS_OUTPUT.put_line( '=====================================');
         DBMS_OUTPUT.put_line(   'Return Status: '
                              || x_return_status);

         IF (x_return_status = fnd_api.g_ret_sts_success)
         THEN
            FOR i IN 1 .. x_item_tbl.COUNT
            LOOP
               DBMS_OUTPUT.put_line(   'Inventory Item Id :'
                                    || TO_CHAR( x_item_tbl( i).inventory_item_id));
               DBMS_OUTPUT.put_line(   'Organization Id   :'
                                    || TO_CHAR( x_item_tbl( i).organization_id));
            END LOOP;
         ELSE
            DBMS_OUTPUT.put_line( 'Error Messages :');
            error_handler.get_message_list( x_message_list => x_message_list);

            FOR i IN 1 .. x_message_list.COUNT
            LOOP
               DBMS_OUTPUT.put_line( x_message_list( i).MESSAGE_TEXT);
            END LOOP;
         END IF;
      END LOOP;

      COMMIT;
      DBMS_OUTPUT.put_line( '=====================================');
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.put_line( 'Exception Occured :');
         DBMS_OUTPUT.put_line(   SQLCODE
                              || ':'
                              || SQLERRM);
         DBMS_OUTPUT.put_line( '=====================================');
   END;
BEGIN
   -- Get the user_id
   SELECT user_id
     INTO l_user_id
     FROM fnd_user
    WHERE user_name = l_user_name;

   -- Get the application_id and responsibility_id
   SELECT application_id
        , responsibility_id
     INTO l_application_id
        , l_resp_id
     FROM fnd_responsibility
    WHERE responsibility_key = l_resp_name;

   fnd_global.apps_initialize(l_user_id
                            , l_resp_id
                            , l_application_id);
   DBMS_OUTPUT.put_line(   'Initialized applications context: '
                        || l_user_id
                        || ' '
                        || l_resp_id
                        || ' '
                        || l_application_id);

   l_item_tbl( 1).transaction_type                          := 'CREATE';
   l_item_tbl( 1).copy_inventory_item_id                    := &Item_id_to_be_Copied;
   l_item_tbl( 1).segment1                                  := &New_item_name;
   l_item_tbl( 1).description                               := &New_item_Description;
   l_item_tbl( 1).organization_id                           := 103;

   -- call API to load Items
   DBMS_OUTPUT.put_line( '=====================================');
   DBMS_OUTPUT.put_line( 'Calling EGO_ITEM_PUB.Process_Items API');
   ego_item_pub.process_items(p_api_version                             => l_api_version
                            , p_init_msg_list                           => l_init_msg_list
                            , p_commit                                  => l_commit
                            , p_item_tbl                                => l_item_tbl
                            , p_role_grant_tbl                          => l_role_grant_tbl
                            , x_item_tbl                                => x_item_tbl
                            , x_return_status                           => x_return_status
                            , x_msg_count                               => x_msg_count);

   DBMS_OUTPUT.put_line( '=====================================');
   DBMS_OUTPUT.put_line(   'Return Status: '
                        || x_return_status);

   IF (x_return_status = fnd_api.g_ret_sts_success)
   THEN
      FOR i IN 1 .. x_item_tbl.COUNT
      LOOP
         DBMS_OUTPUT.put_line(   'Inventory Item Id :'
                              || TO_CHAR( x_item_tbl( i).inventory_item_id));
         DBMS_OUTPUT.put_line(   'Organization Id   :'
                              || TO_CHAR( x_item_tbl( i).organization_id));

         process_item_cat_assignment(l_item_tbl( 1).copy_inventory_item_id
                                   , x_item_tbl( i).inventory_item_id);

         OPEN c_query_org;

         FETCH c_query_org BULK COLLECT INTO organization_id_tbl;

         CLOSE c_query_org;

         k                                                        := organization_id_tbl.FIRST;

         LOOP
            item_assignment(p_organization_id                         => organization_id_tbl( k)
                          , p_inventory_item_id                       => x_item_tbl( i).inventory_item_id);
            EXIT WHEN k = organization_id_tbl.LAST;
            k                                                        := organization_id_tbl.NEXT( k);
         END LOOP;
      END LOOP;
   ELSE
      DBMS_OUTPUT.put_line( 'Error Messages :');
      error_handler.get_message_list( x_message_list => x_message_list);

      FOR i IN 1 .. x_message_list.COUNT
      LOOP
         DBMS_OUTPUT.put_line( x_message_list( i).MESSAGE_TEXT);
      END LOOP;
   END IF;

   COMMIT;
   DBMS_OUTPUT.put_line( '=====================================');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line( 'Exception Occured :');
      DBMS_OUTPUT.put_line(   SQLCODE
                           || ':'
                           || SQLERRM);
      DBMS_OUTPUT.put_line( '=====================================');
END;

Tuesday, May 2, 2017

Script to Submit the Request Set using API in Oracle

Using below script One can submit the request set. But to execute the below script successfully define the Concurrent program for the following script and the either submit it through SRS window or using API FND_REQUEST.SUBMIT_REQUEST.


CREATE OR REPLACE PROCEDURE apps.xx_fnd_submit(errbuf                                       OUT VARCHAR2
                                                    , retcode                                      OUT VARCHAR2)
AS
   /*+==========================================================================
   | Concurrent Processing Sample Code
   |
   | FILE:
   | fnd_submit_test.pls
   |
   | REVISION:
   | $Id$
   |
   | DESCRIPTION:
   | FND_SUBMIT test procedure and sample code
   | Creates a procedure called fnd_submit_test that can be registered
   | and run as a concurrent program.
   | This procedure will use the FND_SUBMIT API to submit a request set.
   | (Function Security Reports - This request set should be seeded, if
   | it is not available the values in the script may need to be changed.)
   | The procedure will then place itself in a Paused status until the
   | request set completes.
   |
   | INSTRUCTIONS:
   |
   | 1. Install this procedure in the APPS schema.
   |
   | 2. Register the procedure as a concurrent program
   |
   |
   +==========================================================================*/
   success                                      BOOLEAN;
   req_id                                       NUMBER;
   req_data                                     VARCHAR2(10);
   srs_failed                                   EXCEPTION;
   submitprog_failed                            EXCEPTION;
   submitset_failed                             EXCEPTION;
BEGIN
   -- Use FND_FILE to output messages at each stage
   DBMS_OUTPUT.put_line( 'Starting test...');

   -- Read fnd_conc_global.request_data, if available then we have been
   -- reawakened after the request set has completed.
   -- If so, exit.
   req_data                                                 := fnd_conc_global.request_data;
   DBMS_OUTPUT.put_line(   'req_data : '
                        || req_data);

   IF (req_data IS NOT NULL)
   THEN
      errbuf                                                   := 'Done!';
      retcode                                                  := 0;
      RETURN;
   END IF;

   -- Step 1 - call set_request_set
   DBMS_OUTPUT.put_line( 'Calling set_request_set...');

   success                                                  :=
      fnd_submit.set_request_set('XX'
                               , 'XX_CRE_CONT');

   IF (NOT success)
   THEN
      RAISE srs_failed;
   END IF;


   DBMS_OUTPUT.put_line( 'Calling submit program first time...');

   -- Step 2 - call submit program for each program in the set
   success                                                  :=
      fnd_submit.submit_program('XX'
                              , 'XX_OM_CREATE_CONTRACT'
                              , 'STAGE10');

   IF (NOT success)
   THEN
      RAISE submitprog_failed;
   END IF;


   DBMS_OUTPUT.put_line( 'Calling submit program second time...');

   success                                                  :=
      fnd_submit.submit_program('OKS'
                              , 'OKSREPROC'
                              , 'OKCCONTORD'
                              , ''
                              , '');

   IF (NOT success)
   THEN
      RAISE submitprog_failed;
   END IF;

   -- Step 3 - call submit_set
   DBMS_OUTPUT.put_line( 'Calling submit_set...');

   req_id                                                   :=
      fnd_submit.submit_set(NULL
                          , TRUE);

   IF (req_id = 0)
   THEN
      RAISE submitset_failed;
   END IF;

   DBMS_OUTPUT.put_line(   'Finished. with request_id : '
                        || req_id);


   -- Set conc_status to PAUSED, set request_data to 1 and exit
   fnd_conc_global.set_req_globals(conc_status                               => 'PAUSED'
                                 , request_data                              => '1');

   errbuf                                                   :=
         'Request set submitted. id = '
      || req_id;
   retcode                                                  := 0;
   COMMIT;
EXCEPTION
   WHEN srs_failed
   THEN
      errbuf                                                   :=
            'Call to set_request_set failed: '
         || fnd_message.get;
      retcode                                                  := 2;
      DBMS_OUTPUT.put_line( errbuf);
   WHEN submitprog_failed
   THEN
      errbuf                                                   :=
            'Call to submit_program failed: '
         || fnd_message.get;
      retcode                                                  := 2;
      DBMS_OUTPUT.put_line( errbuf);
   WHEN submitset_failed
   THEN
      errbuf                                                   :=
            'Call to submit_set failed: '
         || fnd_message.get;
      retcode                                                  := 2;
      DBMS_OUTPUT.put_line( errbuf);
   WHEN OTHERS
   THEN
      errbuf                                                   :=
            'Request set submission failed - unknown error: '
         || SQLERRM;
      retcode                                                  := 2;
      DBMS_OUTPUT.put_line( errbuf);
END;
/

Friday, April 28, 2017

How to Pass Parameters from One Program to the Next Program in a Request Set

How to Pass Parameters from One Program to the Next Program in a Request Set (Doc ID 239808.1)




APPLIES TO:

Oracle Application Object Library - Version 11.5.10.2 to 12.1.3 [Release 11.5 to 12.1]
Information in this document applies to any platform.


GOAL

 How to pass parameters from one program to the next program in a request set

SOLUTION

1. Query up your request set.
2. Select the 'Define Stages' button.
3. Select 'Requests' button for the stage.
4. Select 'Parameters' button for the report.
5. Enter a short name for the 'Shared Parameter' field.
5. Select the name for the parameter to be shared in the other reports in the request set.

For an example to see how this is done, query up the seeded report set: Function Security Reports


Thursday, November 10, 2016

Public API's Needed For Performing ISupplier Portal Actions From Concurrent Program.

REM Doc ID 2193130.1

1. As soon as the change request is submitted, row level validations are done in controller, AMImpl .
Once the validation is successful, change request records are stored in array. Then, it will be passed to PO_CHG_REQUEST_PVT.PROCESS_SUPPLIER_REQUEST.
2. The above API will have some validations and then finally saves the data in po_change_requests table by calling save_request.
3. Finally, POSCHORD workflow will be called . (Main Process).
4. Check for the change details, Notify Requester/Planner if required, then check whether change is within tolerance or not.
Based on the same and few other criteria, check whether Requester approval is required or not.
5. Later, Sends notification to buyer for approval. You can clearly find all the API details in Workflow.
6. Even after buyer accepts the change, the details can be found in workflow - PO_SUP_CHG_REQUEST_WF_GRP.PROCESS_RESPONSE.

Brief details about response flow.

-> PO_ChangeOrderWF_PVT.ProcessResponse
-> PO_CHANGE_RESPONSE_PVT.MoveChangeToPO
-> UPDATE PO_HEADERS_ALL to APPROVED.
-> PO_DOCUMENT_UPDATE_GRP.update_document
-> UPDATE po_change_requests with line_location_id for split shipment
-> PO_DOCUMENT_UPDATE_GRP.launch_po_approval_wf

How to use Change PO API group package PO_DOCUMENT_UPDATE_GRP to make multiple changes to PO at once

REM Refer to metalink Doc ID 1406047.1 for more details
REM Note:  This API supports only set of attributes at 
REM line/shipment/distribution level as listed above with 
REM Approval option.
REM Any other PO attributes  in Type PO_CHANGES_REC_TYPE then listed REM above are  reserved for Internal References/Usage and not
REM supported via this API.
REM 1. PO_CHANGES_REC_TYPE:
REM This object represents header of PO. It can be created by supplying header_id of a PO.
REM e.g.
REM l_header PO_CHANGES_REC_TYPE;
REM l_header.create_object(p_po-header_id => <po_header_id>, p_po_release_id => <release_id>);

REM In case of a PO, release_id should be supplied and release_id will be null. Release_id is used while creating object of release header.

REM Optional parameters to create object are:
REM 1. p_line_changes (PO_LINES_REC_TYPE)
REM 2. p_shipment_changes(PO_SHIPMENTS_REC_TYPE)
REM 3. p_distribution_changes (PO_DISTRIBUTIONS_REC_TYPE)

REM These parameters are the objects of line, shipment and distribution respectively.

REM 2. PO_LINES_REC_TYPE:

REM This object represents line in a PO. It can be created using line_id of a line.

REM e.g.
REM l_line PO_LINES_REC_TYPE;
REM l_line.create_object(p_po_line_id => <line_id>);

REM create_object method takes following optional parameters which represent change in line.

REM 1. Unit price
REM 2. Vendor product number
REM 3. Quantity
REM 4. Start Date
REM 5. Expiration date
REM 6. Amount
REM 7. Unit of measure
REM 8. Secondary Quantity
REM 9. Secondary UOM

REM 3. PO_SHIPMENTS_REC_TYPE:

REM This object represents shipment in a PO. It can be created using line_location_id of a line.

REM e.g.
REM l_ship PO_SHIPMENTS_REC_TYPE;
REM l_ship.create_object(p_po_line_location_id => <line_location_id>);

REM create_object method takes following optional parameters which represent change in line.

REM 1. Quantity
REM 2. promised date
REM 3. Price override
REM 4. Parent line location id -- To copy data from other existing shipment.
REM 5. Need by date
REM 6. Ship to location id
REM 7. Sales order update date
REM 8. Amount
REM 9. Unit of measure
REM 10. Secondary quantity
REM 11. Secondary UOM

REM 4. PO_DISTRIBUTIONS_REC_TYPE:

REM This object represents distribution in a PO. It can be created using distribution_id of a line.

REM e.g.
REM l_dist PO_DISTRIBUTIONS_REC_TYPE;
REM l_dist.create_object(p_po_distribution_id => <distribution_id>);

REM create_object method takes following optional parameters which represent change in line.

REM 1. Quantity ordered
REM 2. Parent distribution id
REM 3. Amount ordered

REM 4. Unit of measure

REM Simple Update 

DECLARE
   l_result                  NUMBER;
   l_progress                NUMBER;
   l_errors                  po_api_errors_rec_type;
   l_chg                     po_changes_rec_type;
   l_shipment_changes        po_shipments_rec_type;
   l_return_status           VARCHAR2(30);
BEGIN
   --to set org context in a R12 env
   mo_global.set_policy_context('S'
                              , &org_id);

   -- Create an Object for Changes
   -- po_changes_rec_type constructor takes either po_header_id OR      --- po_release_id to construct the object. In case of purchase 
   ---order pass po_release_id as NULL.

   l_chg                                                    :=
      po_changes_rec_type.create_object(
                           p_po_header_id  => &header_id
                         , p_po_release_id => &release_id);

   -- Add a Line Changes to the Change Object
   l_chg.line_changes.add_change(
                           p_po_line_id      => &po_line_id
                         , p_quantity        => &value);

   -- Add Shipment Changes to the Change Object
   l_chg.shipment_changes.add_change(
                   p_po_line_location_id => &line_location_id
                 , p_quantity         => &value);

   -- Add Distribution Level Changes
   l_chg.distribution_changes.add_change(
    p_po_distribution_id    => &po_distribution_id
  , p_quantity_ordered      => &value);

   -- Now call the change api to execute the above changes
   po_document_update_grp.update_document(
      p_api_version    => 1.0 -- pass this as 1.0
    , p_init_msg_list  => fnd_api.g_true -- pass this as TRUE
    , x_return_status  => l_return_status -- returns the result of 
 ---execution
    , p_changes        => l_chg -- changes obj. contains all changes    --- intended to be made on document
    , p_run_submission_checks  => fnd_api.g_false -- set to TRUE if --- want to perform submission check
    , p_launch_approvals_flag  => fnd_api.g_fals
-- set to TRUE if want to launch approval work flow after making the --changes
    , p_buyer_id       => NULL -- buyer id
    , p_update_source  => NULL -- name of a source who is calling     --- this API. In case of manual call can be passed as NULL
    , p_override_date  => NULL
    , x_api_errors     => l_errors -- list of errors if any occurred -- in execution
    , p_mass_update_releases   => NULL);

   IF l_errors IS NOT NULL
   THEN
      FOR i IN 1 .. l_errors.MESSAGE_TEXT.COUNT
      LOOP
         DBMS_OUTPUT.put_line(   ' Error is '
                              || l_errors.MESSAGE_TEXT( i)
                              || ' - name'
                              || l_errors.message_name( i));
      END LOOP;
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line(   'error :'
                           || SQLERRM);
END;


REM Update and Approve 
DECLARE
   l_result                                     NUMBER;
   l_progress                                   NUMBER;
   l_errors              po_api_errors_rec_type;
   l_chg                 po_changes_rec_type;
   l_shipment_changes    po_shipments_rec_type;
   l_return_status       VARCHAR2(30);
BEGIN
   fnd_global.apps_initialize(user_id                                   => &user_id
                            , -- This function execution is required before launching the approval work flow.
                             resp_id                                    => &responsibility_id
                            , resp_appl_id                              => &resp_application_id);

   --to set org context in a R12 env
   mo_global.set_policy_context('S'
                              , &org_id);

   -- Create an Object for Changes
   -- po_changes_rec_type constructor takes either po_header_id OR      -- po_release_id to construct the object.
   -- In case of purchase order pass po_release_id as NULL.

   l_chg                                                    :=
      po_changes_rec_type.create_object(
    p_po_header_id            => &header_id
  , p_po_release_id           => &release_id);

   -- Add a Line Changes to the Change Object
   l_chg.line_changes.add_change(
      p_po_line_id   => &po_line_id
    , p_quantity     => &value);

   -- Add Shipment Changes to the Change Object
   l_chg.shipment_changes.add_change(
    p_po_line_location_id    => &line_location_id
  , p_quantity               => &value);

   -- Add Distribution Level Changes
   l_chg.distribution_changes.add_change(
       p_po_distribution_id    => &po_distribution_id
     , p_quantity_ordered      => &value);

   -- Now call the change api to execute the above changes
   po_document_update_grp.update_document(
  p_api_version    => 1.0 -- pass this as 1.0
p_init_msg_list  => fnd_api.g_true -- pass this as TRUE
x_return_status  => l_return_status -- returns the result of 
  --- execution
p_changes        => l_chg -- changes obj. contains all changes 
  ---intended to be made on document
p_run_submission_checks => fnd_api.g_false  -- set to TRUE if want --- to perform submission check
, p_launch_approvals_flag  => fnd_api.g_true -- set to TRUE if want   ---to launch approval work flow after making the changes
, p_buyer_id               => NULL -- buyer id
p_update_source          => NULL -- name of a source who is 
  ---calling this API. In case of manual call can be passed as NULL
, p_override_date          => NULL
, x_api_errors             => l_errors -- list of errors if any 
   --- occurred in execution
, p_mass_update_releases   => NULL);


   IF l_errors IS NOT NULL
   THEN
      FOR i IN 1 .. l_errors.MESSAGE_TEXT.COUNT
      LOOP
         DBMS_OUTPUT.put_line(   ' Error is '
                              || l_errors.MESSAGE_TEXT( i)
                              || ' - name'
                              || l_errors.message_name( i));
      END LOOP;
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line(   'error :'
                           || SQLERRM);
END;