不知道这里有没有在企业(非IT)做数据管理的啊~!!!一般企业都有ERP,其中有一个关于BOM结构的~!!
我现在想通过1个产成品的品号查出所有下面的品号,表结构如下:
产品名称     产品品号       下阶品号     下阶产品名称                  (即产品由它组成的)
桌子          123456          888888        木头
桌子          123456          999999        钉子
木头          888888          000000        原木
钉子          999999          111111        不锈钢
.......下面可能还有很多
我现在想通过1个桌子的品号查出下面所有组成它物件!!(示例中就包括了木头、钉子、原木、不锈钢)
麻烦各位老大指导下!!!!

解决方案 »

  1.   

    http://topic.csdn.net/u/20090730/16/07db54d5-80aa-441b-9018-e728254f106e.html
      

  2.   

    料表是个典型的问题,论坛有很多解决方案的。
    给个参考方案,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
      

  3.   

    这个不就是ERP是的子件查询功能吗?
    难道你用的那个ERP没这个功能?
    还要自己写
      

  4.   

    http://blog.csdn.net/htl258/archive/2009/04/03/4014748.aspx
      

  5.   

    大哥你怎么也头大啊?
    --测试数据
    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  招远市*/
    这是你的帖子里面的啊,谁能帮我解释一下这段代码啊??具体点啊,谢谢了~!