你的BOM结构是有问题的,怎么可能出现一个D中还有一个D,你现在找出来想干什么?

解决方案 »

  1.   

    1:展开时用临时表记录下子结点的序号(用字母A,B,C ...表示)和层次,料号
    2:下一层的序号用上一层的序号加上本层的序号表示(如第二层用AA,AB,AC,BA,BB,BC ... )表示
    3: 层次为1的开始循环,设定最大循环次数(如20)
       查所有头几位序号相同且层次大于当前层次的料号是否相同。
       
    eg:
         A
                 |
      -----------------------------
      |        |                   |
      B        C                   D 
             ------      ------------------
            |      |     |        |        |
            D0     D     D1       D2       D3
                                  |
                               ----------
                              |          |
                              D         D4
    如例:
    存到临时表的资料为
    序号 层次 料号
    A       0       A
    AA      1 B
    AB 1 C
    AC 1 D
    ABA 2 D0
    ABB 2 D
    ACA 2 D1
    ACB 2 D2
    ACC 2 D3
    ACBA 3 D
    ACBB 3 D4第一次循环:查序号第一位为A且层次大于0的料号是否有相同的(无)
    第二次循环:查序号头两位为AA且层次大于1的料号是否有相同的(无)
    第三次循环:查序号头两位为AB且层次大于1的料号是否有相同的(无)
    第四次循环:查序号头两位为AC且层次大于1的料号是否有相同的(有,为ACBA,层次为3,料号为D)
      

  2.   

    to: CrazyFor
       因为我的BOM系统是用主从表的结构做了,当工程人员在架设BOM时,由于BOM层数多且复九,在做第4-6层是,时不是不小心,把BOM单身中的半成品编号又调用到了第2或3层中的半成品编号,所以有BOM死循环的情况。
      

  3.   

    参考:
    http://expert.csdn.net/Expert/topic/1375/1375432.xml?temp=.8570978
    --得到当前ID到顶层的ID串
    declare @aa varchar(8000)
    set @aa=dbo.fn_32gettopclass(78,default,1,default)
    print @aaselect * from 表 where charindex(','''+cast(tc_id as varchar)+',''' , ','''+dbo.fn_32gettopclass(78,default,1,default)+'''')>0
      

  4.   

    不同的东西,怎么可以用一个代码?你可以定义两个BOM,也不要用这种BOM!
                 A1
                 |
      -----------------------------
      |        |                   |
      B        C                   D 
             ------      ------------------
            |      |     |        |        |
            D0     D     D1       D2       D3
                                  |
                               ----------
                              |          |
                              D         D4
        A2
                 |
      ------------------------------
      |        |                   |
      B        C                   D 
             ------      
            |      |     
            D0     D     
      

  5.   

    先看看这个算最低层码的代码:1:物料主文件中至少有这两个字段
    itemNo,llc
    2:BOM中至少有这两个字段 (树状)
    parentItem,itemNo
    3:Create  Procedure LLC
    As
    Update 物料主文件 set llc = 0  --先将LLC全部清为0
    Declare @i tinyint
    Set @i = 0
    While @i <= 10  -- 假设BOM最多只有10层
    Begin
    Update a Set a.llc = @i + 1    --子结点的LLC加1
    From 物料主文件 a
    Join bom b on a.itemNo = b.itemNo 
    Join 物料主文件 c on c.itemNo = b.parentItem 
    where c.llc = @i
    Set @i = @i + 1
    End/*********** Usage:   Exec LLC             *******/
    如上:
    先算最低层码,假设BOM中最多只有8层,你算出来如果有最低层码为10的,那就一定有问题了。