Translate

Saturday, March 2, 2019

Register Custom New Form In Oracle EBS


     1.  Prepare your own custom form. Make sure no bugs and error.

      
   












2. Put your custom form (e.g. XXX_NEW_FORM.fmb) in oracle ebs server using ftp tools. Upload this file to $AU_TOP/12.0.0/forms/US/
      






  3. Compile your fmb file using this script:
frmcmp_batch module=XXX_NEW_FORM.fmb userid=apps/apps output_file=$<custom_directory>_TOP/forms/US/XXX_NEW_FORM.fmx module_type=FORM compile_all=YES

4.  Register your custom form (file fmx) in oracle ebs
Navigation : Application Developer  -> Application  ->  Form
For example, please see image below.










5. Register your form to form function.
Navigation : Application Developer  ->  Application  ->  Function.
For example, please see image below.

   
   












      
6. Register your form function to oracle application menu.  In this case, I put this custom form in responsibility “Receivables Manager”
Navigation : Application Developer  ->  Application  ->  Menu.















7.     Please go to form responsibility (Receivables Manager) to run your custom form.

Wednesday, February 6, 2019

OPM create recipe api validations and Code

PROCEDURE validate_recipe_data (p_validate_recipe IN VARCHAR2)

   IS
      --Local Variables
      lc_formula_num      VARCHAR2(25);
      lc_routing_num      VARCHAR2(25);
     
      ln_routing_id       NUMBER;
      ln_routstep_id      NUMBER;
      ln_formula_id       NUMBER;     
      ln_formulaline_id   NUMBER;
      ln_recipe_type      NUMBER;
      ln_valrec_cnt       NUMBER (10);
      ln_trnsfrec_cnt     NUMBER (10);
      ln_recipe_no        VARCHAR2 (30);
      ln_routing_vers     NUMBER (10);
      ln_org_id           NUMBER (10);
      ln_bulk_error_cnt   NUMBER (20);
      ln_formula_vers     NUMBER (10);
      ln_rout_max_vers    NUMBER (10);
      ln_ffm_max_vers     NUMBER (10);
      ln_max_vers         NUMBER (10);
      lv_record_status_recipe     VARCHAR2 (2);
      lv_error_code_recipe        VARCHAR2 (30);
      lv_error_message_recipe     VARCHAR2 (500);
--===============================
--Cursor to get Recipe Data
--===============================
      CURSOR lcu_recipe_data
      IS
         SELECT  transaction_id
               , sr_no
               , new_recipe_no recipe_no
               , recipe_version
               , recipe_description
               , new_formula_no formula_no
               , formula_version
               , new_routing_no routing_no
               , routing_version
               , owner_org_code
               , recipe_validity_date
               , recipe_type
               , formula_id
               , routing_id
               , organization_id
               , process_flag
               , error_code
               , record_status
               , error_message
               , last_updated_by
               , created_by
               , last_update_date
               , creation_date
               , last_update_login
           FROM xxblr_opm_recipe_stg
          WHERE 1=1
            AND (   NVL(record_status, 'N') = gc_newrecord_flag
                 OR NVL(record_status, 'N') = gc_validation_error_flag)  
       ORDER BY new_recipe_no;  

--===============================
--Cursor to get Recipe Number
--===============================
 /* cursor lcu_recipe_no(cp_recipe_no VARCHAR2)
 is
 select recipe_no
FROM apps.gmd_recipes
where recipe_no =cp_recipe_no; */

      --=====================================
--Cursor to get Recipe Num With Version
--=====================================
      CURSOR lcu_recipe_no (cp_recipe_no VARCHAR2, cp_recipe_vers NUMBER)
      IS
         SELECT recipe_no
           FROM apps.gmd_recipes
          WHERE 1=1
            AND recipe_no      = cp_recipe_no
            AND recipe_version = cp_recipe_vers;

--===============================
--Cursor to get Formula Number
--===============================
      CURSOR lcu_formula_no (cp_formula_no VARCHAR2)
      IS
         SELECT formula_no
           FROM apps.fm_form_mst
          WHERE 1=1
            AND formula_no = cp_formula_no;
         
--===============================
--Cursor to get Formula Line Id
--===============================
         
      CURSOR lcu_formulaline_id (p_formula_no VARCHAR2, p_formula_vers NUMBER)
      IS           
           SELECT fmd.formulaline_id
             FROM apps.fm_form_mst_b ffb,
                  apps.fm_matl_dtl fmd
            WHERE 1=1
              AND ffb.formula_id     = fmd.formula_id
              AND ffb.formula_no     = p_formula_no
              AND ffb.formula_vers   = p_formula_vers
         ORDER BY fmd.formulaline_id;

--=====================================
--Cursor to get Formula Num with Version
--======================================
      CURSOR lcu_formula_num (
                                 cp_formula_no        VARCHAR2,
                                 cp_formula_version   NUMBER
                             )
      IS                 
         SELECT formula_no,formula_id
           FROM apps.fm_form_mst
          WHERE 1=1
            AND formula_no   =  cp_formula_no
            AND formula_vers =  cp_formula_version;

--===============================
--Cursor to get Routing Number
--===============================
      CURSOR lcu_routing_no (cp_routing_no VARCHAR2)
      IS
         SELECT routing_no
           FROM apps.fm_rout_hdr
          WHERE 1=1
            AND routing_no = cp_routing_no;

--===================================
--Cursor to get Routing Num with Vers
--===================================
      CURSOR lcu_routing_num (cp_routing_no VARCHAR2, cp_routing_vers NUMBER)
      IS           
         SELECT routing_no,
                routing_id
           FROM apps.fm_rout_hdr
          WHERE 1=1
            AND routing_no   =  cp_routing_no
            AND routing_vers =  cp_routing_vers;

--===================================
--Cursor to get Routing Num with Vers
--===================================
      CURSOR lcu_routstep_id (p_routing_no VARCHAR2,p_routing_vers NUMBER)
      IS                                   
         SELECT  frd.routingstep_id
           FROM apps.fm_rout_hdr frh,
                apps.fm_rout_dtl frd                              
          WHERE 1=1
            AND frh.routing_id        =     frd.routing_id                   
            AND frh.routing_no        =     p_routing_no                         
            AND frh.routing_vers      =     p_routing_vers;
           
--===============================
--Cursor to get Org ID
--===============================
      CURSOR lcu_org_id (cp_owner_org_code VARCHAR2)
      IS
         SELECT organization_id
           FROM apps.org_organization_definitions
          WHERE 1=1
            AND UPPER(organization_code) = UPPER(cp_owner_org_code);

      -- Cursor to get Recipe Validity date

      --===============================
--Cursor to get Recipe Type
--===============================
     
    CURSOR lcu_recipe_type(p_recipe_type varchar2)
    IS
    SELECT lookup_code
      FROM apps.fnd_lookup_values
     WHERE 1=1
       AND UPPER(lookup_type)     = 'GMD_RECIPE_TYPE'                                     
       AND (   UPPER(meaning)     = UPPER (p_recipe_type)
            OR UPPER(lookup_code) = p_recipe_type );
   
--================================
--Cursor to get Max Recipe Version
--================================
      CURSOR lcu_max_vers
      IS
         SELECT MAX (recipe_version)
           FROM apps.gmd_recipes;

--===============================
--Cursor to get Formula Version
--===============================
      CURSOR lcu_ffm_max_vers
      IS
         SELECT MAX (formula_vers)
           FROM apps.fm_form_mst;

 --=================================
--Cursor to get Max Routing Version
--=================================
      CURSOR lcu_rout_max_vers
      IS
         SELECT MAX (routing_vers)
           FROM apps.fm_rout_hdr;

--===============================
--Cursor to get Valid Records
--===============================
      CURSOR lcu_valrec_cnt (cp_record_status VARCHAR2)
      IS
         SELECT COUNT (1)
           FROM xxblr_opm_recipe_stg
          WHERE 1=1
            AND record_status = cp_record_status;
           
----------
--=========================================================================
--Cursor to Update formula line id and routing id in formula staging table
--==========================================================================            
   
    CURSOR lcu_updt_form_rout_id(p_formula_id number,p_routing_id  number)
     IS  
        SELECT fmd.formulaline_id
             , frd.routingstep_id
--             , xrof.new_item_no
--             , xrof.issue_to_step
             , xrof.transaction_id  
          FROM xxblr_opm_formula_stg xrof
             , apps.fm_form_mst ffm
             , apps.fm_matl_dtl fmd
             , apps.mtl_system_items_b msi
             , apps.fm_rout_dtl frd
         WHERE 1=1
           AND xrof.new_formula_no        =  ffm.formula_no
           AND xrof.formula_vers          =  ffm.formula_vers
           AND ffm.formula_id             =  p_formula_id
           AND fmd.formula_id             =  ffm.formula_id
           AND (    fmd.inventory_item_id =  msi.inventory_item_id
                and msi.organization_id   =  g_master_org 
                and msi.segment1          =  xrof.new_item_no
               )
           AND fmd.qty                    =  xrof.required_qty
           AND frd.routing_id             =  p_routing_id
           AND frd.routingstep_no         =  xrof.issue_to_step
      ORDER BY xrof.transaction_id;
--------------- 

      TYPE per_tbl_type IS TABLE OF lcu_recipe_data%ROWTYPE INDEX BY BINARY_INTEGER;
      lt_per              per_tbl_type;

   BEGIN
      apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD ('*', 80, '*'));
      apps.fnd_file.put_line(apps.fnd_file.LOG,'   --------- Executing VALIDATE_RECIPE_DATA ---------');
      apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD (' ', 80, ' '));
      apps.fnd_file.put_line (apps.fnd_file.output, RPAD ('*', 80, '*'));
      apps.fnd_file.put_line(apps.fnd_file.output,'   --------- Executing VALIDATE_RECIPE_DATA ---------');
      apps.fnd_file.put_line (apps.fnd_file.output, RPAD (' ', 80, ' '));

      OPEN lcu_recipe_data;

      LOOP
         lt_per.DELETE;

         FETCH lcu_recipe_data BULK COLLECT INTO lt_per LIMIT 50000;

         FOR i IN lt_per.FIRST .. lt_per.LAST
         LOOP
            apps.fnd_file.put_line (apps.fnd_file.LOG,'Transaction ID:-'|| lt_per (i).transaction_id);
            --===============================
            -- Applying Transformation rules
            --===============================
            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Number');

            IF lt_per (i).recipe_no IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',RECIPE  NUM IS NULL ';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            END IF;
           apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Version');
           
            IF lt_per (i).recipe_version IS NULL
            THEN
               lt_per (i).recipe_version := 1;
            END IF;
            ln_recipe_no :=NULL;
           
            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Number Valid');
           
             OPEN lcu_recipe_no (lt_per (i).recipe_no,lt_per (i).recipe_version);
             FETCH lcu_recipe_no
             INTO ln_recipe_no;
             CLOSE lcu_recipe_no;
           
            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Number Valid_1.0');
           
            IF ln_recipe_no IS NOT NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',RECIPE NUMBER ALREADY EXISTED';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            END IF;
           
            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Number descrp');
           
            IF lt_per (i).recipe_description IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',RECIPE DESCRIPTION IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            END IF;

            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for formula_no');
           
            IF lt_per (i).formula_no IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',FORMULA NUMBER IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            END IF;

            apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for formula Version');
           
            IF lt_per (i).formula_version IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',FORMULA VERSION IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;              
            ELSE
               apps.fnd_file.put_line (apps.fnd_file.LOG,'Formula version :'|| lt_per (i).formula_version);

               OPEN lcu_formula_num (lt_per (i).formula_no,
                                     lt_per (i).formula_version
                                    );
               FETCH lcu_formula_num
                INTO lc_formula_num,ln_formula_id;
               CLOSE lcu_formula_num;

               IF lc_formula_num IS  NULL THEN
                  lt_per (i).record_status  := gc_error_flag;
                  gc_error_code             := '-PAT04';
                  gc_error_message          := ',FORMULA NO IS INVALID';
                  lt_per (i).error_code     := gc_error_code;
                  lt_per (i).error_message  := gc_error_message;
               ELSE
                  lt_per(i).formula_no      := lc_formula_num;
                  lt_per(i).formula_id      := ln_formula_id;
               END IF;
            END IF;                       

           apps.fnd_file.put_line (apps.fnd_file.LOG,'Validation for recipe Number Valid');
            IF lt_per (i).routing_no IS NULL
            THEN
               lt_per (i).record_status      := gc_error_flag;
               gc_error_code                 := '-PAT04';
               gc_error_message              := ',ROUTING NUMBER IS NULL';
               lt_per (i).error_code         := gc_error_code;
               lt_per (i).error_message      := gc_error_message;
            END IF;

            IF lt_per (i).routing_version IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ',ROUTING VERSION IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            ELSE
               lc_routing_num  :=NULL;
               ln_routing_id   :=NULL;
               
                OPEN lcu_routing_num (lt_per (i).routing_no,lt_per (i).routing_version);
               FETCH lcu_routing_num
                INTO lc_routing_num,ln_routing_id;
               CLOSE lcu_routing_num;

               IF lc_routing_num IS NULL THEN
                   lt_per (i).record_status     := gc_error_flag;
                   gc_error_code                := '-PAT04';
                   gc_error_message             := ',ROUTING NUMBER DOESNOT EXIST';
                   lt_per (i).error_code        := gc_error_code;
                   lt_per (i).error_message     := gc_error_message;
               ELSE
                lt_per(i).routing_no         :=     lc_routing_num;
                lt_per(i).routing_id         :=     ln_routing_id;            
               END IF;
            END IF;
         
            IF lt_per (i).recipe_validity_date IS NULL
            THEN
               lt_per (i).recipe_validity_date := '01-JAN-2011';
             /* 
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ' ,RECIPE VALIDITY DATE IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;             */
            END IF;
                                                               
            IF lt_per (i).owner_org_code IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ' ,OWNER ORG CODE IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            ELSE
               ln_org_id :=NULL;
               OPEN lcu_org_id (lt_per (i).owner_org_code);
               FETCH lcu_org_id INTO ln_org_id;
               CLOSE lcu_org_id;

               IF ln_org_id IS NULL
               THEN
                  lt_per (i).record_status  := gc_error_flag;
                  gc_error_code             := '-PAT04';
                  gc_error_message          := ' ,OWNER ORG CODE IS INVALID';
                  lt_per (i).error_code     := gc_error_code;
                  lt_per (i).error_message  := gc_error_message;
                  ELSE
                  lt_per (i).organization_id := ln_org_id;
               END IF;
            END IF;

            IF lt_per (i).recipe_type IS NULL
            THEN
               lt_per (i).record_status     := gc_error_flag;
               gc_error_code                := '-PAT04';
               gc_error_message             := ' ,RECIPE TYPE IS NULL';
               lt_per (i).error_code        := gc_error_code;
               lt_per (i).error_message     := gc_error_message;
            ELSE
               ln_recipe_type    :=NULL;
               OPEN lcu_recipe_type(lt_per (i).recipe_type);
               FETCH lcu_recipe_type INTO ln_recipe_type;
               CLOSE lcu_recipe_type;
              
               IF ln_recipe_type IS NULL THEN
                  lt_per (i).record_status     := gc_error_flag;
                  gc_error_code                := '-PAT04';
                  gc_error_message             := ' ,RECIPE TYPE IS INVALID';
                  lt_per (i).error_code        := gc_error_code;
                  lt_per (i).error_message     := gc_error_message;
               ELSE
                  lt_per(i).recipe_type          := ln_recipe_type;
               END IF;
            END IF;
           
            --============VALIDATIONS FOR RECIPE VALIDATITY RULES==============--
            ln_formulaline_id :=NULL;
           
             OPEN lcu_formulaline_id(lt_per (i).formula_no,lt_per (i).formula_version);
            FETCH lcu_formulaline_id
             INTO ln_formulaline_id;
            CLOSE lcu_formulaline_id;
           
            IF ln_formulaline_id IS NULL THEN
               lt_per (i).record_status  := gc_error_flag;
               gc_error_code             := '-PAT04';
               gc_error_message          := ',FORMULA LINE ID IS NOT FOUND';
               lt_per (i).error_code     := gc_error_code;
               lt_per (i).error_message  := gc_error_message;
            --    ELSE
            --    lt_per (i).formulaline_id  := ln_formulaline_id;        -- commented for a while
            END IF;
           
            ln_routstep_id := NULL;
            OPEN lcu_routstep_id (lt_per (i).routing_no,lt_per (i).routing_version);           
            FETCH lcu_routstep_id INTO ln_routstep_id;
            CLOSE lcu_routstep_id;
           
            IF ln_routstep_id Is null then
               lt_per (i).record_status  := gc_error_flag;
               gc_error_code             := '-PAT04';
               gc_error_message          := ',ROUTING STEP ID IS NOT FOUND';
               lt_per (i).error_code     := gc_error_code;
               lt_per (i).error_message  := gc_error_message;
            --    ELSE
            --      lt_per (i).routstep_id      := ln_routstep_id;   
            END IF;

                --=================================
                -- Identifying the success records
                --=================================
            IF lt_per (i).record_status <> gc_error_flag
            THEN
               lt_per (i).record_status := gc_validation_flag;
               lt_per (i).error_message := 'All Validations Passed';
            ELSE
               lt_per (i).record_status := gc_validation_error_flag;
            END IF;
        
            BEGIN
                 FOR c_rec IN lcu_updt_form_rout_id(lt_per (i).formula_id,lt_per (i).routing_id)
                 LOOP        
   
                         UPDATE  xxblr_opm_formula_stg
                            SET  formulaline_id        =   c_rec.formulaline_id
                               , routingstep_id        =   c_rec.routingstep_id
                           --    , record_status_recipe  =   lv_record_status_recipe
                           --    , error_message_recipe  =   lv_error_message_recipe
                           --    , error_code_recipe     =   lv_error_code_recipe
                          WHERE  1=1
                            AND  transaction_id         = c_rec.transaction_id;
                 
                   EXIT WHEN   lcu_updt_form_rout_id%NOTFOUND;     
                 END LOOP;
           
            EXCEPTION
            WHEN OTHERS THEN
               apps.fnd_file.put_line (apps.fnd_file.LOG,'Formulaline id  Step id Update Error Message :-> '|| SQLERRM);
        
            END;

         END LOOP;

        --===================================================================
        --Bulk Update the records with status flag, validation error message
        --===================================================================
         ln_bulk_error_cnt := 0;
         apps.fnd_file.put_line (apps.fnd_file.LOG, 'TRACK 11:');

         BEGIN
           
            FORALL i IN lt_per.FIRST .. lt_per.LAST SAVE EXCEPTIONS
              
               UPDATE xxblr_opm_recipe_stg
                  SET record_status         =   lt_per (i).record_status,
                      error_message         =   lt_per (i).error_message,
                      error_code            =   lt_per (i).error_code,
                      recipe_type           =   lt_per (i).recipe_type,
                      new_formula_no        =   lt_per (i).formula_no,
                      formula_version       =   lt_per (i).formula_version,
                      formula_id            =   lt_per (i).formula_id,
                      organization_id       =   lt_per (i).organization_id,
                      recipe_validity_date  =   lt_per (i).recipe_validity_date,
                      new_routing_no        =   lt_per (i).routing_no,
                      routing_id            =   lt_per (i).routing_id,
                      recipe_version        =   lt_per (i).recipe_version,
                      last_update_date      =   gd_current_date,
                      last_updated_by       =   gn_user_id,
                      last_update_login     =   gn_login_id
                WHERE transaction_id        =   lt_per (i).transaction_id;
           
      --    COMMIT;
         EXCEPTION
            WHEN OTHERS THEN
               apps.fnd_file.put_line (apps.fnd_file.LOG,'Bulk Update Error Message :-> '|| SQLERRM);
               ln_bulk_error_cnt := SQL%BULK_EXCEPTIONS.COUNT;

             FOR i IN 1 .. ln_bulk_error_cnt
             LOOP
                apps.fnd_file.put_line(apps.fnd_file.LOG,'Error# '|| i|| ' at iteration# '|| SQL%BULK_EXCEPTIONS (i).ERROR_INDEX);
                apps.fnd_file.put_line(apps.fnd_file.LOG,'Error Message is '|| SQLERRM(-SQL%BULK_EXCEPTIONS (i).ERROR_CODE));
             END LOOP;
         END;
  
         EXIT WHEN lcu_recipe_data%NOTFOUND;
      END LOOP;

      CLOSE lcu_recipe_data;

      COMMIT;

      OPEN lcu_valrec_cnt ('V');                        --gc_validation_flag);
      FETCH lcu_valrec_cnt
       INTO ln_valrec_cnt;
      CLOSE lcu_valrec_cnt;

      apps.fnd_file.put_line (apps.fnd_file.LOG,'   Number Of Records Validated       :-> '|| ln_valrec_cnt);
      apps.fnd_file.put_line (apps.fnd_file.LOG,'   Number Of Records Failured        :-> '|| (ln_trnsfrec_cnt - ln_valrec_cnt));
      apps.fnd_file.put_line (apps.fnd_file.LOG,'   ------ Procedure VALIDATE_DATA Exit------');
   EXCEPTION
      WHEN OTHERS THEN
         apps.fnd_file.put_line (apps.fnd_file.LOG,'MAIN-ERR-VLD-RECP-DATA :> ' || SQLERRM || ', ' || SQLCODE);
         apps.fnd_file.put_line(apps.fnd_file.LOG,'   --------- Procedure VALIDATE_RECIPE_DATA Exit ---------');
         apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD (' ', 80, ' '));
         apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD ('*', 80, '*'));
   END validate_recipe_data;

OPM routing uploading through api script

   PROCEDURE create_routing (p_create_routing IN VARCHAR2)

   IS
      l_routings_type           apps.gmd_routings%ROWTYPE;
      l_routings_step_tab       apps.gmd_routings_pub.gmd_routings_step_tab;
      l_routings_step_dep_tab   apps.gmd_routings_pub.gmd_routings_step_dep_tab;
      l_return_status           VARCHAR2 (1);
      l_msg_count               NUMBER;
      l_msg_data                VARCHAR2 (2000);
      l_count                   NUMBER;
      l_msg_ind                 VARCHAR2 (30);
      l_routing_id              NUMBER;
      l_oprn_id                 NUMBER;
      ln_dep_type               NUMBER;
      ln_suc_rec_cnt            NUMBER                                   := 0;
      ln_rej_rec_cnt            NUMBER                                   := 0;
      ln_lcu_count              NUMBER;
      ln_progress               NUMBER                                   := 0;
      ln_count                  NUMBER;
      ln_organization_id        NUMBER;
      lc_routing_uom            VARCHAR2 (7);
      l_msg                     varchar2(2000);
--===============================
--Cursor to get new records count
--===============================
      CURSOR lcu_count
      IS
         SELECT COUNT (*)
           FROM xxblr_opm_routing_stg
          WHERE record_status = gc_validation_flag;

--===============================
--Cursor to get Routing Data
--===============================
      CURSOR lcu_routing_data
      IS                                            
         SELECT   xors.sr_no
                , xors.new_routing_no routing_no
                , xors.routing_version
                , xors.routing_description
                , xors.routing_class
                , xors.routing_class_desc
                , gd_valid_date valid_from
                --, to_char(to_date(xors.valid_from,'dd-mm-yy'),'dd-mon-yy') valid_from --xors.valid_from
                , xors.valid_to
                , xors.routing_qty
                , xors.routing_uom
                , xors.owner_org_code
                , xors.organization_id
                , substr(xors.total_loss,1,instr(xors.total_loss,'%')-1) total_loss --xors.total_loss
            FROM xxblr_opm_routing_stg xors
           WHERE 1=1
            )                  
        GROUP BY  xors.sr_no
                , xors.new_routing_no
                , xors.routing_version
                , xors.routing_description
                , xors.routing_class
                , xors.routing_class_desc
                , xors.valid_from
                , xors.valid_to
                , xors.routing_qty
                , xors.routing_uom
                , xors.owner_org_code
                , xors.organization_id
                , xors.total_loss
        ORDER BY  new_routing_no;

--============================
--Cursor to get Step  data
--============================
      CURSOR lcu_step_data (p_routing_num VARCHAR2)--,p_step_num NUMBER)
      IS                                                                                                                            
      SELECT  new_routing_no,
              new_oprn_no,
              step_number,
              oprn_id,
              process_output_qty
         FROM xxblr_opm_routing_stg
        WHERE 1=1
       --   AND step_number = p_step_num
          AND new_routing_no  =  p_routing_num
     GROUP BY new_routing_no,
              new_oprn_no,
              step_number,
              oprn_id,
              process_output_qty
     ORDER BY step_number;

--=================================
--Cursor to get Step Depency data
--=================================
      CURSOR lcu_step_dep_data (p_routing_no varchar2)
      IS                
       SELECT  organization_code
             , new_routing_no routing_no
             , routing_version
             , previous_step
             , routing_step
             , dependency_type
             , transfer_percent
             , error_code
             , record_status
             , error_message
         FROM  xxblr_opm_step_dep_stg
        WHERE  1=1         
          AND  new_routing_no    = p_routing_no
     GROUP BY  organization_code
             , new_routing_no
             , routing_version
             , previous_step
             , routing_step
             , dependency_type
             , transfer_percent
             , error_code
             , record_status
             , error_message
     ORDER BY previous_step;

      TYPE tbl_routing_data IS TABLE OF lcu_routing_data%ROWTYPE INDEX BY BINARY_INTEGER;
      lt_per                    tbl_routing_data;

--      TYPE tbl_stepdep_data IS TABLE OF lcu_step_dep_data%ROWTYPE INDEX BY BINARY_INTEGER;
--      ct_per                    tbl_stepdep_data;
     
   BEGIN
      apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD ('*', 80, '*'));
      apps.fnd_file.put_line(apps.fnd_file.LOG,'   --------- Executing CREATE_ROUTING ---------');
      apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD (' ', 80, ' '));
      apps.fnd_file.put_line (apps.fnd_file.output, RPAD ('*', 80, '*'));
      apps.fnd_file.put_line(apps.fnd_file.output,'   --------- Executing CREATE_ROUTING ---------');
      apps.fnd_file.put_line (apps.fnd_file.output, RPAD (' ', 80, ' '));

      OPEN lcu_count;
      FETCH lcu_count INTO ln_lcu_count;
      CLOSE lcu_count;

      apps.fnd_file.put_line (apps.fnd_file.LOG,'Number of Records Loaded:' || ln_lcu_count);

        -------------------------------------------------------------------------
        -- Bulk Insert   Data into Qualification.
        --------------------------------------------------------------------------
      OPEN lcu_routing_data;
      LOOP
         lt_per.DELETE;

         FETCH lcu_routing_data BULK COLLECT INTO lt_per LIMIT 50000;

         IF lt_per.COUNT > 0
         THEN
            apps.fnd_file.put_line (apps.fnd_file.LOG,'COUNT-->' || lt_per.COUNT);
           
           
            FOR i IN lt_per.FIRST .. lt_per.LAST
            LOOP
               apps.fnd_file.put_line (apps.fnd_file.LOG,'TRACK2');
               l_routings_type := NULL;
               l_routings_type.routing_id               := NULL;
               l_routings_type.routing_no               := lt_per (i).routing_no;
               l_routings_type.routing_vers             := lt_per (i).routing_version;
               l_routings_type.routing_desc             := lt_per (i).routing_description;
               l_routings_type.routing_class            := lt_per (i).routing_class;
               l_routings_type.routing_qty              := lt_per (i).routing_qty;
               l_routings_type.item_um                  := NULL;
               l_routings_type.delete_mark              := 0;
               l_routings_type.text_code                := NULL;
               l_routings_type.inactive_ind             := 0;
               l_routings_type.in_use                   := 0;
               l_routings_type.creation_date            := gd_sysdate;
               l_routings_type.created_by               := l_user_id;
               l_routings_type.last_update_login        := l_user_id;
               l_routings_type.last_update_date         := gd_sysdate;
               l_routings_type.last_updated_by          := l_user_id;
               l_routings_type.effective_start_date     := to_date(lt_per (i).valid_from);
               l_routings_type.effective_end_date       := lt_per (i).valid_to;
               l_routings_type.owner_id                 := l_user_id;
               l_routings_type.project_id               := NULL;
               l_routings_type.routing_status           := gn_status;
               l_routings_type.process_loss             := lt_per(i).total_loss;
               l_routings_type.enforce_step_dependency  := 1;     
               l_routings_type.owner_organization_id    := lt_per (i).organization_id;
               l_routings_type.routing_uom              := lt_per (i).routing_uom;
               l_routings_type.contiguous_ind           := 0;
               l_routings_type.fixed_process_loss       := NULL;
               l_routings_type.fixed_process_loss_uom   := NULL;
                           
               l_count := 0;
               l_routings_step_tab.DELETE;
              
               apps.fnd_file.put_line (apps.fnd_file.LOG,'TRACK3');
              
               FOR step_rec IN lcu_step_data(lt_per (i).routing_no)--,lt_per (i).step_number)
               LOOP
                
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'lcu_step_data :'   ||l_count);               
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'STEP NUMBER:'      ||step_rec.step_number);
                  l_count :=l_count + 1;
               
                  l_routings_step_tab (l_count).routing_id            := NULL; --l_routing_id;
                  l_routings_step_tab (l_count).routingstep_no        := step_rec.step_number;
                  l_routings_step_tab (l_count).routingstep_id        := NULL;
                  l_routings_step_tab (l_count).oprn_id               := step_rec.oprn_id;
                  l_routings_step_tab (l_count).step_qty              := step_rec.process_output_qty;
                  l_routings_step_tab (l_count).steprelease_type      := 1;
                  l_routings_step_tab (l_count).text_code             := NULL;
                  l_routings_step_tab (l_count).last_updated_by       := l_user_id;
                  l_routings_step_tab (l_count).created_by            := l_user_id;
                  l_routings_step_tab (l_count).last_update_date      := gd_sysdate;
                  l_routings_step_tab (l_count).creation_date         := gd_sysdate;
                  l_routings_step_tab (l_count).last_update_login     := l_user_id;
                  l_routings_step_tab (l_count).minimum_transfer_qty  := NULL;
                                     
                  --apps.fnd_file.put_line (apps.fnd_file.LOG,'COUNT-->' || ct_per.COUNT);

               END LOOP;
               apps.fnd_file.put_line (apps.fnd_file.LOG,'TRACK3');
               ln_count :=0;
               l_routings_step_dep_tab.DELETE;
              
               FOR ct_per IN lcu_step_dep_data(lt_per(i).routing_no)
               LOOP
                  ln_count  := ln_count + 1;
                                        
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'lcu_step_dep_data: ' ||ln_count);
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'ROUTING STEP NO:'    ||ct_per.routing_step);                                             
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'PREVIOUS STEP NO:'   ||ct_per.previous_step);

                  --Step Dependency
                  l_routings_step_dep_tab  (ln_count).routingstep_no           := ct_per.routing_step;
                  l_routings_step_dep_tab  (ln_count).dep_routingstep_no       := ct_per.previous_step;
                  l_routings_step_dep_tab  (ln_count).routing_id               := NULL;--l_routing_id;
                  l_routings_step_dep_tab  (ln_count).dep_type                 := ct_per.dependency_type;
                  l_routings_step_dep_tab  (ln_count).rework_code              := NULL;
                  l_routings_step_dep_tab  (ln_count).standard_delay           := 0;
                  l_routings_step_dep_tab  (ln_count).minimum_delay            := 0;
                  l_routings_step_dep_tab  (ln_count).max_delay                := NULL;
                  l_routings_step_dep_tab  (ln_count).transfer_qty             := 300;
                  l_routings_step_dep_tab  (ln_count).item_um                  := NULL;
                  l_routings_step_dep_tab  (ln_count).text_code                := NULL;
                  l_routings_step_dep_tab  (ln_count).last_updated_by          := l_user_id;
                  l_routings_step_dep_tab  (ln_count).created_by               := l_user_id;
                  l_routings_step_dep_tab  (ln_count).last_update_date         := gd_sysdate;
                  l_routings_step_dep_tab  (ln_count).creation_date            := gd_sysdate;
                  l_routings_step_dep_tab  (ln_count).last_update_login        := l_user_id;
                  l_routings_step_dep_tab  (ln_count).transfer_pct             := ct_per.transfer_percent;
                  l_routings_step_dep_tab  (ln_count).chargeable_ind           := 0;
                  l_routings_step_dep_tab  (ln_count).routingstep_no_uom       := lt_per (i).routing_uom;
                                      
               END LOOP;                    

               BEGIN
                  apps.gmd_routings_pub.insert_routing
                                             (  p_api_version                => 1.0
                                              , p_init_msg_list              => TRUE
                                              , p_commit                     => FALSE
                                              , p_routings                   => l_routings_type
                                              , p_routings_step_tbl          => l_routings_step_tab
                                              , p_routings_step_dep_tbl      => l_routings_step_dep_tab
                                              , x_message_count              => l_msg_count
                                              , x_message_list               => l_msg_data
                                              , x_return_status              => l_return_status
                                             );
                  apps.fnd_file.put_line (apps.fnd_file.LOG,'RETURN_STATUS:-'|| l_return_status);
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     apps.fnd_file.put_line(apps.fnd_file.LOG,'API RAISED ERROR: '|| SQLCODE|| '-'|| SQLERRM);
                     apps.fnd_file.put_line (apps.fnd_file.LOG,'RETURN_STATUS:-'|| l_return_status);
               END;

               IF l_return_status <> 'S' THEN
                   ln_rej_rec_cnt := ln_rej_rec_cnt + 1;
                   l_msg := '';
                   FOR i IN 1 .. l_msg_count
                   LOOP
                       l_msg := SUBSTR(l_msg || ' | ' || SUBSTR(apps.fnd_msg_pub.get(l_msg_count - i + 1, 'F'), 0, 200), 1, 2000);
                   END LOOP;
                   l_msg_data := l_msg;
                   apps.fnd_file.put_line(apps.fnd_file.LOG,'Error in OPRN INSERT API : ' || l_msg);     

               ELSE
                   ln_suc_rec_cnt := ln_suc_rec_cnt + 1;
               END IF;

               apps.fnd_file.put_line (apps.fnd_file.LOG,'TRACK 14');

                 BEGIN
                   UPDATE  xxblr_opm_routing_stg
                      SET  record_status_routing    = l_return_status
                         , error_code_routing       = l_msg_count
                         , error_message_routing    = l_msg_data
                    WHERE  new_routing_no           = lt_per(i).routing_no
                      AND  routing_version          = lt_per(i).routing_version;                     
                                                     
                 EXCEPTION
                   WHEN OTHERS THEN
                      apps.fnd_file.put_line(apps.fnd_file.LOG,'Error occured in staging table updation:'||sqlcode||sqlerrm);
                 END;     

                
                 BEGIN
                  
                   UPDATE  xxblr_opm_step_dep_stg
                      SET  record_status    = l_return_status
                         , error_code       = l_msg_count
                         , error_message    = l_msg_data
                    WHERE  new_routing_no   = lt_per(i).routing_no
                      AND  routing_version  = lt_per(i).routing_version;
                                                     
                                                    
                 EXCEPTION
                     WHEN OTHERS THEN
                      apps.fnd_file.put_line(apps.fnd_file.LOG,'Error occured in staging table updation:'||sqlcode||sqlerrm);
                 END;     
                
                 COMMIT;
                    
            END LOOP;
         END IF;

         apps.fnd_file.put_line (apps.fnd_file.LOG,' +----------------------------------------------------------+');
         apps.fnd_file.put_line (apps.fnd_file.LOG,' | Total records processed :           '|| ln_suc_rec_cnt);
         apps.fnd_file.put_line (apps.fnd_file.LOG,' | Total records rejected  :           '|| ln_rej_rec_cnt);
         apps.fnd_file.put_line (apps.fnd_file.LOG,' +----------------------------------------------------------+');
         apps.fnd_file.put_line (apps.fnd_file.LOG, ' ');
        
      EXIT WHEN lcu_routing_data%NOTFOUND;
      END LOOP;

     CLOSE lcu_routing_data;
   EXCEPTION
      WHEN OTHERS THEN
         apps.fnd_file.put_line (apps.fnd_file.LOG,'MAIN-ERR-CREATE-ROUT :> ' || SQLERRM || ', ' || SQLCODE);
         apps.fnd_file.put_line (apps.fnd_file.LOG,'   --------- Procedure CREATE_ROUTING Exit ---------');
         apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD (' ', 80, ' '));
         apps.fnd_file.put_line (apps.fnd_file.LOG, RPAD ('*', 80, '*'));
   END create_routing;

Accounts Receivable-AR setups in Oracle EBS Functional Financials - Apps R12

   1. Oracle Receivables -> Setup -> System ->System Options     a. Receivable GL related setup    b. Transaction and Customer rela...