全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1100
推到 Plurk!
推到 Facebook!

将数据库存储的单位地区编码显示到Treeview

尚未結案
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 23:51:54 IP:222.183.xxx.xxx 未訂閱
各位大大好:    我的程序中需要实现利用地区对该地区的单位进行导航的功能。 单位表字段如下: 单位名称 单位编码 地址编码 地址名称 。。 地址表:地址编码 地址名称 。用于存储行政区划的所有地址编码,比如整个中国地区的地址编码    地址编码规则: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 00:28:46 IP:222.183.xxx.xxx 未訂閱
用visio画的 < >< >
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 13:04:21 IP:210.65.xxx.xxx 未訂閱
Hi zzmbeyond01,    請參考    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44484 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
bennykyp
一般會員


發表:11
回覆:31
積分:8
註冊:2004-10-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-04 12:20:48 IP:218.208.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-04 22:29:01 IP:222.183.xxx.xxx 未訂閱
多谢大大热心,我自己正在按照两位大大的办法测试,看行不行。。 按Fishman大大指示的方法,我还未做出来。我现在还在想,因为存在单位地址可能具有部分重复项, 比如单位1地址代码130100,单位二地址代码120106,单位三地址代码120100,那么显示的单位地址树就为: (地址代码) 120000(一级)120100(二级)120106(三级); 130000(一级)130100(二级)
系統時間:2024-06-28 19:30:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!