如果数型结构有8层级,那么最好用什么方法把它展开

解决方案 »

  1.   

    你的数据表结构最好设计成如下:  id      name ....        parent_id
      1       .....               0
      2       .....               1
      3       .....               1
              .....这样用递归写代码很容易的,且层数可以任意增加。如:
        Pbmdata =  ^TbmData;
        TbmData = record
            id   :integer;
            name   :string;
            parent_dm   :integer;
            if_end :boolean;
        End;//写根节点
       new(mybm);
       mybm.id:=q.fieldbyname('id').AsInteger;
       mybm.name:=q.fieldbyname('name').AsString;
    //   mybm.cs:=q.fieldbyname('cs').AsInteger;
       mybm.if_end:=q.FieldByName('if_end').AsBoolean;
       mybm.parent_dm:=q.fieldbyname('parent_dm').AsInteger;
    //写户籍树
       insert_tv(tv_1.Items.AddChildFirst(nil,mybm.name),mybm.id);
    procedure Tmainform.insert_tv(toptree:Ttreenode;id:integer);
    // 从父节点开始递归写数据
    var
       midtree:ttreenode;
       mybm :pbmdata;
       q1,q2:tadoquery;
    begin
       q1:=tadoquery.Create(self);
       q1.Connection:=dmform.ADOConnection1;
       q2:=tadoquery.Create(self);
       q2.Connection:=dmform.ADOConnection1;
       q1.SQL.Add('select * from aa where parent_dm='+inttostr(id));
       q1.Prepared;
       q1.Open;
       if q1.Eof then exit;
       while not q1.Eof do
       begin
           new(mybm);
           mybm.id:=q1.fieldbyname('id').AsInteger;
           mybm.name:=trim(q1.fieldbyname('name').AsString);
    //       mybm.cs:=q1.fieldbyname('cs').AsInteger;
           mybm.if_end:=q.FieldByName('if_end').AsBoolean;
           mybm.parent_dm:=q1.fieldbyname('parent_dm').AsInteger;
           midtree:=tv_1.Items.AddChildObject(toptree,mybm.name,mybm);
           q2.SQL.Clear;
           q2.SQL.Add('select * from aa where parent_dm='+inttostr(mybm.id));
           q2.Prepared;
           q2.Open;
           if not q2.Eof then  insert_tv(midtree,mybm.id);
           q2.Close;
           q1.Next;
       end;
       q1.Destroy;
       q2.Destroy;
    end;    发要详细代码,与QQ:549711582联系