地区表
 
 地区ID          地区
MJG110000 北京市
MJG110100 市辖区
MJG110101 东城区
MJG110102 西城区
MJG110103 崇文区
MJG110200 县
MJG110228 密云县
MJG110229 延庆县
MJG120000 天津市
MJG120100 市辖区
MJG120101 和平区
MJG120102 河东区
MJG120103 河西区
MJG120200 县
MJG120221 宁河县
MJG120223 静海县
MJG120225 蓟 县1、如何生成树?北京市
  市辖区
    东城区
    西城区
    崇文区
  县
    密云县
    延庆县
天津市
  市辖区
    和平区
    河东区
    河西区 
  县
    宁河县
    静海县
    蓟 县       
2、
  主表
  
   编号 姓名 地区ID
   01  张三 MJG120221
   02  李四 MJG120225
   03  王五 MJG110103选择天津市时,如何把属于天津市的都找出来?

解决方案 »

  1.   

    你的编号有规律
    城市:1100 ,1200
    市辖区:1101,1201
    县:1102,1202这样你的SQL就每次都去Substring,然后进行关联.
    判断最后一码为0就是城市,1为辖区,2为县.
    例如:var
      Node: TTreeNode;
      i: Integer;with Adoquery1 do 
    begin
      Close;
      Sql.clear;
      SQL.Add('Select ID, Area from Tabel where Substring(ID, 6,1) = 1');
      Open
      for i := 0 to Adoquery1.Recourdcount - 1 do 
      begin
        TreeView1.Items.add(nil, FiledByName(Area).AsString);
        Node := TreeView1.Items[i];
        with Adoquery2 do 
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select ID, Area From Table Where Substring(ID, 6,1) = 2 and Substring(ID, 4,5)=' + QuotedStr(Copy(FiledByName(ID).AsString, 4, 4)));
          Open;
          for j := 0 to Adoquery2.Recourdcount - 1 do 
          begin
            TreeView1.Items.add(Node, FiledByName(Area).AsString);
          end;
        end;
      end;
    end;
    以此类推,手写的可能有错误,自己调试一下,应该不麻烦!
      

  2.   

    如楼上所讲,找出编码规律,其他好办
    选择天津市时,如何把属于天津市的都找出来?
    --如果数据量不是很大且频繁在不同城市记录上切换,建议用ado一次性将记录取出来,然后再通过对字段值判断,符合条件的加到treeview中
      

  3.   

    簡單
    找出數據的規律,生成相應的節點,可將不同市\市辖区\縣分別生成階層節點,通過ID來關聯)
    1.數據量大時,可用遞歸處理生成樹; 
    2.如果數據量小,建議一次性生成樹;
    3.也可做成類似windows資源管理器那樣,有階層關係就展開(前面有"+"號),沒有就不顯示.
      

  4.   

    说说我的看法:
    地区表可用国标码,国标码是6位数字编码,也就是身份证的前6位所以地区表中的MJG纯属多余,是冗余数据,要去掉!!!既然为国标码其规律太明显了,
    省级(包括直辖市)的后4位数字为0
    市级(包括直辖市的区、县)的后2位为0
    县、区级后2位非0所以要实现以上树形表是相当简单的
      

  5.   

    给你一个方法,首先,检出数据时用上order by 
    其次根据规律,依次添加节点.这样做只须遍历一次表,就搞定.
      

  6.   

    1楼的代码在遍历两个Adoquery的行时,有逻辑上的错误,open后少了first,for里面少了next。基本算法是对的。
      

  7.   

    给你个例子,相信其他的贴子都不用看了,procedure TfrmMain.TreViewInit(PL_ID: string;nFather: TTreeNode);
    var
      myNode:TTreeNode;
      myLabel:TLabel;
      qryTool1: TgtQuery;
    begin
      qryTool1 := TgtQuery.Create(Self);
      try
        with qryTool1 do
        begin
          DatabaseName := 'DBERP';
          if Active then Close;
          SQL.Clear;
          SQL.Add('select PL_PIID , PL_MC,PL_MJ, ');
          SQL.Add('case when len(PL_PIID)=10 then substring(PL_PIID,1,8)');
          SQL.Add('when len(PL_PIID)=8 then substring(PL_PIID,1,6) ');
          SQL.Add('when len(PL_PIID)=6 then substring(PL_PIID,1,4) ');
          SQL.Add('when len(PL_PIID)=4 then substring(PL_PIID,1,2)');
          SQL.Add('when len(PL_PIID)=2 then ''0'' end as PL_FATHER ');
          SQL.Add('  from PL ');
          SQL.Add(' where 1 = 1  and PL_PIID<>''0'' and ');
          SQL.Add('case when len(PL_PIID)=10 then substring(PL_PIID,1,8)');
          SQL.Add('when len(PL_PIID)=8 then substring(PL_PIID,1,6) ');
          SQL.Add('when len(PL_PIID)=6 then substring(PL_PIID,1,4) ');
          SQL.Add('when len(PL_PIID)=4 then substring(PL_PIID,1,2)');
          SQL.Add('when len(PL_PIID)=2 then ''0'' end =:pFATHER ');
          SQL.Add('   order by PL_PIID ');
          ParamByName('pFATHER').AsString := PL_ID;
          Open;
          while not Eof do
          begin
            myNode:=treLeftLB.Items.AddChild(nFather,fieldbyname('PL_MC').AsString + '[' +fieldbyname('PL_PIID').AsString + ']');
            myLabel:=TLabel.Create(self);
            myLabel.Visible:=false;
            myLabel.Caption:=fieldbyname('PL_PIID').AsString;
            myNode.Data:=myLabel;
            if CompareText(fieldbyname('PL_MJ').AsString,'Y') = 0 then
              myNode.ImageIndex := 3
            else
              myNode.ImageIndex := 1;
            TreViewInit(fieldbyname('PL_PIID').AsString,myNode); //递归调用过程
            Next;
          end;
        end;
      finally
        FreeAndNil(qryTool1);
      end;
    end;
      

  8.   

    前几天看到的
    select * from (SELECT IIf(Right([DM],4)="0000","000000",IIf(Left([dm],2)="01","010000",IIf(Right([dm],2)="00",Left([dm],2)+"0000",Left([dm],4)+"00"))) AS parentCode, XZQH.DM AS code, XZQH.MC AS name FROM XZQH) order by parentCode,code