不知道这里有没有在企业(非IT)做数据管理的啊~!!!一般企业都有ERP,其中有一个关于BOM结构的~!!
我现在想通过1个产成品的品号查出所有下面的品号,表结构如下:
产品名称 产品品号 下阶品号 下阶产品名称 (即产品由它组成的)
桌子 123456 888888 木头
桌子 123456 999999 钉子
木头 888888 000000 原木
钉子 999999 111111 不锈钢
.......下面可能还有很多
我现在想通过1个桌子的品号查出下面所有组成它物件!!(示例中就包括了木头、钉子、原木、不锈钢)
麻烦各位老大指导下!!!!
我现在想通过1个产成品的品号查出所有下面的品号,表结构如下:
产品名称 产品品号 下阶品号 下阶产品名称 (即产品由它组成的)
桌子 123456 888888 木头
桌子 123456 999999 钉子
木头 888888 000000 原木
钉子 999999 111111 不锈钢
.......下面可能还有很多
我现在想通过1个桌子的品号查出下面所有组成它物件!!(示例中就包括了木头、钉子、原木、不锈钢)
麻烦各位老大指导下!!!!
给个参考方案,create table #i_temp_bom
(
PPLANT nvarchar(8),
PITEM nvarchar(20),
CPLANT nvarchar(8),
CITEM nvarchar(20),
EFFECTIVEDATE datetime,
DISCONTINUEDATE datetime,
USAGE decimal(18,6)
)
insert into #i_temp_bom(PPLANT,PITEM,CPLANT,CITEM,USAGE,EFFECTIVEDATE,DISCONTINUEDATE)
select distinct A.PPLANT,A.PITEM,A.CPLANT,A.CITEM,A.USAGE,A.EFFECTIVEDATE,A.DISCONTINUEDATE
from TBLBOM A
inner join (select distinct PPLANT,PITEM from TBLBOM)T on T.PPLANT=A.CPLANT and T.PITEM=A.CITEM
while exists(select top 1 * from #i_temp_bom)
begin
insert into TBLBOM (PPLANT,PITEM,CPLANT,CITEM,USAGE,EFFECTIVEDATE,DISCONTINUEDATE)
select B.PPLANT,B.PITEM,A.CPLANT,A.CITEM,A.USAGE*B.USAGE,
case when A.EFFECTIVEDATE>=B.EFFECTIVEDATE then A.EFFECTIVEDATE else B.EFFECTIVEDATE end,
case when A.DISCONTINUEDATE<=B.DISCONTINUEDATE then A.DISCONTINUEDATE else B.DISCONTINUEDATE end
from TBLBOM A
inner join #i_temp_bom B on B.CPLANT=A.PPLANT and B.CITEM=A.PITEM
delete TBLBOM
from #i_temp_bom A
where TBLBOM.PPLANT=A.PPLANT and TBLBOM.PITEM=A.PITEM and TBLBOM.CPLANT=A.CPLANT and TBLBOM.CITEM=A.CITEM
truncate table #i_temp_bom
insert into #i_temp_bom(PPLANT,PITEM,CPLANT,CITEM,USAGE,EFFECTIVEDATE,DISCONTINUEDATE)
select distinct A.PPLANT,A.PITEM,A.CPLANT,A.CITEM,A.USAGE,A.EFFECTIVEDATE,A.DISCONTINUEDATE
from TBLBOM A
inner join (select distinct PPLANT,PITEM from TBLBOM)T on T.PPlant=A.CPlant and T.PItem=A.CItem
end
drop table #i_temp_bom
难道你用的那个ERP没这个功能?
还要自己写
--测试数据
if OBJECT_ID('tb') is not null
drop table tb
go
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO
--2000的方法--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
declare @Level int
set @level=1
insert @t_level select @id,@level
while @@rowcount>0
begin
set @level=@level+1
insert @t_Level select tb.id,@level
from tb join @t_level t on tb.pid=t.id
where t.level+1=@level
end
return
endselect tb.*
from tb join dbo.f_cid('002') b
on tb.ID=b.id
/*
ID PID Name
---- ---- ----------
002 001 烟台市
004 002 招远市*/
这是你的帖子里面的啊,谁能帮我解释一下这段代码啊??具体点啊,谢谢了~!