呵呵,如果用delphi,不可以搞写,
我觉得用递归比较好,但不知道sql怎么写,呵呵。

解决方案 »

  1.   

    你的表内容可以变为A-1  A-11,则以下方法改动很小,
    不过你也可以保留A1 A11等,不过要判断"1",程序如下:
    procedure LoadTree(treeDB:TDBDataSet);//初始化树
        procedure UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);//更新树
        function  GetNodeLevel(sFormat,sCode:string):integer; //获得节点层数
        function  GetNodeItem(sCode:string):integer;//获得item    { Public declarations }
      end;    const
      CTreeCodeFormat='122222';
      cTreeMaxLevel=6;
      CTreeRootTXT='所有图书';var
      tsgzlfrom: Ttsgzlfrom;
      _err:integer;
      curUser:string[10];
      mystate:string;
      gNodeId:string;
      gNodelevel:integer;
      gNode:TtreeNode;
      mynode:array[0..6] of TTreenode;
      i,Already,CurMode:integer;
      currow:integer;
      iniFile:string;
      HasSub:String;  level:Integer;
      implementationuses bgNewunit;
    {$R *.DFM}procedure TtsgzlFrom.LoadTree(treeDB:TDBDataSet);//初始化树
    var curID,nodeTxt:string;
        level,num:integer;
    begin
        //初始化变量
        Screen.Cursor:=crHourGlass;
        tree.Enabled:=True;
        tree.Items.Clear;
        level:=1 ;
        num:=1;
        tree.items.clear;
        //设置根节点
        mynode[level]:=Tree.items.add(Tree.Topitem,cTreeRootTxt);
        mynode[level].ImageIndex:=0;
        mynode[level].SelectedIndex:=1;
        //遍历数据表,利用编码字段记录排序规律,依次添加树节点
        with TreeDb do
        begin
           try
           if not Active then open;
           first;
           while not Eof do
           begin
             curID:=trim(FieldByName('tsglb').AsString);
             nodeTxt:=curID+'-'+trim(FieldByName('tsglbn').AsString);
             level:=GetNodeLevel(cTreeCodeFormat,curID);
             //这里返回代码的层次数
             if level>0 then
             begin
      //增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。
             //注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
                mynode[level]:=Tree.Items.AddChild(Mynode[level-1],NodeTxt);
                mynode[level].ImageIndex:=2;
                mynode[level].SelectedIndex:=3;
             end;
             next;//下一条记录
           end;
           finally;
             close;
           End;
           mynode[1].expand(False);
           Screen.Cursor:=crHourGlass;
         end;
    end;function TtsgzlFrom.GetNodeLevel(sFormat,sCode:string):integer;
    var i,iLen:integer;
    begin
      level:=-1  ;
      iLen:=0;
      if (sFormat<>'') and (sCode<>'') then
        for i:=1 to Length(sFormat) do //分析编码格式,找出当前代码层次
        begin
          iLen:=iLen+StrToInt(sFormat[i]);
          if Length(sCode)=iLen then
          begin
            level:=i;
            break;
          end;
        end;
      result:=level;
    end;Function TtsgzlFrom.GetNodeItem(sCode:string):integer;//获得item
    var i,iCount,val:integer;
        tmp:string;
    begin
      Result:=0;
      iCount:=Tree.Items.Count;
      if iCount=0 then exit;
      val:=0;
      for i:=1 to iCount-1 do
      begin
         Tmp:=Tree.Items.Item[i].Text;
         Tmp:=Copy(Tmp,0,pos('-',Tmp)-1);
         if Tmp=sCode then begin
            val:=i;
            Break;
         end;
      end;
      result:=val;
    end;procedure TtsgzlFrom.UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);
    Begin
      if  state='add'   then
        begin
          curNode:=Tree.Items.addchild(curNode,nodeTxt);
          curNode.ImageIndex:=2;
          curnode.SelectedIndex:=3;
        end;
      if state='del' then  curNode.delete;
      if state='edi' then  curNode.Text:=nodeTxt;
    end;
      

  2.   

    其实问题是这样的:
    (A)是根据T1和T2两表来的,用树形控件就可以实现的,但是要
    筛选(A)的最底层又如何做:
    当field1='A1'时,显示报表为:
    field1
    C11
    B12
    A13我要求一定要用sql语句来写的,所属A1最底层的数据取出来。不能用delpi
    来编写语句