22,210
社区成员
发帖
与我相关
我的任务
分享
DECLARE @FolderList varchar(800)
SET @FolderList='1'
SET NOCOUNT ON
CREATE TABLE #Temp(FolderId int)
INSERT #Temp
SELECT FolderId FROM Doc_Folder
WHERE CHARINDEX(','+LTRIM(FolderId)+',',','+@FolderList+',')>0
WHILE @@Rowcount>0
BEGIN
INSERT #Temp SELECT FolderId FROM Doc_Folder AS A WHERE
EXISTS(SELECT 1 FROM #Temp AS B WHERE B.[FolderId]=A.ParentFolderId)
AND NOT EXISTS(SELECT 1 FROM #Temp AS B WHERE B.[FolderId]=A.[FolderId])
END
SELECT * FROM #TEMP
DROP TABLE #TEMP
--生成测试数据
create table M_BOM(BILLID int,BOMVER int,GOODSID varchar(10),QTY int,USERDEF9 int)
insert into M_BOM select 1001,1001,'A',1,0
insert into M_BOM select 1002,1002,'B',1,0
insert into M_BOM select 1003,1003,'E',1,0
insert into M_BOM select 1004,1004,'M',1,0
insert into M_BOM select 1005,1005,'G',1,0
create table M_BOMD(BILLID int,GOODSID varchar(10),QTY int,USERDEF9 int)
insert into M_BOMD select 1001,'B',1,0
insert into M_BOMD select 1001,'C',1,0
insert into M_BOMD select 1001,'D',1,0
insert into M_BOMD select 1002,'E',1,0
insert into M_BOMD select 1002,'F',1,0
insert into M_BOMD select 1003,'J',1,0
insert into M_BOMD select 1003,'K',1,0
insert into M_BOMD select 1004,'E',1,0
insert into M_BOMD select 1004,'G',1,0
insert into M_BOMD select 1004,'P',1,0
insert into M_BOMD select 1005,'R',1,0
insert into M_BOMD select 1005,'S',2,0
create table GOODSUNIT(GOODSID varchar(10),PPRICE int)
insert into GOODSUNIT select 'A',0
insert into GOODSUNIT select 'B',0
insert into GOODSUNIT select 'C',1
insert into GOODSUNIT select 'D',1
insert into GOODSUNIT select 'F',1
insert into GOODSUNIT select 'J',1
insert into GOODSUNIT select 'K',1
insert into GOODSUNIT select 'P',1
insert into GOODSUNIT select 'R',1
insert into GOODSUNIT select 'S',1
go
--更新M_BOMD表BOM最底层价格信息
update a
set
a.USERDEF9=b.PPRICE
from
M_BOMD a,GOODSUNIT b
where
a.GOODSID=b.GOODSID
--逐级更新M_BOMD表BOM各层价格信息
while @@rowcount <>0
begin
update a
set
USERDEF9=(select sum(b.QTY*b.USERDEF9) from M_BOMD b,M_BOM c where a.GOODSID=c.GOODSID and b.BILLID=c.BILLID)
from
M_BOMD a
where
a.USERDEF9=0
and
not exists(select 1 from M_BOMD m,M_BOM n where a.GOODSID=n.GOODSID
and m.BILLID=n.BILLID and m.USERDEF9=0)
end
--更新M_BOM价格信息
update a
set
USERDEF9=(select sum(QTY*USERDEF9) from M_BOMD where BILLID=a.BILLID)
from
M_BOM a
--查看M_BOM更新结果
select * from M_BOM
/*
BILLID BOMVER GOODSID QTY USERDEF9
----------- ----------- ---------- ----------- -----------
1001 1001 A 1 5
1002 1002 B 1 3
1003 1003 E 1 2
1004 1004 M 1 6
1005 1005 G 1 3
*/
--查看M_BOMD更新结果
select * from M_BOMD
/*
BILLID GOODSID QTY USERDEF9
----------- ---------- ----------- -----------
1001 B 1 3
1001 C 1 1
1001 D 1 1
1002 E 1 2
1002 F 1 1
1003 J 1 1
1003 K 1 1
1004 E 1 2
1004 G 1 3
1004 P 1 1
1005 R 1 1
1005 S 2 1
*/
go
--删除测试数据
drop table M_BOM,M_BOMD,GOODSUNIT
go
M_BOMD a
where
a.USERDEF9=0 ----- 判断记录是否被更新过
and
not exists(select 1 from M_BOMD m,M_BOM n where a.GOODSID=n.GOODSID
and m.BILLID=n.BILLID and m.USERDEF9=0) -----判断下一级是否全更新过
--M的单价应该是6吧
--物料清单主表 M_BOM
IF OBJECT_ID('M_BOM') IS NOT NULL
DROP TABLE M_BOM
GO
CREATE TABLE M_BOM (BILLID NVARCHAR(20),BOMVER NVARCHAR(20),GOODSID NVARCHAR(20),QTY INT,USERDEF9 INT)
GO
--物料清单细表 M_BOMD
IF OBJECT_ID('M_BOMD') IS NOT NULL
DROP TABLE M_BOMD
GO
CREATE TABLE M_BOMD(BILLID NVARCHAR(20),GOODSID NVARCHAR(20),QTY INT,USERDEF9 INT)
GO
--
IF OBJECT_ID('GOODSUNIT') IS NOT NULL
DROP TABLE GOODSUNIT
GO
CREATE TABLE GOODSUNIT(GOODSID NVARCHAR(20),PPRICE INT)
-----DATA
INSERT INTO M_BOM SELECT
'1001','1001','A','1',0 UNION ALL SELECT
'1002','1002','B','1',0 UNION ALL SELECT
'1003','1003','E','1',0 UNION ALL SELECT
'1004','1004','M','1',0 UNION ALL SELECT
'1005','1005','G','1',0
INSERT INTO M_BOMD SELECT
'1001','B',1,0 UNION ALL SELECT
'1001','C',1,0 UNION ALL SELECT
'1001','D',1,0 UNION ALL SELECT
'1002','E',1,0 UNION ALL SELECT
'1002','F',1,0 UNION ALL SELECT
'1003','J',1,0 UNION ALL SELECT
'1003','K',1,0 UNION ALL SELECT
'1004','E',1,0 UNION ALL SELECT
'1004','G',1,0 UNION ALL SELECT
'1004','P',1,0 UNION ALL SELECT
'1005','R',1,0 UNION ALL SELECT
'1005','S',2,0
INSERT INTO GOODSUNIT SELECT
'A',0 UNION ALL SELECT
'B',0 UNION ALL SELECT
'C',1 UNION ALL SELECT
'D',1 UNION ALL SELECT
'F',1 UNION ALL SELECT
'J',1 UNION ALL SELECT
'K',1 UNION ALL SELECT
'P',1 UNION ALL SELECT
'R',1 UNION ALL SELECT
'S',1
---先更新末级存货
UPDATE M_BOMD SET USERDEF9 = PPRICE
FROM M_BOMD D
INNER JOIN GOODSUNIT ON D.GOODSID = GOODSUNIT.GOODSID
WHERE NOT EXISTS(SELECT 1 FROM M_BOM WHERE D.GOODSID=M_BOM.GOODSID)
WHILE @@rowcount<>0
BEGIN
UPDATE M_BOM SET M_BOM.USERDEF9= A.USERDEF9
FROM
(
SELECT M.BILLID,USERDEF9 = Sum(D.USERDEF9*D.QTY)
FROM M_BOM M INNER JOIN M_BOMD D ON M.BILLID=D.BILLID
GROUP BY M.BILLID
) A , M_BOM
WHERE A.BILLID=M_BOM.BILLID AND M_BOM.USERDEF9 = 0
AND M_BOM.BILLID NOT IN(
SELECT BILLID FROM M_BOMD WHERE ISNULL(M_BOMD.USERDEF9,0)=0
)
UPDATE M_BOMD SET USERDEF9 =M_BOM.USERDEF9
FROM M_BOM INNER JOIN M_BOMD ON M_BOMD.GOODSID=M_BOM.GOODSID WHERE M_BOMD.USERDEF9=0
END
select * from M_BOM
select * from M_BOMD
/*BILLID BOMVER GOODSID QTY USERDEF9
-------------------- -------------------- -------------------- ----------- -----------
1001 1001 A 1 5
1002 1002 B 1 3
1003 1003 E 1 2
1004 1004 M 1 6
1005 1005 G 1 3
(5 行受影响)
BILLID GOODSID QTY USERDEF9
-------------------- -------------------- ----------- -----------
1001 B 1 3
1001 C 1 1
1001 D 1 1
1002 E 1 2
1002 F 1 1
1003 J 1 1
1003 K 1 1
1004 E 1 2
1004 G 1 3
1004 P 1 1
1005 R 1 1
1005 S 2 1
(12 行受影响)
*/