EBS 中如何自定义ABC编制(ABC Compile)

EBS中自定义ABC编制
本文介绍在EBS环境中如何通过自定义PL/SQL脚本来实现特定需求的ABC编制生成流程,包括删除原有编制分录、根据指定的事务类型重新生成编制分录等步骤。

EBS 中如何自定义ABC编制(ABC Compile)

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)

ABC编制的定义过程如下

1.  通过Form来定义ABC Compile 头。

2.  点击Compile按钮来提交‘Compile ABC analysis’Request来生成ABC Compile分录并更新ABC编制头。

3.  点击菜单中的Print Compile来提交‘ABC descending value report’Request生成报表。

在第一步中只是定义了ABC 编制的头,包括Criterion,和编制的范围和计算值的范围等信息,全部都是指定好的用来生成ABC编制分录用的,没有什么可以特别自定义的。

对于第三步,它只是格式化ABC编制分录中的数据,并利用分录中的数据来生成报表,所以也没什么特别要自定义的部分。

对于第二步,往往用户可能会有特殊的需求,比如说我只想对某一种类型的事务来统计ABC 编制,那么就需要自定义了,但是生成ABC编制分录的Concurrent Request是可执行文件,不好来替换啥的,但可以根据SQL TRACE文件看出其中的逻辑和使用的SQL语句,其基本原理是

1. 检查ABC编制是不是有Assignment Group,如果有就报错。

2. 根据不同的Criterion来执行不同的SQL来插入ABC编制分录。

3. 对于数量为0的物料也要插入到ABC编制分录中。

4. 为ABC分录更新序列号,累积编制数量和累积编制价值。

5. 为ABC编制头更新物料数量,累积编制数量和累积编制价值等。

所以如果要自定义ABC编制的话,如果添加下面的第三步:

1.  通过Form来定义ABC Compile 头。

2.  点击Compile按钮来提交‘Compile ABC analysis’Request来生成ABC Compile分录并更新ABC编制头。

3.   运行PL/SQL来删除已有的ABC编制分录,并根据自己的需要重新生成ABC编制分录。

4.  点击菜单中的Print Compile来提交‘ABC descending value report’Request生成报表。

那么这个第三步中的PL/SQL应该要处理下面的所有事情,除了之前写的那些事情还要删除之前生成的分录,基本步骤如下:

1. 检查ABC编制是不是有Assignment Group,如果有就报错。

2.  删除已有的ABC编制分录

3. 根据不同的Criterion来执行不同的SQL(已添加自己需要的条件或者调整)来插入ABC编制分录。

4. 对于数量为0的物料也要插入到ABC编制分录中。

5. 为ABC分录更新序列号,累积编制数量和累积编制价值。

6. 为ABC编制头更新物料数量,累积编制数量和累积编制价值等。

下面的脚本是针对Historical usage value 的Criterion的脚本,可以指明对某一种或几种事物类型来生成ABC编制分录。

declare

l_abc_compile_id  number :=&compile_id;

l_abc_group_count number :=0;

l_item_scope number :=0;

l_compile_type number :=0;

l_sec_inventory VARCHAR2(20);

l_org_id number;

l_start_date date;

l_end_date date;

l_compile_value number :=0;

l_compile_qty number:=0;

l_compile_rowid VARCHAR2(50);

l_cumulative_compile_value number :=0;

l_cumulative_compile_qty number :=0;

l_seq number :=0;

l_last_update_by number :=-1;

l_last_login number :=-1;

l_transaction_type_id number :=&transaction_type_id;

CURSOR updateSeq IS

             SELECT ANAL.COMPILE_VALUE,

                   ANAL.COMPILE_QUANTITY,

                   ANAL.ROWID

               FROM MTL_SYSTEM_ITEMS ITEM,

                      MTL_ABC_COMPILES ANAL

             WHERE ANAL.ORGANIZATION_ID = l_org_id

                AND ANAL.COMPILE_ID = l_abc_compile_id

               AND ITEM.ORGANIZATION_ID = l_org_id

                AND ANAL.INVENTORY_ITEM_ID = ITEM.INVENTORY_ITEM_ID

          ORDER BY ANAL.COMPILE_VALUE DESC,

                    ITEM.SEGMENT1 ASC,

                      ITEM.SEGMENT2 ASC,

                      ITEM.SEGMENT3 ASC

                FOR UPDATE OF ANAL.SEQUENCE_NUMBER,

                             ANAL.CUMULATIVE_VALUE,

                             ANAL.CUMULATIVE_QUANTITY;

begin

         select count(1)

           into l_abc_group_count

         from MTL_ABC_ASSIGNMENT_GROUPS

         where compile_id=l_abc_compile_id;

        

         if l_abc_group_count = 0 then

            delete MTL_ABC_COMPILES

            where  compile_id = l_abc_compile_id;

            dbms_output.put_line('delete MTL_ABC_COMPILES successfully');

     SELECT compile_type,item_scope_code, SECONDARY_INVENTORY,organization_id,start_date,cutoff_date,LAST_UPDATED_BY, -1

       into l_compile_type, l_item_scope, l_sec_inventory, l_org_id, l_start_date, l_end_date, l_last_update_by,l_last_login

       FROM MTL_ABC_COMPILE_HEADERS mach 

      WHERE compile_id = l_abc_compile_id;

     dbms_output.put_line('compile_type:'||l_compile_type||',l_item_scope:'||l_item_scope||',l_sec_inventory:'||l_sec_inventory||',COMPILE_ID:'||l_abc_compile_id||',ORGANIZATION_ID:'||l_org_id);

     if l_compile_type = 3 then

        IF l_item_scope = 1 THEN

           IF l_sec_inventory IS NULL THEN

              INSERT INTO MTL_ABC_COMPILES (

              COMPILE_ID,

              INVENTORY_TYPE,

              ORGANIZATION_ID,

              INVENTORY_ITEM_ID,

              SEQUENCE_NUMBER,

              CREATION_DATE,

              CREATED_BY,

              LAST_UPDATE_DATE,

              LAST_UPDATED_BY,

              LAST_UPDATE_LOGIN,

              COMPILE_QUANTITY,     

              COMPILE_VALUE)

              SELECT

              l_abc_compile_id,

              '1',

              l_org_id,

              INVENTORY_ITEM_ID,

              '0',

              SYSDATE,

              l_last_update_by,

              SYSDATE,

              l_last_update_by,

              l_last_login,

              SUM(ABS(PRIMARY_QUANTITY)),

              SUM(ABS(NVL(PRIMARY_QUANTITY,0))*NVL(ACTUAL_COST,0) )

              FROM MTL_MATERIAL_TRANSACTIONS

              WHERE TRANSACTION_TYPE_ID <> 90

              AND TRANSACTION_TYPE_ID = l_transaction_type_id

              AND TRANSACTION_ACTION_ID <> 24

              AND INVENTORY_ITEM_ID <> -1

              AND ORGANIZATION_ID = l_org_id

              AND transaction_date >= l_start_date

              AND transaction_date <= l_end_date

              GROUP BY INVENTORY_ITEM_ID;

              --load zero item

              INSERT INTO MTL_ABC_COMPILES

                 ( INVENTORY_ITEM_ID,

                ORGANIZATION_ID,

                INVENTORY_TYPE,

                COMPILE_ID,

                LAST_UPDATE_DATE,      LAST_UPDATED_BY, LAST_UPDATE_LOGIN,

                CREATION_DATE,         CREATED_BY,

                COMPILE_QUANTITY,

                COMPILE_VALUE  )

                SELECT

                 /*+ INDEX(ITEM MTL_SYSTEM_ITEMS_U1) */

                INVENTORY_ITEM_ID,

                l_org_id,

                1,

                l_abc_compile_id,

                SYSDATE,

                l_last_update_by,

                l_last_login,

                SYSDATE,   

                l_last_update_by,

                0,

                0

           FROM MTL_SYSTEM_ITEMS ITEM

          WHERE ITEM.ORGANIZATION_ID = l_org_id

            AND ITEM.STOCK_ENABLED_FLAG = 'Y'

            AND NOT EXISTS

                  ( SELECT 'X'

                      FROM MTL_ABC_COMPILES

                     WHERE INVENTORY_ITEM_ID = ITEM.INVENTORY_ITEM_ID

                       AND ORGANIZATION_ID = l_org_id

                       AND COMPILE_ID = l_abc_compile_id );

           ELSE

              INSERT INTO MTL_ABC_COMPILES (

              COMPILE_ID,

              INVENTORY_TYPE,

              ORGANIZATION_ID,

              INVENTORY_ITEM_ID,

              SEQUENCE_NUMBER,

              CREATION_DATE,

              CREATED_BY,

              LAST_UPDATE_DATE,

              LAST_UPDATED_BY,

              LAST_UPDATE_LOGIN,

              COMPILE_QUANTITY,     

              COMPILE_VALUE)

              SELECT

              l_abc_compile_id,

              '1',

              l_org_id,

              INVENTORY_ITEM_ID,

              '0',

              SYSDATE,   

              l_last_update_by,

              SYSDATE,

              l_last_update_by,

              l_last_login,

              SUM(ABS(PRIMARY_QUANTITY)),

              SUM(ABS(NVL(PRIMARY_QUANTITY,0))*NVL(ACTUAL_COST,0) )

              FROM MTL_MATERIAL_TRANSACTIONS

              WHERE TRANSACTION_TYPE_ID <> 90

              AND TRANSACTION_TYPE_ID = l_transaction_type_id

              AND TRANSACTION_ACTION_ID <> 24

              AND INVENTORY_ITEM_ID <> -1

              AND ORGANIZATION_ID = l_org_id

              AND transaction_date >= l_start_date

              AND transaction_date <= l_end_date

              AND INVENTORY_ITEM_ID IN ( SELECT SUB.INVENTORY_ITEM_ID

                                               FROM MTL_ITEM_SUB_INVENTORIES SUB

                                              WHERE SUB.ORGANIZATION_ID = l_org_id

                                                AND SUB.SECONDARY_INVENTORY =l_sec_inventory)

              GROUP BY INVENTORY_ITEM_ID;

              

              --load zero item

                   INSERT INTO MTL_ABC_COMPILES

                ( ORGANIZATION_ID,

                  INVENTORY_ITEM_ID,

                  INVENTORY_TYPE,

                  COMPILE_ID,

                  LAST_UPDATE_DATE,      LAST_UPDATED_BY, LAST_UPDATE_LOGIN,

                  CREATION_DATE,         CREATED_BY,

                  COMPILE_QUANTITY,

                  COMPILE_VALUE  )

           SELECT 

              /*+ INDEX(SUB  MTL_ITEM_SUB_INVENTORIES_U2) INDEX(ITEM MTL_SYSTEM_ITEMS_U1) */

                  l_org_id,

                  ITEM.INVENTORY_ITEM_ID,

                  1,

                  l_abc_compile_id,

                  SYSDATE,

                  l_last_update_by,

                  l_last_login,

                  SYSDATE,   

                  l_last_update_by,

                  0,

                  0

             FROM MTL_SYSTEM_ITEMS         ITEM,

                  MTL_ITEM_SUB_INVENTORIES SUB

            WHERE ITEM.ORGANIZATION_ID = l_org_id

              AND SUB.ORGANIZATION_ID = l_org_id

              AND ITEM.INVENTORY_ITEM_ID = SUB.INVENTORY_ITEM_ID

              AND SUB.SECONDARY_INVENTORY = l_sec_inventory

              AND ITEM.STOCK_ENABLED_FLAG = 'Y'

              AND NOT EXISTS

                    ( SELECT 'X'

                                FROM MTL_ABC_COMPILES ABC

                       WHERE ABC.INVENTORY_ITEM_ID = ITEM.INVENTORY_ITEM_ID

                         AND ABC.ORGANIZATION_ID = l_org_id

                         AND ABC.COMPILE_ID = l_abc_compile_id )

              GROUP BY ITEM.ORGANIZATION_ID, ITEM.INVENTORY_ITEM_ID;

          

           END IF;

        ELSE

              INSERT INTO MTL_ABC_COMPILES (

              COMPILE_ID,

              INVENTORY_TYPE,

              ORGANIZATION_ID,

              INVENTORY_ITEM_ID,

              SEQUENCE_NUMBER,

              CREATION_DATE,

              CREATED_BY,

              LAST_UPDATE_DATE,

              LAST_UPDATED_BY,

              LAST_UPDATE_LOGIN,

              COMPILE_QUANTITY,     

              COMPILE_VALUE)

              SELECT

              l_abc_compile_id,

              '1',

              l_org_id,

              INVENTORY_ITEM_ID,

              '0',

              SYSDATE,   

              l_last_update_by,

              SYSDATE,

              l_last_update_by,

              l_last_login,

              SUM(ABS(PRIMARY_QUANTITY)),

              SUM(ABS(NVL(PRIMARY_QUANTITY,0))*NVL(ACTUAL_COST,0) )

              FROM MTL_MATERIAL_TRANSACTIONS

              WHERE TRANSACTION_TYPE_ID <> 90

              AND TRANSACTION_TYPE_ID = l_transaction_type_id

              AND TRANSACTION_ACTION_ID <> 24

              AND INVENTORY_ITEM_ID <> -1

              AND ORGANIZATION_ID = l_org_id

              AND transaction_date >= l_start_date

              AND transaction_date <= l_end_date

              AND SUBINVENTORY_CODE = l_sec_inventory

              GROUP BY INVENTORY_ITEM_ID;

              

              --load zero qty

              INSERT INTO MTL_ABC_COMPILES

                 ( ORGANIZATION_ID,

                   INVENTORY_ITEM_ID,

                   INVENTORY_TYPE,

                   COMPILE_ID,

                   LAST_UPDATE_DATE,      LAST_UPDATED_BY, LAST_UPDATE_LOGIN,

                   CREATION_DATE,         CREATED_BY,

                   COMPILE_QUANTITY,

                   COMPILE_VALUE  )

                   SELECT  

                   /*+ INDEX(SUB MTL_ITEM_SUB_INVENTORIES_U2) INDEX(ITEM MTL_SYSTEM_ITEMS_U1) */

                   l_org_id,

                   ITEM.INVENTORY_ITEM_ID,

                   1,

                   l_abc_compile_id,

                   SYSDATE,

                   l_last_update_by,

                   l_last_login,

                   SYSDATE,   

                   l_last_update_by,

                   0,

                   0

              FROM MTL_SYSTEM_ITEMS ITEM,

                   MTL_ITEM_SUB_INVENTORIES SUB

             WHERE ITEM.ORGANIZATION_ID = l_org_id

               AND SUB.ORGANIZATION_ID = l_org_id

               AND ITEM.INVENTORY_ITEM_ID = SUB.INVENTORY_ITEM_ID

               AND SUB.SECONDARY_INVENTORY = l_sec_inventory

               AND ITEM.STOCK_ENABLED_FLAG = 'Y'

               AND NOT EXISTS

                     ( SELECT 'X'

                         FROM MTL_ABC_COMPILES ABC

                        WHERE ABC.INVENTORY_ITEM_ID = ITEM.INVENTORY_ITEM_ID

                          AND ABC.ORGANIZATION_ID = l_org_id

                          AND ABC.COMPILE_ID = l_abc_compile_id );

        END IF;

       

        --load seq number;

        open updateSeq;

        Loop

            fetch updateSeq into l_compile_value, l_compile_qty , l_compile_rowid;

            exit when updateSeq%notfound;      

 

            l_seq :=l_seq +1;

            l_cumulative_compile_value :=l_cumulative_compile_value+l_compile_value;

            l_cumulative_compile_qty :=l_cumulative_compile_qty + l_compile_qty;

            UPDATE MTL_ABC_COMPILES

                   SET SEQUENCE_NUMBER = l_seq,

                CUMULATIVE_VALUE = l_cumulative_compile_value,

                CUMULATIVE_QUANTITY = l_cumulative_compile_qty

                   WHERE ROWID = l_compile_rowid;

        end loop;

        close updateSeq;

        --update compile header

        UPDATE MTL_ABC_COMPILE_HEADERS

        SET COMPILE_ITEMS =

                ( SELECT COUNT(*)

                    FROM MTL_ABC_COMPILES

                   WHERE COMPILE_ID = l_abc_compile_id

                     AND ORGANIZATION_ID = l_org_id ),

            CUMULATIVE_VALUE =

                ( SELECT SUM (COMPILE_VALUE)

                    FROM MTL_ABC_COMPILES

                   WHERE COMPILE_ID = l_abc_compile_id

                     AND ORGANIZATION_ID = l_org_id ),

            CUMULATIVE_QUANTITY =

                ( SELECT SUM (COMPILE_QUANTITY)

                    FROM MTL_ABC_COMPILES

                   WHERE COMPILE_ID = l_abc_compile_id

                     AND  ORGANIZATION_ID = l_org_id ),

            LAST_UPDATE_DATE = SYSDATE,

            LAST_UPDATED_BY = l_last_update_by,

            COMPILE_DATE = SYSDATE

        WHERE COMPILE_ID = l_abc_compile_id

          AND ORGANIZATION_ID = l_org_id;

     else

       dbms_output.put_line('incorrect compile type');

     end if;

  else

     dbms_output.put_line('there is abc group assignment');   

  end if;

end;

示例如下

1. ABC编制头定义如下


2. 点击Compile这个时候的ABC编制头如下


3. 点击Print Compile生成的‘ABC descending value report’报表如下

 

4. 运行脚本并指定事物类型为,更新后的ABC编制头如下


5. 重新生成的‘ABC descending valuereport’报表如下

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值