一共建一四个表
表一Punit:  Pid Pname
表二UUnit:  Uid Pid Uname
表三Iunit:  Iid Uid Iname
表四Lunit:  Id Iid text
XXXX系统
   |
  Pname
  Pname
  Pname
    |--Uname
    |--Uname
     |--Iname
      |--text他们的关系是这样的大家谁能帮帮我。

解决方案 »

  1.   

    是一对一的关系吗?先查出一个视图,  假设使用Query1控件
    select  Pname, Uname, Iname, text from 表一,表二, 表三, 表四
    where (表一.Pid = 表二.Pid) and (表二.Uid = 表三.Uid) and (表三.Iid = 表四.Iid)
    Group by Pname然后
    Query1.First;
    while not Query1.Eof do
    begin
      //再这里把给Treeview1加一个Pname结点
      //在加一个Uname子结点
      //.....................
    end;
      

  2.   

    一般使用遞歸來做,如果是oracle可以輕松的避免遞歸,大大提高效率
      

  3.   

    //Add  Nodes
    procedure P_AddNodes(vSql:string);
    var
      Node,Node_tmp:TTreeNode;
      NodeText,NodeText_tmp:string;
    begin
      Query:=TADOQuery.Create(nil);
      with Query do
      begin
        Connection:=APP.ADOQuery.Connection;
        Close;
        SQL.Clear;
        SQL.Add(vSql);
        Open;
        TV.Items.Clear;
        TV_tmp.Items.Clear;
        Node:=TV.Items.Add(nil,'[0]'+RootName);//Add Root Node
        Node_tmp:=TV_tmp.Items.Add(nil,'');
        while not eof do
        begin
          NodeText:='['+FieldByName(KeyField).AsString+']'+FieldByName(DisplayField).AsString;
          NodeText_tmp:=FieldByName(ParentField).AsString;
          if (FieldByName(ParentField).AsString=GetNodeKey(Node)) then//Filiation
          begin
            Node:=TV.Items.AddChild(Node,NodeText);
            Node_tmp:=TV_tmp.Items.AddChild(Node_tmp,NodeText_tmp);
          end
          else
            if (FieldByName(ParentField).AsString=Node_tmp.Text) then//Brother
            begin
              Node:=TV.Items.Add(Node,NodeText);
              Node_tmp:=TV_tmp.Items.Add(Node_tmp,NodeText_tmp);
            end
            else begin //Not Direct Relation
               while Node.Parent<>nil do
               begin
                  Node:=Node.Parent;
                  Node_tmp:=Node_tmp.Parent;
                  if (FieldByName(ParentField).AsString=Node_tmp.Text) then
                  begin
                    Node:=TV.Items.Add(Node,NodeText);
                    Node_tmp:=TV_tmp.Items.Add(Node_tmp,NodeText_tmp);
                    Break;
                  end;
               end;
            end;
          Next;
        end;
      end;
      Query.Free;
      TV_tmp.Items.Clear;
    end;function GetNodeKey(vNode: TTreeNode): string;
    begin
        Result:=copy(WideString(vNode.Text),2,pos(WideString(']'),WideString(vNode.Text))-2);
    end;
      

  4.   

    关系不是一一对应的。表UUnit:  里面的Pid 是和表Punit里的Pid对应的。表Iunit里面的Uid 是表UUnit里面的对应相应的编号以此类推数据库是SQL大家帮帮我。
      

  5.   

    他们的关系是一层包括一层的关系,UUnit表里面的PID对应Punit表里面的pid在UUnit表里面有很多Pid对应