将数据库存储的单位地区编码显示到Treeview |
尚未結案
|
zzmbeyond01
中階會員 ![]() ![]() ![]() 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
各位大大好: 我的程序中需要实现利用地区对该地区的单位进行导航的功能。
单位表字段如下: 单位名称 单位编码 地址编码 地址名称 。。
地址表:地址编码 地址名称 。用于存储行政区划的所有地址编码,比如整个中国地区的地址编码 地址编码规则:
XX XX XX
省 市 市辖区
如:
12 0000 河北省
--
12 01 00 河北省石家庄
--
12 01 01 河北省石家庄市桥西区
12 01 06 河北省石家庄市桥东区
。。 现在希望实现的功能是:将单位表中的地址信息显示在界面的Treeview中,实现利用地区导航单位数据。
程序要求显示出地址树的层次结构,比如单位A地址为河北省石家庄,则单位树需要显示河北省(父节点),河北省石家庄(子节点)。如果为桥西区,则需要显示为河北省(父节点),河北省石家庄(子节点),河北省石家庄市桥西区
(孙子节点)。 SQL查询语句我是写出来了,
with ADODataset2 do //地区唯一 CommandText := 'SELECT t.* FROM 地址表 t WHERE t.地址编码 IN (SELECT distinct y.地址编码 FROM 单位表 y)'; sort := '地址编码 ASC'; //树有序 end;但是如何实现上述要求,??? 又郁闷了一天 |
zzmbeyond01
中階會員 ![]() ![]() ![]() 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
Fishman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi zzmbeyond01, 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44484
------
Fishman |
bennykyp
一般會員 ![]() ![]() 發表:11 回覆:31 積分:8 註冊:2004-10-21 發送簡訊給我 |
MENUITEMNAME ITEMLEVE LEVELSEQ
==================== ======== =======================
SETUP 01 01
COMPANY 02 01.01
FACTORY 02 01.02
DEPARTMENT 02 01.03
PRODUCTIONGROUP 02 01.04
LOCATION 02 01.05
NATIONALITY 02 01.06
EMPLOYEE 02 01.07
EMPLOYEECATEGORY 03 01.07.01
EMPLOYEEDESIGNATIONCODE 03 01.07.02
EMPLOYEEMANAGE 03 01.07.03
EMPLOYEEGROUPING 03 01.07.04
EMPLOYEEGROUPASSIGN 04 01.07.04.01
EMPLOYEESHIFTASSIGN 04 01.07.04.02
EMPLOYEESWAPSHIFT 04 01.07.04.03
EMPLOYEELATECONTROL 04 01.07.04.04
以上資料從 伺服器裡 Select 出來 ================================================================
在 Type 上面宣告
================================================================
Type
PFirstList = ^TFirstList;
TFirstList = Record
ItemFirst : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PSecondList = ^TSecondList;
TSecondList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PThirdList = ^TThirdList;
TThirdList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemThird : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PFourthList = ^TFourthList;
TFourthList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemThird : Domain_LevelSeq;
ItemFourth : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PFifthList = ^TFifthList;
TFifthList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemThird : Domain_LevelSeq;
ItemFourth : Domain_LevelSeq;
ItemFifth : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PSixthList = ^TSixthList;
TSixthList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemThird : Domain_LevelSeq;
ItemFourth : Domain_LevelSeq;
ItemFifth : Domain_LevelSeq;
ItemSixth : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End;
Type
PSeventhList = ^TSeventhList;
TSeventhList = Record
ItemFirst : Domain_LevelSeq;
ItemSecond : Domain_LevelSeq;
ItemThird : Domain_LevelSeq;
ItemFourth : Domain_LevelSeq;
ItemFifth : Domain_LevelSeq;
ItemSixth : Domain_LevelSeq;
ItemSeventh : Domain_LevelSeq;
ItemName : Domain_ItemName;
ItemDesc : Domain_Description;
LevelSeq : Domain_LevelSeq;
End; ================================================================
在 Private 宣告
================================================================
FFirstList : TList;
FSecondList : TList;
FThirdList : TList;
FFourthList : TList;
FFifthList : TList;
FSixthList : TList;
FSeventhList : TList; ================================================================
當 Form Show 時
================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
GetTreeMenuList;
CreateTreeMenu;
end; ================================================================
用 Copy, Pos 把 順序分出來
================================================================ procedure TForm1.GetLevel(AItemLevel, AStr : String);
var
pLev1 : Integer;
begin
sLev1 := '';
sLev2 := '';
sLev3 := '';
sLev4 := '';
sLev5 := '';
sLev6 := '';
If (AItemLevel = '01') then
Begin
pLev1 := Pos('.',AStr);
sLev1 := Copy(AStr,(pLev1 1),Length(AStr));
End;
If (AItemLevel = '02') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 1));
End;
If (AItemLevel = '03') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 4));
sLev2 := Copy(AStr, 0, (pLev1 - 1));
End;
If (AItemLevel = '04') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 7));
sLev2 := Copy(AStr, 0, (pLev1 - 4));
sLev3 := Copy(AStr, 0, (pLev1 - 1));
End;
If (AItemLevel = '05') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 10));
sLev2 := Copy(AStr, 0, (pLev1 - 7));
sLev3 := Copy(AStr, 0, (pLev1 - 4));
sLev4 := Copy(AStr, 0, (pLev1 - 1));
End;
If (AItemLevel = '06') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 13));
sLev2 := Copy(AStr, 0, (pLev1 - 10));
sLev3 := Copy(AStr, 0, (pLev1 - 7));
sLev4 := Copy(AStr, 0, (pLev1 - 4));
sLev5 := Copy(AStr, 0, (pLev1 - 1));
End;
If (AItemLevel = '07') then
Begin
pLev1 := LastDelimiter('.', AStr);
sLev1 := Copy(AStr, 0, (pLev1 - 16));
sLev2 := Copy(AStr, 0, (pLev1 - 13));
sLev3 := Copy(AStr, 0, (pLev1 - 10));
sLev4 := Copy(AStr, 0, (pLev1 - 7));
sLev5 := Copy(AStr, 0, (pLev1 - 4));
sLev6 := Copy(AStr, 0, (pLev1 - 1));
End;
end; ================================================================
把資料存入 TList 裡
================================================================ procedure TForm1.GetTreeMenuList;
var
MenuItemName, Description, LevSeq : String;
begin
FFirstList := TList.Create;
FSecondList := TList.Create;
FThirdList := TList.Create;
FFourthList := TList.Create;
FFifthList := TList.Create;
FSixthList := TList.Create;
FSeventhList := TList.Create; with IBQry do
begin
Close;
SQL.Clear;
SQL.Add(sql_MenuItems);
Open;
while not Eof do
begin
GetLevel(ItemLevel, LevSeq);
If (ItemLevel = '01') then
Begin
New(RecFirst);
RecFirst^.ItemFirst := LevSeq;
RecFirst^.ItemName := MenuItemName;
RecFirst^.ItemDesc := Description;
FFirstList.Add(RecFirst);
End;
If (ItemLevel = '02') then
Begin
New(RecSecond);
RecSecond^.ItemFirst := sLev1;
RecSecond^.ItemSecond := LevSeq;
RecSecond^.ItemName := MenuItemName;
RecSecond^.ItemDesc := Description;
FSecondList.Add(RecSecond);
End;
If (ItemLevel = '03') then
Begin
New(RecThird);
RecThird^.ItemFirst := sLev1;
RecThird^.ItemSecond := sLev2;
RecThird^.ItemThird := LevSeq;
RecThird^.ItemName := MenuItemName;
RecThird^.ItemDesc := Description;
FThirdList.Add(RecThird);
End;
If (ItemLevel = '04') then
Begin
New(RecFourth);
RecFourth^.ItemFirst := sLev1;
RecFourth^.ItemSecond := sLev2;
RecFourth^.ItemThird := sLev3;
RecFourth^.ItemFourth := LevSeq;
RecFourth^.ItemName := MenuItemName;
RecFourth^.ItemDesc := Description;
FFourthList.Add(RecFourth);
End;
If (ItemLevel = '05') then
Begin
New(RecFifth);
RecFifth^.ItemFirst := sLev1;
RecFifth^.ItemSecond := sLev2;
RecFifth^.ItemThird := sLev3;
RecFifth^.ItemFourth := sLev4;
RecFifth^.ItemFifth := LevSeq;
RecFifth^.ItemName := MenuItemName;
RecFifth^.ItemDesc := Description;
FFifthList.Add(RecFifth);
End;
If (ItemLevel = '06') then
Begin
New(RecSixth);
RecSixth^.ItemFirst := sLev1;
RecSixth^.ItemSecond := sLev2;
RecSixth^.ItemThird := sLev3;
RecSixth^.ItemFourth := sLev4;
RecSixth^.ItemFifth := sLev5;
RecSixth^.ItemSixth := LevSeq;
RecSixth^.ItemName := MenuItemName;
RecSixth^.ItemDesc := Description;
FSixthList.Add(RecSixth);
End;
If (ItemLevel = '07') then
Begin
New(RecSeventh);
RecSeventh^.ItemFirst := sLev1;
RecSeventh^.ItemSecond := sLev2;
RecSeventh^.ItemThird := sLev3;
RecSeventh^.ItemFourth := sLev4;
RecSeventh^.ItemFifth := sLev5;
RecSeventh^.ItemSixth := sLev6;
RecSeventh^.ItemSeventh := LevSeq;
RecSeventh^.ItemName := MenuItemName;
RecSeventh^.ItemDesc := Description;
FSeventhList.Add(RecSeventh);
End; LevSeq := '';
ItemLevel := '';
Next;
end;
end;
end; ================================================================
用 TList 把資料排入 TreeView 裡
================================================================ procedure TForm1.CreateTreeMenu;
var
H, I, J, K, L, M, O, RunNo, IdxNo : Integer;
NCategory, Nchild1, Nchild2, Nchild3, Nchild4, Nchild5, Nchild6 : TTreeNode;
begin
IdxNo := 0;
RunNo := 0; With tvMenu.Items Do
Begin
BeginUpdate;
Clear;
For H := 0 To Pred(FFirstList.Count) Do
Begin
RecFirst := FFirstList.Items[H];
NCategory := Add(Nil, RecFirst^.ItemDesc);
IdxNo := IdxNo 1000;
RunNo := IdxNo;
NCategory.SelectedIndex := RunNo;
NCategory.StateIndex := 5; For I := 0 to Pred(FSecondList.Count) Do
Begin
RecSecond := FSecondList.Items[I];
if (RecFirst^.ItemFirst = RecSecond^.ItemFirst) then
begin
Nchild1 := AddChild(NCategory, RecSecond^.ItemDesc);
RunNo := RunNo 1;
Nchild1.SelectedIndex := RunNo;
end; For J := 0 to Pred(FThirdList.Count) Do
Begin
RecThird := FThirdList.Items[J];
if ((RecFirst^.ItemFirst = RecThird^.ItemFirst) and
(RecSecond^.ItemSecond = RecThird^.ItemSecond)) then
begin
Nchild2 := AddChild(Nchild1, RecThird^.ItemDesc);
RunNo := RunNo 1;
Nchild2.SelectedIndex := RunNo;
end; For K := 0 to Pred(FFourthList.Count) Do
Begin
RecFourth := FFourthList.Items[K];
if ((RecFirst^.ItemFirst = RecFourth^.ItemFirst) and
(RecSecond^.ItemSecond = RecFourth^.ItemSecond) and
(RecThird^.ItemThird = RecFourth^.ItemThird)) then
begin
Nchild3 := AddChild(Nchild2, RecFourth^.ItemDesc);
RunNo := RunNo 1;
Nchild3.SelectedIndex := RunNo;
end; For L := 0 to Pred(FFifthList.Count) Do
Begin
RecFifth := FFifthList.Items[L];
if ((RecFirst^.ItemFirst = RecFifth^.ItemFirst) and
(RecSecond^.ItemSecond = RecFifth^.ItemSecond) and
(RecThird^.ItemThird = RecFifth^.ItemThird)) and
(RecFourth^.ItemFourth = RecFifth^.ItemFourth) then
begin
Nchild4 := AddChild(Nchild3, RecFifth^.ItemDesc);
RunNo := RunNo 1;
Nchild4.SelectedIndex := RunNo;
end; For M := 0 to Pred(FSixthList.Count) Do
Begin
RecSixth := FSixthList.Items[M];
if ((RecFirst^.ItemFirst = RecSixth^.ItemFirst) and
(RecSecond^.ItemSecond = RecSixth^.ItemSecond) and
(RecThird^.ItemThird = RecSixth^.ItemThird)) and
(RecFourth^.ItemFourth = RecSixth^.ItemFourth) and
(RecFifth^.ItemFifth = RecSixth^.ItemFifth) then
begin
Nchild5 := AddChild(Nchild4, RecSixth^.ItemDesc);
RunNo := RunNo 1;
Nchild5.SelectedIndex := RunNo;
end; For O := 0 to Pred(FSeventhList.Count) Do
Begin
RecSeventh := FSeventhList.Items[O];
if ((RecFirst^.ItemFirst = RecSeventh^.ItemFirst) and
(RecSecond^.ItemSecond = RecSeventh^.ItemSecond) and
(RecThird^.ItemThird = RecSeventh^.ItemThird)) and
(RecFourth^.ItemFourth = RecSeventh^.ItemFourth) and
(RecFifth^.ItemFifth = RecSeventh^.ItemFifth) and
(RecSixth^.ItemSixth = RecSeventh^.ItemSixth) then
begin
Nchild6 := AddChild(Nchild5, RecSeventh^.ItemDesc);
RunNo := RunNo 1;
Nchild6.SelectedIndex := RunNo;
end;
End; //End Of For Loop O
End; //End Of For Loop L
End; //End Of For Loop L
End; //End Of For Loop K
End; //End Of For Loop J
End; //End Of For Loop I
End; //End Of For Loop H
EndUpdate;
End;
end;
|
zzmbeyond01
中階會員 ![]() ![]() ![]() 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |