BOM 死循环如何检测问题,如下,如何检测循环A—D—F—A    
BOM结构(料号1、料号2、品名1、品名2、单位用量、....等等字段)
料号1(上阶) 料号2(下阶)
A B
A C
A D
D E
D F
D G
F A
F H
CSDN查阅过其他资料:http://blog.csdn.net/htl258/article/details/5456223
但是料号的字段有可能是6位或者7位,也就是不固定的,所以不大适合,不知道各位有什么其他更好的方法,我想写在存储过程中存储过程死循环BOM结构层次结构树形结构

解决方案 »

  1.   

    加一个 used 字段,作过父节点,即设为1
      

  2.   

    你这个结构给你的最高节点A加一个父节点比如这样的A null然后节点是不能重复的找到有重复的就是出错的。
      

  3.   

    --> 测试数据:#tb
    IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
    GO 
    CREATE TABLE #tb([父节点] VARCHAR(1),[节点] VARCHAR(1))
    INSERT #tb
    SELECT NULL,'A' UNION ALL
    SELECT 'A','B' UNION ALL
    SELECT 'A','C' UNION ALL
    SELECT 'A','D' UNION ALL
    SELECT 'D','E' UNION ALL
    SELECT 'D','F' UNION ALL
    SELECT 'D','G' UNION ALL
    SELECT 'F','A' UNION ALL
    SELECT 'F','H'
    --------------开始查询--------------------------SELECT [节点] FROM #tb GROUP BY [节点] HAVING COUNT(*)>1
    ----------------结果----------------------------
    /* 
    节点
    A
    */
      

  4.   


    你这样好像也不可行呢,如果节点G下面有H和I子节点呢?这样变成H也存在循环了.....实际H应该不是循环吧
      

  5.   


    你这样好像也不可行呢,如果节点G下面有H和I子节点呢?这样变成H也存在循环了.....实际H应该不是循环吧

    这种情况的话,需要用游标去遍历了
    原理应该是那些下级包含有自己的都是错的。
      

  6.   

    BOM多层,通常是作层次控制,比如超过20报错即可
      

  7.   


    你这样好像也不可行呢,如果节点G下面有H和I子节点呢?这样变成H也存在循环了.....实际H应该不是循环吧

    这种情况的话,需要用游标去遍历了
    原理应该是那些下级包含有自己的都是错的。
    哎,我只想到一个笨方法了,类似您说的,使用游标遍历,将每个子节点和其所有的父节点插入一个临时表中,每次插入前,检查是否存在其所对应的父节点中......只是这样耗时多点,暂时没有其他办法了......
      

  8.   


    你这样好像也不可行呢,如果节点G下面有H和I子节点呢?这样变成H也存在循环了.....实际H应该不是循环吧

    这种情况的话,需要用游标去遍历了
    原理应该是那些下级包含有自己的都是错的。
    哎,我只想到一个笨方法了,类似您说的,使用游标遍历,将每个子节点和其所有的父节点插入一个临时表中,每次插入前,检查是否存在其所对应的父节点中......只是这样耗时多点,暂时没有其他办法了......
    我也想不到更好的。呵呵