SQL中多阶BOM依次展开及按级次顺序显示问题
下图为要实现的具体图,请高手帮忙做一个存储过程,分数还可以增加。不能修改基础表的结构,查询后的结构一定要按级次顺序展开。按lzh3452提问修改了一下,品名是可以用主件品...
下图为要实现的具体图,请高手帮忙做一个存储过程,分数还可以增加。不能修改基础表的结构,查询后的结构一定要按级次顺序展开。
按lzh3452提问修改了一下,品名是可以用主件品名与子件品名。分数也做提高了。 展开
按lzh3452提问修改了一下,品名是可以用主件品名与子件品名。分数也做提高了。 展开
4个回答
展开全部
看你前面一个答案是说易飞ERP的BOM程式﹐我就直接帮你写易飞的SQL吧﹐参考以下代码
会用到一个临时表
DECLARE @MC001 VARCHAR(20)
DECLARE @MD001 VARCHAR(20)
DECLARE @NEXT INT
DECLARE @LEVEL INT
SET @MC001='901-001'
SET @NEXT=0
SET @LEVEL=0
CREATE TABLE #BOMTREE
(
LEVEL INT,--阶层
MD001 VARCHAR(20),--主件品号
MD003 VARCHAR(20),--元件品号
MD006 INT,--组成用量
MD007 INT,--底数
MB025 VARCHAR(10),--品号属性
MB026 VARCHAR(10),--低阶码
MB046 NUMERIC(17))--标准进价
IF EXISTS(SELECT * FROM BOMMD WHERE MD001=@MC001)
BEGIN
WHILE @NEXT<2
BEGIN
IF @NEXT=0
BEGIN
INSERT INTO #BOMTREE SELECT @LEVEL AS LEVEL,@MC001,@MC001,1,1,'M','00',0
INSERT INTO #BOMTREE SELECT @LEVEL AS LEVEL, MD001,MD003,MD006,MD007,MB025,MB026,MB046 FROM BOMMD LEFT JOIN INVMB ON MD003=MB001 WHERE MD001=@MC001
SET @NEXT=1
END
IF (SELECT COUNT(MD001) FROM #BOMTREE WHERE LEVEL=@LEVEL AND (MB025='M' OR MB025='S'))>0 AND @NEXT=1
BEGIN
SET @LEVEL=@LEVEL+1
INSERT INTO #BOMTREE SELECT @LEVEL AS LEVEL, MD001,MD003,MD006,MD007,MB025,MB026,MB046 FROM BOMMD LEFT JOIN INVMB ON MD003=MB001 WHERE MD001 IN(SELECT MD003 FROM #BOMTREE WHERE (MB025='M' OR MB025='S') AND LEVEL=@LEVEL-1)
SET @NEXT=1
END
ELSE
BEGIN
SET @NEXT=2
END
END
--更新上阶制费
DECLARE @COUNT INT
SELECT @COUNT=COUNT(DISTINCT LEVEL) FROM #BOMTREE
WHILE @COUNT>0
BEGIN
--SUM((CONVERT(DECIMAL(16,6),MD006)/CONVERT(DECIMAL(16,6),MD007)*MB046))有底数的BOM
UPDATE #BOMTREE SET MB046=B.NEW_MB050 FROM #BOMTREE A ,(SELECT MD001,SUM((MD006/MD007)*MB046) AS NEW_MB050 FROM #BOMTREE WHERE LEVEL=@COUNT GROUP BY MD001) B WHERE (MB025='M' OR MB025='S') AND A.MD003=B.MD001 AND LEVEL=@COUNT-1
SET @COUNT=@COUNT-1
END
END
SELECT * FROM #BOMTREE
DROP TABLE #BOMTREE
效果参考下图
展开全部
品号表的单价不全,计算还得写个函数,不如先查出来DEF的单价存在变量里,然后写个方法,传入参数是DEF的单价和名称,处理是根据这四个参数和换算关系计算成本并返回。
select T1.低阶码, T1.品号 AS 元件品号, T1.品名 AS 元件品名, Sum(FncJisanChengBen(T2.名称, 单价D, 单价E, 单价F)) 标准成本
from product T1, bom T2
where T1.品号=T2.主件品名 AND T1.名称=T2.品名 AND T1.品名 = 'A'
这就是结果A了
但你说不能改表结构,可是你bom表里有两个品名列,这是不可能的!
select T1.低阶码, T1.品号 AS 元件品号, T1.品名 AS 元件品名, Sum(FncJisanChengBen(T2.名称, 单价D, 单价E, 单价F)) 标准成本
from product T1, bom T2
where T1.品号=T2.主件品名 AND T1.名称=T2.品名 AND T1.品名 = 'A'
这就是结果A了
但你说不能改表结构,可是你bom表里有两个品名列,这是不可能的!
追问
BOM中的两列品名已经分别用主件品名,和子件品名了,请给答案,分数也提高了。
追答
那就改下sql呗
select T1.低阶码, T1.品号 AS 元件品号, T1.品名 AS 元件品名, Sum(FncJisanChengBen(T2.子件品名, 单价D, 单价E, 单价F)) 标准成本
from product T1, bom T2
where T1.品号=T2.主件品名 AND T1.名称=T2.主件品名 AND T1.品名 = 'A'
这样就行了
FncJisanChengBen这个用if 判断子件品名的值就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询