设为首页 收藏本站
查看: 1369|回复: 0

[经验分享] EBS 中如何自定义ABC编制(ABC Compile)

[复制链接]

尚未签到

发表于 2017-5-24 07:52:24 | 显示全部楼层 |阅读模式
  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编制头定义如下
DSC0000.jpg

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

  3.点击Print Compile生成的‘ABC descending value report’报表如下
  4.运行脚本并指定事物类型为,更新后的ABC编制头如下
DSC0002.jpg

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-380201-1-1.html 上篇帖子: EBS Form开发中LOV和Editor介绍 下篇帖子: PTIAN EBS FORM开发(一)之 环境配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表