是这样的:现在BOM  的结构为三个字段  Parent  Item  No.,Item  No.,Qty,分别表示母件的编号,子件的编号,一个母件占用子件的数量,我现在想实现一个功能:假设有三个个子件A,B,C,我想实现的算法是:所有的母件里面,含有1个A,2个B,3个C的所有的母件的物料编号------------------------------------我现在的做法是,首先查找含有1个A的所有的母件编号,然后扔进一个临时表,然后再从临时表里面从头到尾过滤,看看,哪个没有含有2个B,如果没有含有2个B的,就从临时表里面删除,这样,临时表剩下的数据,再过滤,看看,有没有含有3个C的....,照此类推.  
这样,临时表里面剩下的数据,肯定就是满足所有条件的,但是不知道有没有更好的算法,欢迎大家讨论!

解决方案 »

  1.   


    CREATE function dbo.aa(@ITEM_CODE VARCHAR(20))      
    returns  @table table(PARENT VARCHAR(20),ITEM_CODE VARCHAR(20),SHW_QTY DECIMAL(10,2),LOSS_QTY DECIMAL(10,4),BOM_UNIT VARCHAR(10),level int)      
    AS      
    BEGIN       
    declare @level int      
    set @level=1      
    insert INTO @table      
    SELECT PARENT,ITEM_CODE,SHW_QTY,QTY_W_LOSS*(1+P_LOSS/100),BOM_UNIT,@level      
    FROM BOM1 WHERE PARENT=@ITEM_CODE COLLATE Latin1_General_BIN      
          
    WHILE @@rowcount>0       
    BEGIN      
    set @level=@level+1      
    insert into @table       
    SELECT A.PARENT,A.ITEM_CODE,A.SHW_QTY*B.SHW_QTY,A.QTY_W_LOSS*(1+A.P_LOSS/100)*B.SHW_QTY,A.BOM_UNIT ,@level      
    FROM BOM1 A,@table B WHERE A.PARENT=B.ITEM_CODE COLLATE Latin1_General_BIN      
    and  B.level=@level-1      
    END      
    return       
    END     
    這是我在我們公司寫的BOM核算代碼,這是順推,反推也一樣的
      

  2.   

    我现在的做法是,首先查找含有1个A的所有的母件编号,然后扔进一个临时表,然后再从临时表里面从头到尾过滤,看看,哪个没有含有2个B,如果没有含有2个B的,就从临时表里面删除,这样,临时表剩下的数据,再过滤,看看,有没有含有3个C的....,可以用函数返回全部对应关系到临时表,如楼上的函数,然后如下查询
    select * into #
    from dbo.aa('0')select PARENT
    from # a
    where ITEM_CODE='A' and SHW_QTY =1
    and exists (
    select 1 from # where ITEM_CODE='B' and SHW_QTY =2
    and PARENT=a.PARENT
    )
    and exists (
    select 1 from # where ITEM_CODE='C' and SHW_QTY =3
    and PARENT=a.PARENT
    )