-------C (在这一层的子件编号不允许为A)
     |
     |
A----|
     |        -----C
     |       |  
     |       |
      -------B-----D   (在这一层的子件编号不允许为A或者B, 但可以为C, 依此
             |          类推)
             |
              -----X
如何用算法实现,是否要用到遍历或什么的?,如何包这种结构用TreeList实现这种结构。希望能详细些

解决方案 »

  1.   

    只用一个表就可实现,这个表里用一个物资编码来区分各种物资,当然这种编码是有规律的,它存储了结构关系。在运算上很好实现,并且,用delphi的树形控件也很好再现。
    这是一种实用的算法,但不是最好的算法吧。反正我是这么用的。
      

  2.   

    在数据库里先用表表示(父级编码ParentNo,子级编码ChildNo,层次Order)
    定义好数据结构及其中的关系,就以你的图为例,它可以用上表表示为:(a,b,1)、(a,c,1)、(b,c,2)、(b,d,2)、(b,x,2)
    更改表时注意每一层的子级不可以为它的上级(父级、祖父),程序只要简单的遍历就可以了。
      

  3.   

    主从表
    主表存储主件, 从表存储组件.主件与组件都来自品号.上图就是这样的记录:
    主表:
    A
    B
    两条记录从表就有:
    A,B
    A,C
    B,C
    B,D
    B,X
    五条记录在输入BOM时, 先输入主件才可以输入组件
    输入组件时: 
    对输入的组件要到库中做检查: 看这一组件是不是在上级bom中.这个就有点难度了.因为迭代次数相当多.一般就用存储过程来做.我用sql Server 做了UDF:
    /* 取得一品号的所有上阶品号 */
    CREATE FUNCTION CheckBom (@PH char(20))
    RETURNS @TT  TABLE
    (
      ID CHAR(20)
    )
    AS
    BEGIN 
       DECLARE @ZJ CHAR(20)
       SET @ZJ = @PH     WHILE 0=0
       BEGIN
           SELECT @ZJ = MD001 FROM BOMMD WHERE MD003 = @ZJ
           
           IF @@ROWCOUNT >0
           BEGIN
             INSERT @TT VALUES (@ZJ)
             CONTINUE
           END
           ELSE
             BREAK        
       END
       
       RETURN
    END在使用时, 只要用
    select * from CheckBom(现在输入的主件品号)