SQL疑难请教
A
B C
D
A是成品,B是半成品,C和D是原材料
--BOM 展开后的表(此部分已经实现)
CREATE TABLE [dbo].[TMP_BOM]
(
[母件编码] [varchar] (100) ,
[子件编码] [varchar] (100) ,
[基本用量] [float] NULL,
[cpath] [varchar] (1000) ,
) ON [PRIMARY]
GO
INSERT INTO dbo.TMP_BOM ( 母件编码, 子件编码, 基本用量, cpath)
SELECT 'A', 'B', 1, '10' UNION
SELECT 'A', 'C', 1, '20' UNION
SELECT 'A', 'D', 2, '10-10'
--库存表
CREATE TABLE tmp_kc(物料编码 VARCHAR(50),数量 int)
INSERT INTO dbo.tmp_kc ( 物料编码, 数量 )
SELECT 'A',10 UNION
SELECT 'B',20
SELECT 'D',10
--想要的效果
--输入产品(A)数量100,首先扣减库存表中的产品A的数量 10,得出A欠料90
--半成品B欠料数量90减去库存20,得出B欠料70
--原材料D欠料70*2-减去库存10,得出欠料130
--原材料C欠料90
母件编码 子件编码 基本用量 cpath 需求数量 库存分配数量 欠料数量
A A 1 10 100 10 90
A B 1 10 90 20 70
A D 2 10-10 140 10 130
A C 1 20 90 0 90
想要的效果 展开
展BOM又见展BOM。
你这个是排产时给别人看材料消耗情况的。欠料哪里考虑未必全欠,应该负数部分等于零,是给生产领料用的。你的表结构明显不支持边角料,不过估计是作业来的吧。
首先这个需要有2个问题:
1,A不应该存在A子件。A应该先查库存量,在进行排产所以你的这个逻辑错误了,我就将错就错写出来。
2,B欠料70,但是原材料D欠料70*2?B和D没有直接关联,应该是90*2=180
下面就是根据你的需求执行的结果
sql如下:
begin
DECLARE @fullno int
set @fullno = 100
select 物料编码 母件编码,物料编码 子件编码,1 基本用量,'10' cpath ,@fullno 需求数量,数量 库存分配数量,@fullno-数量 欠料数量
from tmp_kc where 物料编码 ='A'
UNION all
select *,(@fullno-(select 数量 from tmp_kc where 物料编码 =TMP_BOM.母件编码))* 基本用量 需求数量
,isnull((select 数量 from tmp_kc where 物料编码 =TMP_BOM.子件编码),0) 库存分配数量
,(@fullno-(select 数量 from tmp_kc where 物料编码 =TMP_BOM.母件编码))* 基本用量 -
isnull((select 数量 from tmp_kc where 物料编码 =TMP_BOM.子件编码),0) 欠料数量
from TMP_BOM
where 母件编码='A'
end