我所关心的是,id,pid 假如没有规律,如何能在数据表中查询一个节点,包括所有子节点的记录。

解决方案 »

  1.   

    1。数据库表的结构:
       (
           节点ID
           节点父ID(PID)
           及其他字段
        )
    我的意思是如何根据id,或pid,或其他字段能select 查询节点本身,所有子节点数据。
      

  2.   

    如果是SQL(ORACLE):
    SELECT *
    FROM TAB1
    CONNECT BY PRIOR ID=PID
    START WITH ID=当前节点ID;如果是TTreeView
    p(TreeView1.Selected);produce p(ANode: TTreeNode)
    var
      n: TTreeNode;
    begin
      ANode := ANode.GetFirstChild();
      while (ANode <> nil)
      begin
        ANode := ANode.GetNext();
        p(ANode);
      end;
    end;
    以上程序未验证过,但思路可以是这样的
      

  3.   

    作者:cg1  摘自:access911.net  编辑:cg1  更新日期:2003-5-29  浏览人次:3539
     
    专题地址:
    http://access911.net/?kbid;75FABE1E12DC
     
     简述:
    本文简述了如何设计表的结构才能方便的用 TREEVIEW 控件显示数据的层次关系。
     阅读前需掌握:
     难度等级:
    等级未评定
     
     
     问题: 
    新手来看:如何设计表结构便于treeview显示?食品饮料类
        --饮料类
           --果汁类
               --山楂汁
               --柠檬汁
           --碳酸类
               --可口可乐
               --百事可乐
        --酒类
           --啤酒类
               --烟台啤酒
               --青岛啤酒
           --白酒类
               --茅台
               --五粮液
    办公设备类
          --…………以此类推
    请问该如何建表,便于用treeview显示,而且能反映他们之间的类别关系  
    回答:
     方法一:
     
    一个表
    字段如下:
    id(自动编号)
    fullname(文本)
    parentID(长整)parentid就是该种商品上一级的商品id三个字段即可:
    读取它的父ID即可反映关系ID    名称            父ID
    ——————————————————
    1    食品饮料类         0
    2    饮料类             1
    3    果汁类             2
    4    山楂汁             3
    5    柠檬汁             3
    6    碳酸类             2
    7    可口可乐           6
    8    百事可乐           6
    9    酒类               1
    10   啤酒类             9
    11   烟台啤酒          10
    12   青岛啤酒          10
    13   白酒类             9
    14   茅台              13
    15   五粮液            13
    16   办公设备类         0
    ……
    顶层的类别的parentID为Null本方法层数是无穷的,但是统计起来麻烦
    有网友问本方法生成的表在统计某个节点信息的时候不方便,其实写一个函数归递其自身就可以了。
    以下代码显示了统计根节点信息的方法:
    Function CreateEgTable()
    '为本演示生成一个表
    '将光标停在这里,按 F5 键,运行代码生成 TREE 表    Dim strSql(10) As String
        Dim i As Integer
        strSql(0) = "create table tree (id AUTOINCREMENT(1,1),fullname text(50),parentID long)"
        strSql(1) = "insert into tree(fullname,parentid) values('a',0)"
        strSql(2) = "insert into tree(fullname,parentid) values('a1',1)"
        strSql(3) = "insert into tree(fullname,parentid) values('b',0)"
        strSql(4) = "insert into tree(fullname,parentid) values('b1',3)"
        strSql(5) = "insert into tree(fullname,parentid) values('b2',3)"
        strSql(6) = "insert into tree(fullname,parentid) values('b2b',5)"
        strSql(7) = "insert into tree(fullname,parentid) values('b3',3)"
        strSql(8) = "insert into tree(fullname,parentid) values('b3a',7)"
        strSql(9) = "insert into tree(fullname,parentid) values('a1a',2)"
        strSql(10) = "insert into tree(fullname,parentid) values('a1a1',9)"
        For i = LBound(strSql) To UBound(strSql)
            CurrentProject.Connection.Execute strSql(i)
        Next
    End FunctionFunction RunTest()
    '按 CTRL + G 后显示“立即窗口”
    '将光标停在这里,按 F5 键,运行代码直接显示结果
        Debug.Print ListSub_L(0, 0)
        Debug.Print ListSub(0)
    End FunctionFunction ListSub(ByVal lngID As Long, Optional ByVal strDelimiter) As String
    '本函数归递自身来查询对应 TREE 表中某个节点的所有子节点
    '本函数的结果集和被用来查询子节点的统计结果,比如:
    'dim strSQL as String
    'strSQL="select * from tree where id in(" & ListSub(0) & ")"    If IsMissing(strDelimiter) = True Then
            strDelimiter = ","
        End If
        
        Dim strSql As String
        Dim rs As New ADODB.Recordset
        strSql = "select * from tree where parentid=" & lngID
        rs.Open strSql, CurrentProject.Connection, 1, 1
        Do Until rs.EOF
            ListSub = ListSub & strDelimiter & rs("fullname") & ListSub(rs("id"))
            rs.MoveNext
        Loop
        
    End FunctionFunction ListSub_L(ByVal lngID As Long, ByVal i As Long) As String
    '本函数归递自身来查询对应 TREE 表中某个节点的所有子节点
    '并用简单的表示方法排列出所有层次关系    i = i + 1
        Dim strSql As String
        Dim rs As New ADODB.Recordset
        strSql = "select * from tree where parentid=" & lngID
        rs.Open strSql, CurrentProject.Connection, 1, 1
        Do Until rs.EOF
            ListSub_L = ListSub_L & vbCrLf & String(i, Chr(9)) & rs("fullname") & ListSub_L(rs("id"), i)
            rs.MoveNext
        Loop
    End Function
       方法二: 
    一个表
    字段如下:
    id(自动编号)
    fullname(文本)
    ProgramID(文本)programID是5位一段的数字,比如
    食品饮料类:00001
    饮料类:0000100001
    果汁类:000010000100001
    山楂汁:00001000010000100001
    柠檬汁:00001000010000100002本方法层数是有限制的,字符串最大是 255,如果5位一层,最大层数只有 51 层,不过多数情况下已经够用了。用本方法在统计信息的时候非常方便:
    select * from table where ProgramID like '00001*'     access911.net 原创文章,作者本人对文章保留一切权利。
    如需转载必须征得作者同意并注明本站链接
     
      
    适用环境:
    所有 Access 环境
     关键字:
    设计表结构,treeview  >>>
     
      
     
       
    相关文章 
         没有手动相关文章 
         关于产品名称、客户名称的表结构定义 
         新手来看:如何设计数据库结构 
      
    评论 
         没有相关评论 
         查看或发表更多的评论,请单击这里。 
      
      
      
       
      
       
         
      Access911.net   |   a9BBS   |   OTaA System   | 
     建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )  
     Copyright &copy; 2000 - 2003 COMET, 陈格 保留所有
      

  4.   

    这里有vb代码,如何把它改成delphi 代码