 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
liangszpt

註冊時間: 2004-11-18 文章: 263 來自: な东省深圳市
第 1 樓
|
發表於: 星期三 三月 02, 2005 9:07 pm 文章主題: 在TREEVIEW中,怎么统计出一个节点下所有子节点的数目(包括孙节 |
|
|
现在有点一个节点A(不是根节点),下面有A1,A2,A3子节点,A1下面又有若干个子节点,A2下面又有若干个子节点,A3也是。
现在我想统计出节点A下,到底有多少个子节点(包括子节点的子节点)
请大家赐教 |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 2 樓
|
發表於: 星期四 三月 03, 2005 1:00 am 文章主題: |
|
|
*假設你有個TABLE檔名=mytable, 有2個欄位 parent_word , word
word是節點的代號, parent_word是它的上層節點代號
? '節點 A 總共有幾個子節點:',sumpoint('A')
****
func sumpoint
Lpara mparent
select word from mytable where parent_word=mparent into array a_word
mtotal=0
for i=1 to alen( a_word )
mtotal=mtotal + 1 + sumpoint( word )
next
return mtotal
**********************
如果你懂點程式的話, 你該知道我上面的程式少了二行指令,及一個地方有錯誤 , 請你自己動點腦筋, 在學校的老師都是先講架構, 細節部份須要學生自己想的, 總之學校作業是要自己完成的. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案.
garfield 在 星期四 三月 03, 2005 8:40 am 作了第 2 次修改 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 3 樓
|
發表於: 星期四 三月 03, 2005 3:19 am 文章主題: |
|
|
不禁讓我想到資料結構中的TRAVEL的"深度優先搜尋"
----------------------
深度優先搜尋(Depth First Search,DFS)
深度優先搜尋是先選擇任一個頂點v為起始點,然後一個頂點w作為新的起點再作深度優先搜尋,如此遞迴地進行,直到沒有相鄰的頂點或者所有的相鄰頂點都已被拜訪過,才回溯到上一層繼續進行深度優先搜尋其他尚未拜訪的頂點。
深度優先搜尋的順序將依所建立的圖形資料結構而定,因此在不同的結構下,即使起始點相同,產生的順序亦有所不同。
若採用相鄰矩陣來搜尋,那麼決定任一頂點v的所有相鄰頂點須O(n)的時間,若共需拜訪n個頂點,則所需時間為O(n2)。若採用相鄰串列方式,則串列每一個頂點只拜訪一次;因此,所需時間為O(e),e為邊(edge)的數目。 _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
andy8m23

註冊時間: 2004-02-09 文章: 30 來自: 我娘的肚子,出來很久了
第 4 樓
|
發表於: 星期四 三月 03, 2005 4:46 pm 文章主題: |
|
|
我是菜鳥....我仔細看了一下
a_word 好像是空的,要用Adir 是嗎,可是...有點不
敢問,adir好像只能把所在目錄放入,是不是要判斷以下有無節點再往下挖? _________________ 登入結束編譯檔<----會了 -->密碼管制鎖登入
新增修刪查列印<----功力尚淺 -->功能表單建群組
表格輸出轉換檔<----有點模糊 -->各式文檔互轉換
遠端資料共分享<----未來目標 -->多端連接資料庫 |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 5 樓
|
發表於: 星期四 三月 03, 2005 5:11 pm 文章主題: |
|
|
select ..... into array a_word
是將select 查到的資料放到 陣列, 而陣列的名稱就是 a_word , 而adir 是將目錄的檔案放到陣列中, 這兩個功能是不一樣的, 不要混為一談. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
liangszpt

註冊時間: 2004-11-18 文章: 263 來自: な东省深圳市
第 6 樓
|
發表於: 星期日 三月 06, 2005 9:48 pm 文章主題: |
|
|
Mytable的STRU如下:
FIELD TYPE
MenuID (N) 菜单ID
ParentID (N) 菜单的父ID
MenuLevel (C) 菜单层次,其中为“T”时,代表顶层菜单
FUNCTION NODESCOUNT()
PARA nMenuID &&就是你所选中的节点Id
LOCAL cParentString,nParentID,cParentID,cMenuLevel, nEndIndex
cParentString=""
SELE MENU
LOCA FOR MENU.Menu_id=nMenuID
&&先找到该节点的所有祖先ID,当MENUID和PARENTID相同时,代表已到了顶层。
DO WHILE MENU.Menu_id<>MENU.Parent_mid
cParentString=cParentString+"M"+ALLTRIM(STR(MENU.Parent_mid))+","
nParentID=MENU.Parent_mid
LOCA FOR MENU.Menu_id=nParentID
ENDDO
cParentString=cParentString+"M"+ALLTRIM(STR(MENU.Parent_mid))+","
nEndIndex=nMenuID+1
LOCA FOR MENU.Menu_id=nMenuID
cMenuLevel=ALLTRIM(MENU.Menu_Level)
SKIP
IF EOF()
RETURN nEndIndex
ENDIF
IF cMenuLevel="T"
DO WHILE !EOF()and ALLTRIM(MENU.Menu_Level)<>"T"
nEndIndex=nEndIndex+1
SKIP
ENDDO
ELSE
DO WHILE !EOF() AND ALLTRIM(MENU.Menu_Level)<>"T"
cParentID="M"+ALLTRIM(STR(MENU.Parent_mid))+","
IF cParentID$cParentString
EXIT
ENDIF
nEndIndex=nEndIndex+1
SKIP
ENDD
ENDIF
RETURN nEndIndex
&&其实所有的功能我是做在TREEVIEW里的,我还有一个变量是nBeginIndex,它的值就是你所选中的节点的INDEX值。
nEndindex-nBeginIndex就是该节点下的所有节点的数量(包括子节点的子节点。。) |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 7 樓
|
發表於: 星期一 三月 07, 2005 9:06 am 文章主題: |
|
|
*****正確程式如下. 但沒有檢查這個類似TREEVIEW的結構是否有問題.
func sumpoint
Lpara mparent
local a_word[1] &&--定義成區域陣列
select MenuID from mytable where ParentID=mparent into array a_word
local mtotal,i &&--定義成區域變數才不會因遞廻呼叫而混淆.
mtotal=0
for i=1 to alen( a_word )
mtotal=mtotal + 1 + sumpoint( a_word[i] ) &&--用 sumpoint 來統計這個 a_word[i]有多少個字節點.
next
return mtotal _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|