地区表
地区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选择天津市时,如何把属于天津市的都找出来?
地区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选择天津市时,如何把属于天津市的都找出来?
解决方案 »
- 加了半年班,暂时可以松口气了,散分
- delphi工具栏中所有提示没有了?
- [DELPHI]想自己建一个数据文件, 征求实现的方法
- 为什么用Quickrep做的报表在Epson Stylus photo Ex2中不能打印出来?
- 急救~~~怎么做这个查询??
- 再问一个,如何判断在编辑框里输入的是有效的日期格式?
- 如何解决这个问题,关于方便用户输入的选择框
- 两个存放在不同目录中的ini文件用什么方法比较起来比较方便?
- 急!急!保存的*.dfm文件中的汉字都变成16进制表示,在另一台机器中无法打开!为什么会这样呢?
- 如何控制Ttreeview只能选择最内部的子节点和它上层的父节点,其他的节点都不能选择?
- 调用数据库图像,显示在image控件中,图像下部分被一层全是点覆盖,看不到全部图像,郁闷,求解决。
- 顶者有分!开一百分送!
城市: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;
以此类推,手写的可能有错误,自己调试一下,应该不麻烦!
选择天津市时,如何把属于天津市的都找出来?
--如果数据量不是很大且频繁在不同城市记录上切换,建议用ado一次性将记录取出来,然后再通过对字段值判断,符合条件的加到treeview中
找出數據的規律,生成相應的節點,可將不同市\市辖区\縣分別生成階層節點,通過ID來關聯)
1.數據量大時,可用遞歸處理生成樹;
2.如果數據量小,建議一次性生成樹;
3.也可做成類似windows資源管理器那樣,有階層關係就展開(前面有"+"號),沒有就不顯示.
地区表可用国标码,国标码是6位数字编码,也就是身份证的前6位所以地区表中的MJG纯属多余,是冗余数据,要去掉!!!既然为国标码其规律太明显了,
省级(包括直辖市)的后4位数字为0
市级(包括直辖市的区、县)的后2位为0
县、区级后2位非0所以要实现以上树形表是相当简单的
其次根据规律,依次添加节点.这样做只须遍历一次表,就搞定.
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;
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