WIP:工单生产料件展开标准BOM

用户需求是想通过WIP之BOM与标准BOM之间的差异来计算损耗。所以需要先展开BOM。

曾试过一个SQL展开BOM情况,速度比较慢,而且还比较麻烦,于是根据公司标准BOM中最多2层虚拟BOM,自己写一个速度快很多。

[@more@]

1.建立一个TABLE,用来根据工单生产料件进行展开BOM,并插入其中
CREATE TABLE CUX_WIP_BOM
(
ORGANIZATION_ID NUMBER,
ASSEMBLY_ITEM_ID NUMBER,
COMPONENT_ITEM_ID NUMBER,
COMPONENT_QUANTITY NUMBER,
COMPONENT_EXTEND_QUANTITY NUMBER,
PARA_DATE VARCHAR(6),
RUN_DATA DATE
)
2. 写一个procedure,用来展开工单生产料件BOM,并插入上面table

CREATE OR REPLACE PROCEDURE CUX_WIP_BOM_EXPLORE(P_YEARMONTH IN VARCHAR2) AS
I NUMBER;
J NUMBER;
H NUMBER;
F NUMBER;
E NUMBER;
BEGIN
DELETE FROM CUX_WIP_BOM;

COMMIT;

BEGIN
FOR K IN --根据工单机型号,展开第一阶标准BOM
(SELECT DISTINCT --剔除重复记录

WE.ORGANIZATION_ID,
WE.PRIMARY_ITEM_ID ASSEMBLY_ITEM_ID,
MSI.SEGMENT1,
BIC.COMPONENT_ITEM_ID,
BIC.COMPONENT_QUANTITY,
BIC.COMPONENT_YIELD_FACTOR,
ITEM.ITEM_TYPE
FROM
WIP_DISCRETE_JOBS WDJ ,
WIP_ENTITIES WE,
MTL_SYSTEM_ITEMS_B MSI,
BOM_BILL_OF_MATERIALS BOM,
BOM_INVENTORY_COMPONENTS BIC,
MTL_SYSTEM_ITEMS_B ITEM
WHERE WE.ORGANIZATION_ID=WDJ.ORGANIZATION_ID
AND WE.WIP_ENTITY_ID=WDJ.WIP_ENTITY_ID
AND WE.ORGANIZATION_ID=MSI.ORGANIZATION_ID
AND WE.PRIMARY_ITEM_ID=MSI.INVENTORY_ITEM_ID
AND MSI.SEGMENT1 NOT LIKE 'X%'
AND TO_CHAR(WDJ.DATE_CLOSED,'YYYYMM')=P_YEARMONTH
AND MSI.ORGANIZATION_ID=BOM.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID=BOM.ASSEMBLY_ITEM_ID
AND BOM.BILL_SEQUENCE_ID=BIC.BILL_SEQUENCE_ID
AND ((TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND (BIC.DISABLE_DATE IS NULL OR TO_CHAR(BIC.DISABLE_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd'))
)
OR (TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd') AND BIC.CHANGE_NOTICE IS NOT NULL )
)
AND TO_CHAR(BIC.IMPLEMENTATION_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND BOM.ALTERNATE_BOM_DESIGNATOR IS NULL
AND ITEM.ORGANIZATION_ID=MSI.ORGANIZATION_ID
AND ITEM.INVENTORY_ITEM_ID=BIC.COMPONENT_ITEM_ID
) LOOP
I:=K.COMPONENT_QUANTITY/K.COMPONENT_YIELD_FACTOR;
IF K.ITEM_TYPE<>'XNJ' THEN
INSERT INTO CUX_WIP_BOM VALUES(K.ORGANIZATION_ID,
K.ASSEMBLY_ITEM_ID,
K.COMPONENT_ITEM_ID,
K.COMPONENT_QUANTITY,
I,
P_YEARMONTH,
SYSDATE
);
COMMIT;

ELSE

FOR L IN (SELECT --展开第一层中含虚拟BOM
BOM.ORGANIZATION_ID,
BOM.ASSEMBLY_ITEM_ID,
BIC.COMPONENT_ITEM_ID,
BIC.COMPONENT_QUANTITY,
BIC.COMPONENT_YIELD_FACTOR,
ITEM.SEGMENT1,
ITEM.ITEM_TYPE
FROM BOM_BILL_OF_MATERIALS BOM,
BOM_INVENTORY_COMPONENTS BIC,
MTL_SYSTEM_ITEMS_B ITEM
WHERE 1=1
AND BOM.BILL_SEQUENCE_ID=BIC.BILL_SEQUENCE_ID
AND ((TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND (BIC.DISABLE_DATE IS NULL OR TO_CHAR(BIC.DISABLE_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd'))
)
OR (TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd') AND BIC.CHANGE_NOTICE IS NOT NULL )
)
AND TO_CHAR(BIC.IMPLEMENTATION_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND BOM.ALTERNATE_BOM_DESIGNATOR IS NULL
AND ITEM.INVENTORY_ITEM_ID=BIC.COMPONENT_ITEM_ID
AND ITEM.ORGANIZATION_ID=K.ORGANIZATION_ID
AND BOM.ORGANIZATION_ID=K.ORGANIZATION_ID
AND BOM.ASSEMBLY_ITEM_ID=K.COMPONENT_ITEM_ID ) LOOP

J:=L.COMPONENT_QUANTITY/L.COMPONENT_YIELD_FACTOR;
H:=I*J;

IF L.ITEM_TYPE<>'XNJ' THEN
INSERT INTO CUX_WIP_BOM VALUES(K.ORGANIZATION_ID,
K.ASSEMBLY_ITEM_ID,
L.COMPONENT_ITEM_ID,
L.COMPONENT_QUANTITY,
H,
P_YEARMONTH,
SYSDATE);
COMMIT;




ELSE
FOR M IN (SELECT --展开第二层中含虚拟BOM
BOM.ORGANIZATION_ID,
BOM.ASSEMBLY_ITEM_ID,
BIC.COMPONENT_ITEM_ID,
BIC.COMPONENT_QUANTITY,
BIC.COMPONENT_YIELD_FACTOR,
ITEM.SEGMENT1,
ITEM.ITEM_TYPE
FROM BOM_BILL_OF_MATERIALS BOM,
BOM_INVENTORY_COMPONENTS BIC,
MTL_SYSTEM_ITEMS_B ITEM
WHERE 1=1
AND BOM.BILL_SEQUENCE_ID=BIC.BILL_SEQUENCE_ID
AND ((TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND (BIC.DISABLE_DATE IS NULL OR TO_CHAR(BIC.DISABLE_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd'))
)
OR (TO_CHAR(BIC.EFFECTIVITY_DATE,'yyyy-mm-dd')>=TO_CHAR(SYSDATE,'yyyy-mm-dd') AND BIC.CHANGE_NOTICE IS NOT NULL )
)
AND TO_CHAR(BIC.IMPLEMENTATION_DATE,'yyyy-mm-dd')<=TO_CHAR(SYSDATE,'yyyy-mm-dd')
AND BOM.ALTERNATE_BOM_DESIGNATOR IS NULL
AND ITEM.INVENTORY_ITEM_ID=BIC.COMPONENT_ITEM_ID
AND ITEM.ORGANIZATION_ID=L.ORGANIZATION_ID
AND BOM.ORGANIZATION_ID=L.ORGANIZATION_ID
AND BOM.ASSEMBLY_ITEM_ID=L.COMPONENT_ITEM_ID
AND ITEM.SEGMENT1 NOT LIKE 'X%' ) LOOP

F:=M.COMPONENT_QUANTITY/M.COMPONENT_YIELD_FACTOR;
E:=F*H;

INSERT INTO CUX_WIP_BOM VALUES(K.ORGANIZATION_ID,
K.ASSEMBLY_ITEM_ID,
M.COMPONENT_ITEM_ID,
M.COMPONENT_QUANTITY,
E,
P_YEARMONTH,
SYSDATE);

END LOOP;

END IF;
END LOOP;

END IF ;

END LOOP;

END;
--END ;
END CUX_WIP_BOM_EXPLORE;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/41594/viewspace-1014433/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/41594/viewspace-1014433/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计划阶段 图纸管理:记录所以设计师的图纸,以及更改的记录;方便查询。 BOM管理:即产品结构清单,进行MRP运算后,可以即时了解订单是否能按时完成,都需要用到哪些物料等,物料中哪些是需要采购的,那些是需要自产的; 工艺管理:用工序来管理生产流程,为生产排产提供基础。 生产报价:提供产前报价功能,可以产后进行对比,盈亏一目了然。 生产阶段 生产排单:按单生产,(可以直接引用销售单),亦可以通过BOM快速生成半成品,零件等生产计划,通过树状的形式体现; 采购需求清单:可以按单或者多张生产单一起通过MRP运算,计算所需采购的清单,及时下单,保证物料及时到; 进度控制:通过工艺来管理生产进度,针对工艺下达加工单、验收,可以实时查看生产的进度; 质量管理:检验人员在验收的时候可以针对工艺内容严格验收;如发生质量问题也可以直接找到负责人; 生产中成本控制:部门根据工艺内容设定的所需原料进行领料,加工完成后如有余料可以退回仓库,如有废料可以退回废料仓,严格控制物料的浪费。 委外加工:支持外协厂加工以及加工费用的统计。 完成阶段 生产成本核算:自动统计料、工、费的成本,在完成入库的时候自动计算成本单价; 查询盈利状况:在生产单里面可以按单对比产前报价,查询订单盈利情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值