BOM的意义与种类:料表又称为BOM(Bill Of Material),是制造业管理的重点之一,简单的定义就是“记载产品组成所需使用材料的表格”。以一个新产品的诞生来看:首先是创意与可行性研究的初期过程,接下来的过程就是初步的工程技术分析与原型产品的设计,等到原型产品比较稳定后,经过自制或外购分析(Make or Buy Analysis and Decision)后就会产生第一版的工程料表(EBOM, Engineering BOM)。到正式量产之前,第一版的生产料表(PBOM,Production BOM)必须要先完成,以便企业内的相关部门有所遵循。在此之后,就进入了正常的例行维护阶段。现将一般制造型企业内存在的BOM说明如下:
中文名称 |
英文名称 |
记载内容 |
主要用途 |
主要使用部门 |
工程料表 |
Engineering BOM |
新产品的用料结构 |
是研究开发单位与其他单位间针对新产品初始定义的沟通媒介及日后设变的处理平台 |
研究开发、生产技术 |
生产料表 |
Production BOM |
量产产品的用料结构 (企业内最多人使用) |
用于进行生产计划,采购计划的拟定,也是搭载选配及替代料表、成本料表的平台 |
生管物管、 采购外协、 营销财务 |
计划料表 |
Planning BOM |
产品族群比例关系(如某款式汽车手排档销量占30%,自排档销量占50%,手自排档销量占20%) |
用于进行中长期的原料采购、计划及生产产能负荷计划 |
生管物管、采购外协、营销 |
成本料表 |
Cost BOM |
产品的标准成本组成结构 |
用于查询产品标准成本之构成状况,通常使用于以标准成本立帐的企业 |
财务 |
选配料表 |
Configuration BOM |
产品的选配件结构 |
用于录入客户订单时让用户可以选择产品的选配件 |
营销、生管物管 |
替代料表 |
Substitute BOM |
产品的替代用料结构 |
用于进行物料计划时或实际进行生产时,针对本身数量不足,但替代零件足够的状况,以替代件替换原零件,以降低库存或避免缺料 |
生管物管、采购外协 |
保税料表 |
Tax-Bound BOM |
产品的保税料件结构 |
用于进行申请海关保税合同时能自动展开并计算应申请的保税料件种类及数量 |
生管物管、财务采购 |
存储过程之BOM初探
最近一直在研究ERP程序,自己也写了个小应用系统,现在虽然在研究中,但把我目前成果拿出来与大家共同探讨。
主要问题:根据BOM,库存,订单计算出物料需求
BOM(Bill of Materials)通常称为“物料清单”,就是产品结构(Product Structure)。
以下为所用到的表结构说明:
orders_mx:订单表明细,就是业务销售订单中所记录的产品及数量
storage:仓库状态表
BOM:产品结构表
BOM_need:制造产品所需求的物料及中间件
BOM_T:分解BOM时的临时表
下面是两种产品结构示意图:
存储在BOM中为:
库存状况如下:
订单状况:
A、B、C、D、M、B、B1、B2、D1、D2、D3、E、F实际库存情况见表storage,现要满足销售订单001需要各原材料多少?
如下存储过程完成以上要求:
CREATE PROCEDURE EX_ORDERS
/*本程序根据订单自动计算得出所需要采购的材料和应生产的产品数量*/
/*表BOM_need中layer=-1的即为要采购的材料或部件,其它的为要生产的产品*/
@order_num nvarchar(50)
AS
declare @layer int;
declare @eee int
BEGIN
set @layer=0
set @eee=(select max(layer) from bom )
delete BOM_T
delete BOM_need
/*订单数量与仓库产品数量做差放入需求表 step1*/
insert into BOM_need (internel,need)
select orders_mx.internel,orders_mx.counts-storage.available_q as need from orders_mx,storage
where orders_mx.internel=storage.num and orders_mx.order_num=@order_num
/*step2*/
while not(@layer>@eee)
begin
insert into BOM_T (internel,up_internel,layer,counts)
select bom.internel,bom.up_internel,bom.layer,bom.counts*n.need as counts from bom,BOM_need as n
where bom.up_internel in (select internel from BOM_need where layer=@layer)
and bom.up_internel=n.internel
insert into BOM_need (internel,need,layer)
select b.internel,sum(b.counts)-s.available_q as counts,b.layer from BOM_T as b,storage as s
where s.num=b.internel group by internel,layer,s.available_q
delete BOM_T
set @layer=@layer+1
end
END
GO
讲解
1.清空临时表BOT_T和需求表BOM_need,并在BOM表中找出最大LAYER值放入一个变量,做为要循环的次数
set @layer=0
set @eee=(select max(layer) from bom )
delete BOM_T
delete BOM_need
2.订单数量与仓库可用量做差放入需求表BOM_need
insert into BOM_need (internel,need)
select orders_mx.internel,orders_mx.counts-storage.available_q as need from orders_mx,storage
where orders_mx.internel=storage.num and orders_mx.order_num=@order_num
此时表BOM_need中内容如下:
3.循环直至@layer>@eee,每次@layer自加一
3.1在BOM表中找出layer=@layer的记录并且把数量counts与up_internel等于BOM_need中的internel需求量need相乘
insert into BOM_T (internel,up_internel,layer,counts)
select bom.internel,bom.up_internel,bom.layer,bom.counts*n.need as counts from bom,BOM_need as n
where bom.up_internel in (select internel from BOM_need where layer=@layer)
and bom.up_internel=n.internel
此时表BOM_T中内容如下:
3.2汇总B OM_T并与可用量相减更新BOM_need表
insert into BOM_need(internel,need,layer)
select b.internel,sum(b.counts)-s.available_q as counts,b.layer from BOM_T as b,storage as s
where s.num=b.internel group by internel,layer,s.available_q
此时表BOM_need中内容如下:
3.3清空表BOM_T并让@layer加一
delete BOM_T
set @layer=@layer+1
4.循环结束后表BOM_need内容如下:
其中:
layer=-1的记录即为需要采购的原材料或外购件,layer=0的即为所需生产的产品,layer>-1的即为需要车间生产的产品或中间件
附:本例中各次循环后的表BOM_T与表BOM_need的内容变化
终于弄完了,可能写的也不周到,欢迎大家一起研究吧!
PS:像产品中的中间件B,本例中在二种产品中它的层次相同,至于如果层次不同,则不适用本教程,目前在进一步研究中!