Sunday, 27 October 2013

Physical Inventory Tag interface Program

 
Business Requirement:
 
User want to update the bulk of lines in physical tag counts and physical adjustment as well. The below interface is used to satisfy the both conditions with validation.
 

step :1
--------
-- Create staging table for upload the csv file

CREATE TABLE APPS.XXHMI_PHYSICAL_COUNT_DATA
(
  PHYSICAL_INVENTORY_NAME  VARCHAR2(30 BYTE),
  TAG_NUMBER               VARCHAR2(40 BYTE),
  OPERATING_UNIT           VARCHAR2(40 BYTE),
  ITEM_NAME                VARCHAR2(150 BYTE),
  SUBINVENTORY_NAME        VARCHAR2(10 BYTE),
  LOCATOR_NAME             VARCHAR2(122 BYTE),
  PARENT_LPN               VARCHAR2(30 BYTE),
  TAG_QUANTITY             NUMBER,
  TAG_UOM                  VARCHAR2(3 BYTE),
  EMPLOYEE_NUMBER          VARCHAR2(30 BYTE),
  PROCESS_FLAG             VARCHAR2(1 BYTE),
  REMARKS                  VARCHAR2(100 BYTE)
)


Step 2:
Register the loader concurrent with the following shortname XXHMI_PHY_CNT_TAG in to oracle apps.

Parameter : File name

CTL file:
-------------

options (skip=1)

load data

TRUNCATE

INTO TABLE XXHMI_PHYSICAL_COUNT_DATA

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

TRAILING NULLCOLS(

Physical_Inventory_Name,

TAG_NUMBER,

Operating_unit,

item_name,

subinventory_name,

locator_name,

PARENT_LPN,

TAG_quantity,

TAG_UOM,

employee_number,

process_flag CONSTANT 'N',

remarks)

Step 3: Register the below package in oracle apps

Executable Name : XXHMI_PHYSICAL_COUNT_TAGS.main
Parameter : filename


CREATE OR REPLACE PACKAGE BODY APPS.XXHMI_PHYSICAL_COUNT_TAGS
IS
   /*******************************************************************************
   *                                                                              *
   *  Project      : HLIFE                                                        *
   *  Module       : INV                                                          *
   *  Table Name   : XXHMI_PHYSICAL_COUNT_DATA                                    *
   *  Description  : Upload Physical Tag Data                                     *
   *                                                                              *
   *                                                                              *
   *                                                                              *
   *                                                                              *
   ********************************************************************************
   *  Program History                                                             *
   *                                                                              *
   *  Date        In Charge      Description                                      *
   *  ----------  ---------      -----------------------------------------------  *
   *  15-dec-2011 Vinoth kumar For Physical Tag data upload                     *
   *******************************************************************************/
   PROCEDURE main (errbuf           OUT VARCHAR2,
                   retcode          OUT NUMBER,
                   p_file_name   IN     VARCHAR2)
   IS
      l_retcode   NUMBER;
      l_errbuff   VARCHAR2 (4000);
   BEGIN
      fnd_global.apps_initialize (fnd_profile.VALUE ('USER_ID'),
                                  fnd_profile.VALUE ('RESP_ID'),
                                  fnd_profile.VALUE ('RESP_APPL_ID'),
                                  NULL,
                                  NULL);
      load_file_data (errbuf        => l_errbuff,
                      retcode       => l_retcode,
                      p_file_name   => p_file_name);
      IF l_retcode = 0
      THEN
         BEGIN
            update_data_interface (errbuf => l_errbuff, retcode => l_retcode);
         END;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         errbuf := 'ERROR IN MAIN PROCEDURE' || SQLERRM || SQLCODE;
         retcode := 2;
         fnd_file.put_line (fnd_file.output, 'Check outfile');
         COMMIT;
   END;
   PROCEDURE load_file_data (errbuf           OUT VARCHAR2,
                             retcode          OUT NUMBER,
                             p_file_name   IN     VARCHAR2)
   IS
      l_request_id        fnd_concurrent_requests.request_id%TYPE;
      l_status_code       fnd_concurrent_requests.status_code%TYPE := '~';
      lb_wait             BOOLEAN;
      lc_phase            VARCHAR2 (100);
      lc_status           VARCHAR2 (30);
      lc_devpha           VARCHAR2 (100);
      lc_devsta           VARCHAR2 (100);
      lc_mesg             VARCHAR2 (50);
      ln_data_discarded   NUMBER;
      l_in_file_path      VARCHAR2 (2000);
   BEGIN
      /*BEGIN
         DELETE FROM xxhmi_subinventory_xl xxhmi;
         COMMIT;
      END;*/
      BEGIN
         retcode := 0;
         SELECT   '/usr/tmp' --DESCRIPTION -- UTL directory for reading the CSV file
           INTO   l_in_file_path
           FROM   DUAL;
         IF l_in_file_path IS NULL
         THEN
            fnd_file.put_line (
               fnd_file.LOG,
               'Path is not defined for reading in Lookup type HMI_INBOUND_IFACE_FILE_PATH'
            );
            retcode := 2;
            RETURN;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            fnd_file.put_line (
               fnd_file.LOG,
               'Issue is uploading the excel data' || SQLCODE || SQLERRM
            );
            retcode := 2;
            RETURN;
      END;
      fnd_global.apps_initialize (fnd_profile.VALUE ('USER_ID'),
                                  fnd_profile.VALUE ('RESP_ID'),
                                  fnd_profile.VALUE ('RESP_APPL_ID'),
                                  NULL,
                                  NULL);
      l_request_id :=
         fnd_request.submit_request ('XXHMI',        --'XXHN', -- APPLICATION.
                                     'XXHMI_PHY_CNT_TAG', -- Loader short name
                                     -- CONCURRENT PROGRAM.
                                     NULL,                     -- DESCRIPTION.
                                     NULL,                      -- START_TIME.
                                     FALSE,                    -- SUB_REQUEST.
                                     l_in_file_path || '/' || p_file_name,
                                     CHR (0));
      COMMIT;
      IF (l_request_id = 0)
      THEN
         retcode := 2;
         fnd_file.put_line (fnd_file.LOG,
                            'Failed to submit the loader program');
      ELSE
         lb_wait :=
            fnd_concurrent.wait_for_request (request_id   => l_request_id,
                                             INTERVAL     => 2,
                                             phase        => lc_phase,
                                             status       => lc_status,
                                             dev_phase    => lc_devpha,
                                             dev_status   => lc_devsta,
                                             MESSAGE      => lc_mesg);
         IF lc_status IN ('Error')
         THEN
            retcode := 2;
            fnd_file.put_line (
               fnd_file.LOG,
               'Error while reading data from file check request id '
               || l_request_id
            );
         ELSIF lc_status IN ('Warning')
         THEN
            SELECT   fcr.ofile_size
              INTO   ln_data_discarded
              FROM   fnd_concurrent_requests fcr
             WHERE   fcr.request_id = l_request_id;
            IF ln_data_discarded IS NOT NULL
            THEN
               retcode := 2;
            END IF;
         ELSE
            retcode := 0;
            fnd_file.put_line (
               fnd_file.LOG,
               'File read sucessfully check request id ' || l_request_id
            );
         END IF;
      END IF;
   /* IF retcode = 0
    THEN
       BEGIN
          trim_data;
       END;
    END IF;*/
   EXCEPTION
      WHEN OTHERS
      THEN
         fnd_file.put_line (fnd_file.LOG,
                            'Error From Main' || SQLCODE || SQLERRM);
         retcode := 2;
   END load_file_data;
   PROCEDURE update_data_interface (errbuf OUT VARCHAR2, retcode OUT NUMBER)
   IS
      CURSOR c_validate
      IS
         SELECT   * FROM XXHMI_PHYSICAL_COUNT_DATA;
      CURSOR c_err
      IS
         SELECT   *
           FROM   xxhmi_physical_count_data
          WHERE   PROCESS_FLAG <> 'Y';

      --cursor c_process is select * from XXHMI_PHYSICAL_COUNT_DATA where process_flag='N'
      v_phy_inv_id       NUMBER;
      v_operating_unit   NUMBER;
      v_item_id          NUMBER;
      v_locator_id       NUMBER;
      v_emp_id           NUMBER;
      v_adjust_id        NUMBER;
      v_count            NUMBER;
      v_count1           NUMBER;
      v_lpn_id           NUMBER;
      v_remarks          VARCHAR2 (250);
      v_item_cost        NUMBER;
      v_cost_id          NUMBER;
   BEGIN
      --   retcode := 0;
      FOR i IN c_validate
      LOOP
         v_remarks := NULL;
         v_lpn_id := NULL;
         BEGIN
            SELECT   PHYSICAL_INVENTORY_ID
              INTO   v_phy_inv_id
              FROM   mtl_physical_inventories
             WHERE   PHYSICAL_INVENTORY_NAME = i.PHYSICAL_INVENTORY_NAME
                     AND organization_id IN
                              (SELECT   organization_id
                                 FROM   hr_operating_units
                                WHERE   name = i.operating_unit);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid Physical Inventory';
         END;
         BEGIN
            SELECT   COUNT ( * )
              INTO   v_count1
              FROM   mtl_physical_inventory_tags
             WHERE   TAG_NUMBER = i.TAG_NUMBER
                     AND PHYSICAL_INVENTORY_ID IN
                              (SELECT   PHYSICAL_INVENTORY_ID
                                 FROM   mtl_physical_inventories
                                WHERE   PHYSICAL_INVENTORY_NAME =
                                           i.PHYSICAL_INVENTORY_NAME
                                        AND organization_id IN
                                                 (SELECT   organization_id
                                                    FROM   hr_operating_units
                                                   WHERE   name =
                                                              i.operating_unit));
            IF v_count1 = 0
            THEN
               v_remarks := v_remarks || 'Invalid Tag Number';
            END IF;
         END;

         BEGIN
            SELECT   organization_id
              INTO   v_operating_unit
              FROM   hr_operating_units
             WHERE   NAME = i.operating_unit;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid operating unit';
         END;

         BEGIN
            SELECT   COUNT ( * )
              INTO   v_count
              FROM   mtl_item_locations_kfv
             WHERE   SUBINVENTORY_CODE = i.SUBINVENTORY_NAME;
            IF v_count = 0
            THEN
               v_remarks := v_remarks || 'Invalid subinventory';
            END IF;
         END;

         BEGIN
            SELECT   DISTINCT INVENTORY_ITEM_ID
              INTO   v_item_id
              FROM   mtl_system_items_b
             WHERE   segment1 = i.ITEM_NAME;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid item_name';
         END;
         DBMS_OUTPUT.put_line ('hi v1');
         BEGIN
            SELECT   ITEM_COST
              INTO   v_item_cost
              FROM   cst_item_costs
             WHERE   inventory_item_id = v_item_id
                     AND organization_id = v_operating_unit;
            DBMS_OUTPUT.put_line ('hi v2');
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid item cost';
         END;
         --      BEGIN
         --         DBMS_OUTPUT.put_line ('hi vcost');
         --         SELECT   DISTINCT NVL (cost_group_id, NULL)
         --           INTO   v_cost_id
         --           FROM   MTL_ONHAND_QUANTITIES_DETAIL
         --          WHERE       1 = 1
         --                  AND inventory_item_id = v_item_id                    --12200
         --                  AND organization_id = v_operating_unit                  --81
         --                  AND SUBINVENTORY_CODE = i.subinventory_name;
         --         DBMS_OUTPUT.put_line ('hi v3');
         --      EXCEPTION
         --         WHEN NO_DATA_FOUND
         --         THEN
         --            v_remarks :=
         --                  v_remarks
         --               || 'Cost group not available'
         --               || SQLERRM
         --               || v_cost_id;
         --      END;
         BEGIN
            SELECT   INVENTORY_LOCATION_ID
              INTO   v_locator_id
              FROM   MTL_ITEM_LOCATIONS_kfv
             WHERE   CONCATENATED_SEGMENTS = LTRIM (RTRIM (i.LOCATOR_NAME))
                     AND organization_id IN
                              (SELECT   organization_id
                                 FROM   hr_operating_units
                                WHERE   name = i.operating_unit);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid Locator name';
         END;
         DBMS_OUTPUT.put_line ('hi v4');
         BEGIN
            SELECT   user_id
              INTO   v_emp_id
              FROM   fnd_user
             WHERE   user_name = i.employee_number;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_remarks := v_remarks || 'Invalid employee number';
         END;
         IF i.PARENT_LPN IS NOT NULL
         THEN
            BEGIN
               SELECT   LPN_ID
                 INTO   v_lpn_id
                 FROM   wms_license_plate_numbers
                WHERE   license_plate_number = i.PARENT_LPN;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  v_remarks := v_remarks || 'Invalid LPN';
            END;
         END IF;

         IF v_remarks IS NULL AND i.PROCESS_FLAG <> 'Y'
         --or PROCESS_FLAG ='N')
         THEN
            SELECT   MTL_PHYSICAL_ADJUSTMENTS_S.NEXTVAL
              INTO   v_adjust_id
              FROM   DUAL;

            v_remarks := 'Success';
            UPDATE   mtl_physical_inventory_tags
               SET   LAST_UPDATE_DATE = SYSDATE,
                     ADJUSTMENT_ID = v_adjust_id,
                     INVENTORY_ITEM_ID = v_item_id,
                     TAG_QUANTITY = i.TAG_QUANTITY,
                     TAG_UOM = i.TAG_UOM,
                     TAG_QUANTITY_AT_STANDARD_UOM = i.TAG_QUANTITY,
                     STANDARD_UOM = i.TAG_UOM,
                     SUBINVENTORY = i.SUBINVENTORY_NAME,
                     LOCATOR_ID = v_locator_id,
                     COUNTED_BY_EMPLOYEE_ID = v_emp_id,
                     PARENT_LPN_ID = v_lpn_id,
                     OUTERMOST_LPN_ID = v_lpn_id,
                     LAST_UPDATED_BY = v_emp_id,
                     LAST_UPDATE_LOGIN = v_emp_id,
                     CREATED_BY = v_emp_id
             --,
             --                  COST_GROUP_ID = NVL (v_cost_id, NULL)
             WHERE       PHYSICAL_INVENTORY_ID = v_phy_inv_id
                     AND ORGANIZATION_ID = v_operating_unit
                     AND TAG_NUMBER = i.TAG_NUMBER;
            --         IF process_flag = 'N'
            --         THEN
            INSERT INTO MTL_PHYSICAL_ADJUSTMENTS (ADJUSTMENT_ID,
                                                  ORGANIZATION_ID,
                                                  PHYSICAL_INVENTORY_ID,
                                                  INVENTORY_ITEM_ID,
                                                  SUBINVENTORY_NAME,
                                                  SYSTEM_QUANTITY,
                                                  LAST_UPDATE_DATE,
                                                  LAST_UPDATED_BY,
                                                  CREATION_DATE,
                                                  CREATED_BY,
                                                  LAST_UPDATE_LOGIN,
                                                  COUNT_QUANTITY,
                                                  ADJUSTMENT_QUANTITY,
                                                  REVISION,
                                                  LOCATOR_ID,
                                                  PARENT_LPN_ID,
                                                  OUTERMOST_LPN_ID,
                                                  --                                               COST_GROUP_ID,
                                                  LOT_NUMBER,
                                                  LOT_EXPIRATION_DATE,
                                                  SERIAL_NUMBER,
                                                  ACTUAL_COST,
                                                  SECONDARY_SYSTEM_QTY,
                                                  SECONDARY_COUNT_QTY,
                                                  SECONDARY_ADJUSTMENT_QTY)
              VALUES   (v_adjust_id,
                        v_operating_unit,
                        v_phy_inv_id,
                        v_item_id,
                        i.SUBINVENTORY_NAME,
                        0,
                        SYSDATE,
                        v_emp_id,
                        SYSDATE,
                        v_emp_id,
                        v_emp_id,
                        i.TAG_QUANTITY,
                        i.tag_quantity,
                        NULL,
                        v_locator_id,
                        v_lpn_id,
                        v_lpn_id,
                        --                     NVL (v_cost_id, NULL),
                        NULL,
                        NULL,
                        NULL,
                        v_item_cost,
                        NULL,
                        NULL,
                        NULL);
            --         END IF;

            UPDATE   XXHMI_PHYSICAL_COUNT_DATA
               SET   Process_flag = 'Y', remarks = 'Success'
             WHERE       PHYSICAL_INVENTORY_NAME = i.PHYSICAL_INVENTORY_NAME
                     AND TAG_NUMBER = i.TAG_NUMBER
                     AND OPERATING_UNIT = i.OPERATING_UNIT;
            COMMIT;
         ELSE
            UPDATE   XXHMI_PHYSICAL_COUNT_DATA
               SET   Process_flag = 'E', remarks = v_remarks
             WHERE       PHYSICAL_INVENTORY_NAME = i.PHYSICAL_INVENTORY_NAME
                     AND TAG_NUMBER = i.TAG_NUMBER
                     AND OPERATING_UNIT = i.OPERATING_UNIT;
            COMMIT;
         END IF;
         fnd_file.put_line (
            fnd_file.LOG,
               i.PHYSICAL_INVENTORY_NAME
            || '-'
            || i.TAG_NUMBER
            || '-'
            || v_remarks
         );
      END LOOP;
      BEGIN
         fnd_file.put_line (
            fnd_file.output,
               'PHYSICAL_INVENTORY_NAME'
            || '|'
            || 'TAG_NUMBER'
            || '|'
            || 'OPERATING_UNIT'
            || '|'
            || 'ITEM_NAME'
            || '|'
            || 'SUBINVENTORY_NAME'
            || '|'
            || 'LOCATOR_NAME'
            || '|'
            || 'PARENT_LPN'
            || '|'
            || 'TAG_QUANTITY'
            || '|'
            || 'TAG_UOM'
            || '|'
            || 'EMPLOYEE_NUMBER'
            || '|'
            || 'PROCESS_FLAG'
            || '|'
            || 'REMARKS'
         );
         FOR j IN c_err
         LOOP
            fnd_file.put_line (
               fnd_file.output,
                  J.PHYSICAL_INVENTORY_NAME
               || '|'
               || J.TAG_NUMBER
               || '|'
               || J.OPERATING_UNIT
               || '|'
               || J.ITEM_NAME
               || '|'
               || J.SUBINVENTORY_NAME
               || '|'
               || J.LOCATOR_NAME
               || '|'
               || J.PARENT_LPN
               || '|'
               || J.TAG_QUANTITY
               || '|'
               || J.TAG_UOM
               || '|'
               || J.EMPLOYEE_NUMBER
               || '|'
               || J.PROCESS_FLAG
               || '|'
               || J.REMARKS
            );
         END LOOP;
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         fnd_file.put_line (fnd_file.LOG,
                            'update_data_interface' || SQLCODE || SQLERRM);
         DBMS_OUTPUT.put_line ('update_data_interface' || SQLCODE || SQLERRM);
         --      retcode := 2;
         RETURN;
   END update_data_interface;
END XXHMI_PHYSICAL_COUNT_TAGS;
/

Step :4

Once register the concurrent then prepare the csv file and move to the utl dir (/USR/TMP/)

Step :5 
Run the main program with the parameter of your file name with extension

Eg: Sample.csv

** note case senstive

Step :6 check the data in the front end


***************************END***********************
 

Monday, 13 May 2013

Query to find rcv shipment lines not yet deliver ( Pending For Binning)

 SELECT   msi.segment1 part_num,
           poh.segment1 po_num,
           pra.release_num,
           TRUNC (poh.creation_date) po_date,
           TRUNC (PRA.APPROVED_DATE) Release_Approved_Date,
           SUM (quantity) Quantity,
           (SELECT   shipment_num
              FROM   rcv_shipment_headers
             WHERE   shipment_header_id = rs.shipment_header_id)
              shipment_num
    FROM   rcv_supply rs,
           mtl_system_items_b msi,
           po_headers_all poh,
           po_releases_all pra
   WHERE       to_organization_id = :p_org_id --171
           AND rs.item_id = msi.inventory_item_id
           AND rs.to_organization_id = msi.organization_id
           AND rs.PO_HEADER_ID = poh.PO_HEADER_ID
           AND rs.po_release_id = pra.po_release_id
           AND poh.po_header_id = pra.po_header_id
--and             substr(quantity,1,1) = '-' 
GROUP BY   msi.segment1,
           poh.segment1,
           pra.release_num,
           rs.shipment_header_id,
           PRA.APPROVED_DATE,
           poh.creation_date
          

Query to find pending for Receiving quantity against the PO and Release NO

/* Pending for Receiving Details */

SELECT   HOU.NAME ORG_NAME,
         pra.AUTHORIZATION_STATUS,
         PHA.SEGMENT1 PO_NUMBER,
         PRA.RELEASE_NUM,
         PLA.LINE_NUM,
         MSIB.SEGMENT1 PARTNO,
         MSIB.DESCRIPTION PARTDESC,
         PV.SEGMENT1 VENDOR_NUMBER,
         PV.VENDOR_NAME,
         PLLA.QUANTITY ORDer_QTY,
         PRA.APPROVED_DATE,
         TRUNC (pra.creation_date) APPROVED_DATE,
         ( (PLLA.QUANTITY - PLLA.QUANTITY_RECEIVED) - PLLA.QUANTITY_CANCELLED)
            PENDINGORDQTY,
         (SELECT   SUM (NVL (rsl.quantity_shipped, 0))
            FROM   RCV_SHIPMENT_LINES RSL, PO_LINE_LOCATIONS_ALL PLSA      --,
           WHERE       RSL.po_line_location_id = PLSA.line_location_id
                   AND PLSA.SHIPMENT_NUM = PLLA.SHIPMENT_NUM
                   AND rsl.PO_RELEASE_ID = plla.PO_RELEASE_ID)
            SHIPPED_QUANTITY,
         PLLA.QUANTITY_RECEIVED,
         PLLA.NEED_BY_DATE                                                 --,
  FROM   PO_HEADERS_ALL PHA,
         PO_LINES_ALL PLA,
         HR_OPERATING_UNITS HOU,
         PO_LINE_LOCATIONS_ALL PLLA,
         PO_RELEASES_ALL PRA,
         PO_VENDORS PV,
         MTL_SYSTEM_ITEMS_B MSIB
 WHERE                                           ------PHA.SEGMENT1 = '101358'
             ------AND PRA.RELEASE_NUM = 5
             PHA.PO_HEADER_ID = PLA.PO_HEADER_ID
         AND PLLA.PO_HEADER_ID = PHA.PO_HEADER_ID
         AND PLLA.PO_LINE_ID = PLA.PO_LINE_ID
         AND PLA.ORG_ID = HOU.ORGANIZATION_ID
         AND PRA.PO_RELEASE_ID = PLLA.PO_RELEASE_ID
         AND PHA.VENDOR_ID = PV.VENDOR_ID
         AND MSIB.INVENTORY_ITEM_ID = PLA.ITEM_ID
         AND MSIB.ORGANIZATION_ID = PLLA.SHIP_TO_ORGANIZATION_ID
         AND PLA.ORG_ID = NVL (:P_ORG_ID, PLA.ORG_ID)
         AND PV.VENDOR_ID = NVL (:P_VENDOR, PV.VENDOR_ID)
         AND MSIB.INVENTORY_ITEM_ID = NVL (:P_ITEM, MSIB.INVENTORY_ITEM_ID)
         AND ( (PLLA.QUANTITY - PLLA.QUANTITY_RECEIVED)
              - PLLA.QUANTITY_CANCELLED) > 0

Procedure to Cancel the PO Release Lines


/*   Procedure to Cancel the PO LINES */
CREATE OR REPLACE PROCEDURE APPS.XX_PO_CANCEL_PRG (
   ERRBUF                 OUT VARCHAR2,
   RETCODE                OUT NUMBER,
   P_ORG               IN     NUMBER,
   P_P0_HEADER_ID      IN     NUMBER,
   P_VENDER_ID         IN     NUMBER,
   P_RELEASE_NUMBER    IN     NUMBER,
   P_ITEM_ID           IN     NUMBER,
   P_SHIPMENT_NUMBER   IN     NUMBER
)
IS
   CURSOR C_PO_CANCEL
   IS
      SELECT   PHA.TYPE_LOOKUP_CODE,
               PHA.PO_HEADER_ID,
               PLA.PO_LINE_ID,
               PLA.LINE_NUM,
               PRA.RELEASE_NUM,
               PRA.PO_RELEASE_ID,
               PLLA.LINE_LOCATION_ID,
               PLLA.SHIPMENT_NUM,
               PLA.ITEM_ID,
               PLA.ITEM_DESCRIPTION,
               PHA.SEGMENT1 PO_NUMBER,
               PHA.ORG_ID,
               PRA.AUTHORIZATION_STATUS,
               NVL (PLLA.QUANTITY, 0) ORDER_QTY,
               NVL (PLLA.QUANTITY_RECEIVED, 0) QTY_REC,
               PHA.VENDOR_ID,
               VENDOR_TYPE_LOOKUP_CODE
        FROM   PO_HEADERS_ALL PHA,
               PO_LINES_ALL PLA,
               PO_LINE_LOCATIONS_ALL PLLA,
               PO_RELEASES_ALL PRA,
               AP_SUPPLIERS AP
       WHERE       1 = 1
               AND PHA.PO_HEADER_ID = PLA.PO_HEADER_ID
               AND PHA.ORG_ID = PRA.ORG_ID
               AND PHA.PO_HEADER_ID = NVL (P_P0_HEADER_ID, PHA.PO_HEADER_ID)
               AND PHA.VENDOR_ID = NVL (P_VENDER_ID, PHA.VENDOR_ID)
               AND PHA.VENDOR_ID = AP.VENDOR_ID
               AND PRA.RELEASE_NUM = NVL (P_RELEASE_NUMBER, PRA.RELEASE_NUM)
               AND PHA.TYPE_LOOKUP_CODE = 'BLANKET'
               AND PRA.PO_RELEASE_ID = PLLA.PO_RELEASE_ID
               AND PLLA.PO_LINE_ID = PLA.PO_LINE_ID
               AND PLA.ITEM_ID = NVL (P_ITEM_ID, PLA.ITEM_ID)
               AND PLLA.SHIPMENT_NUM =
                     NVL (P_SHIPMENT_NUMBER, PLLA.SHIPMENT_NUM)
               AND PHA.ORG_ID = NVL (P_ORG, PHA.ORG_ID)
               AND PLLA.CANCEL_FLAG = 'N'
               AND PRA.AUTHORIZATION_STATUS IN
                        ('INCOMPLETE', 'APPROVED', 'IN PROCESS')
               AND NVL (PLLA.QUANTITY, 0) - NVL (PLLA.QUANTITY_RECEIVED, 0) >
                     0;                                    --AND ROWNUM > 500;

   P_API_VERSION        NUMBER;
   P_INIT_MSG_LIST      VARCHAR2 (32767);
   P_COMMIT             VARCHAR2 (32767);
   X_RETURN_STATUS      VARCHAR2 (32767);
   P_DOC_TYPE           VARCHAR2 (25);
   P_DOC_SUBTYPE        VARCHAR2 (25);
   P_DOC_ID             NUMBER;
   P_DOC_NUM            VARCHAR2 (20);
   P_RELEASE_ID         NUMBER;
   P_RELEASE_NUM        NUMBER;
   P_DOC_LINE_ID        NUMBER;
   P_DOC_LINE_NUM       NUMBER;
   P_DOC_LINE_LOC_ID    NUMBER;
   P_DOC_SHIPMENT_NUM   NUMBER;
   P_ACTION             VARCHAR2 (32767);
   P_ACTION_DATE        DATE;
   P_CANCEL_REASON      VARCHAR2 (240);
   P_CANCEL_REQS_FLAG   VARCHAR2 (32767);
   P_PRINT_FLAG         VARCHAR2 (32767);
   P_NOTE_TO_VENDOR     VARCHAR2 (480);
   P_USE_GLDATE         VARCHAR2 (32767);
   P_ORG_ID             NUMBER;
BEGIN
   INSERT INTO  po_rel_performance_chk (start_date)
     VALUES   (SYSDATE);
   COMMIT;
   MO_GLOBAL.INIT ('PO');
   FND_GLOBAL.APPS_INITIALIZE (FND_PROFILE.VALUE ('USER_ID'), 50372, 7000);
   FOR I IN C_PO_CANCEL
   LOOP
      FND_MSG_PUB.INITIALIZE;
      FND_FILE.PUT_LINE (
         FND_FILE.LOG,
            'PO NUMBER TO CANCEL IS :'
         || '-'
         || I.PO_NUMBER
         || '-'
         || I.RELEASE_NUM
         || '-'
         || I.ITEM_DESCRIPTION
         || I.QTY_REC
      );
      IF I.QTY_REC = 0 AND I.AUTHORIZATION_STATUS = 'APPROVED'
      THEN
         P_API_VERSION := 1.0;
         P_INIT_MSG_LIST := FND_API.G_TRUE;
         P_COMMIT := FND_API.G_TRUE;
         X_RETURN_STATUS := X_RETURN_STATUS;
         P_DOC_TYPE := 'RELEASE';
         P_DOC_SUBTYPE := 'BLANKET';
         P_DOC_ID := I.PO_HEADER_ID;
         P_DOC_NUM := NULL;
         P_RELEASE_ID := NULL;
         P_RELEASE_NUM := I.RELEASE_NUM;
         P_DOC_LINE_ID := NULL;
         P_DOC_LINE_NUM := NULL;
         P_DOC_LINE_LOC_ID := I.LINE_LOCATION_ID;
         P_DOC_SHIPMENT_NUM := I.SHIPMENT_NUM;
         P_ACTION := 'CANCEL';
         P_ACTION_DATE := NULL;
         P_CANCEL_REASON := 'API';
         P_CANCEL_REQS_FLAG := 'N';
         P_PRINT_FLAG := NULL;
         P_NOTE_TO_VENDOR := NULL;
         P_USE_GLDATE := NULL;
         P_ORG_ID := I.ORG_ID;

         APPS.PO_DOCUMENT_CONTROL_PUB.CONTROL_DOCUMENT (P_API_VERSION,
                                                        P_INIT_MSG_LIST,
                                                        P_COMMIT,
                                                        X_RETURN_STATUS,
                                                        P_DOC_TYPE,
                                                        P_DOC_SUBTYPE,
                                                        P_DOC_ID,
                                                        P_DOC_NUM,
                                                        P_RELEASE_ID,
                                                        P_RELEASE_NUM,
                                                        P_DOC_LINE_ID,
                                                        P_DOC_LINE_NUM,
                                                        P_DOC_LINE_LOC_ID,
                                                        P_DOC_SHIPMENT_NUM,
                                                        P_ACTION,
                                                        P_ACTION_DATE,
                                                        P_CANCEL_REASON,
                                                        P_CANCEL_REQS_FLAG,
                                                        P_PRINT_FLAG,
                                                        P_NOTE_TO_VENDOR,
                                                        P_USE_GLDATE,
                                                        P_ORG_ID);
         DBMS_OUTPUT.PUT_LINE ('X_RETURN_STATUS = ' || X_RETURN_STATUS);
         IF X_RETURN_STATUS = 'S'
         THEN
            FND_FILE.PUT_LINE (
               FND_FILE.LOG,
               'The Purchase Order Which is Cancelled Now => ' || I.PO_NUMBER
            );
            BEGIN
               COMMIT;
            END;
         ELSE
            FND_FILE.PUT_LINE (
               FND_FILE.LOG,
                  'The Purchase Order'
               || I.PO_NUMBER
               || 'Failed to cancel Due To Following Reason'
            );
            FOR J IN 1 .. FND_MSG_PUB.COUNT_MSG
            LOOP
               DBMS_OUTPUT.PUT_LINE (
                  FND_MSG_PUB.GET (P_MSG_INDEX => J, P_ENCODED => 'F')
               );
            END LOOP;
         END IF;
      ELSIF I.QTY_REC = 0 AND I.AUTHORIZATION_STATUS = 'INCOMPLETE'
      THEN
         DELETE FROM   PO_RELEASES_ALL PRA
               WHERE   PRA.PO_RELEASE_ID = I.PO_RELEASE_ID
                       AND PRA.ORG_ID = I.ORG_ID;
         DELETE FROM   PO_DISTRIBUTIONS_ALL POD
               WHERE   POD.PO_RELEASE_ID = I.PO_RELEASE_ID
                       AND POD.ORG_ID = I.ORG_ID;
      ELSE
         UPDATE   PO_LINE_LOCATIONS_ALL A
            SET   A.QUANTITY = A.QUANTITY_RECEIVED
          WHERE   A.LINE_LOCATION_ID = I.LINE_LOCATION_ID
                  AND A.ORG_ID = I.ORG_ID;
         UPDATE   PO_DISTRIBUTIONS_ALL B
            SET   QUANTITY_ORDERED = I.ORDER_QTY
          WHERE   B.LINE_LOCATION_ID = I.LINE_LOCATION_ID
                  AND B.ORG_ID = I.ORG_ID;
         COMMIT;
      END IF;
   END LOOP;
   UPDATE   po_rel_performance_chk
      SET   end_date = SYSDATE
    WHERE   start_date IS NOT NULL;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      FND_FILE.PUT_LINE (FND_FILE.LOG, 'no-data-found');
END;
/