国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
ASP無限級分類的簡單算法實現(xiàn)及代碼重點講解--
ASP無限級分類的簡單算法實現(xiàn)及代碼重點講解
                                                                                                春暖花開 - BY - 2006-5-13 17:42:00
一、前言
很多情況下二級分類已經(jīng)不能滿足需要了,而網(wǎng)上可用的多級分類的例子實在是不好找,故有此文。
www.blueidea.com/bbs/newsdetail.asp?id=1182243&posts=current
大家可以先看這個,它介紹了一種超級好的算法,反正我是看不大懂呀。
二、我們要解決的問題:
1、 分類算法常常表現(xiàn)為樹的表示和遍歷問題。那么,請問:如果用數(shù)據(jù)庫中的一個Table來表達樹型分類,應該有幾個字段?
2、 如何快速地從這個Table恢復出一棵樹;
3、 如何判斷某個分類是否是另一個分類的子類;
4、 如何查找某個分類的所有產(chǎn)品;
5、 如何生成分類所在的路徑。
6、 如何新增分類;
三、遞歸實現(xiàn)的優(yōu)點與缺點
該怎么實現(xiàn)多級分類呢?
估計首先想到的都是遞歸,實現(xiàn)簡單,在指定節(jié)點(就是分類,下同)下添加、修改、刪除節(jié)點都不是問題,而且節(jié)點移動實現(xiàn)起來也不是很難,只是要注意移動目的父節(jié)點不能是當前節(jié)點的父節(jié)節(jié)點(等于沒移動),也不能是當前節(jié)點的子節(jié)點(類似于window文件夾,一個文件夾是不能移動到自己的字文件夾里的)。
但是最愁人的是搜索指定節(jié)點下的東西,怎么辦?也就是上面的問題3。記住,這是要包括所有子節(jié)點的,難道還去遞歸嗎?
四、介紹下我的簡單算法(是我所用的,不是我發(fā)明的)
以常見的商品系統(tǒng)為例。表結(jié)構(gòu)
[1]分類表,T_Sort,表結(jié)構(gòu)如圖一所示。其中sortPath保存的是節(jié)點路徑,這是個重點。
[2]商品表,T_Product,表結(jié)構(gòu)如圖二所示。



4.2 算法簡要說明
[1]parentID保存的自然是節(jié)點的父節(jié)點,如果一個節(jié)點的parentID=0時,認為它是一級分類。
-->[2]一個節(jié)點的sortPath為它的父節(jié)點的sortPath+自己的sortID+","。如sortID=32的節(jié)點的父節(jié)點是節(jié)點21,節(jié)點21的sortPath是"0,21,",那么節(jié)點32的sortPath就是"0,21,32,"。有點繞,看圖三清楚啦。可能你想不通為啥最后要多個逗號啊,后面你就明白啦。所有節(jié)點的sortPath的左邊兩位都是"0,",因為它們都在根節(jié)點下。一個節(jié)點的sortPath一定包含在它的子節(jié)點的sortPath中。

4.3 代碼重點講解。
這里以我們要實現(xiàn)的功能為例講解。
[1]添加節(jié)點
--><1>選擇父節(jié)點,可以是根節(jié)點,或是下級所有節(jié)點(最好列出一個樹型菜單讓用戶選擇,別愁,可以實現(xiàn)),其實就是選擇parentID。
--><2>如果parentID=0,那么上級sortPath="0,",如果parentID<>0,那么到表T_Sort根據(jù)parentID取得上級sortPath。
--><3>給T_Sort新增記錄,sortPath=上級sortPath +新記錄的sortID +","。
--><4>范例代碼見圖4、圖5。其中noRecord,closeRs(),showMsg(),closeConn()都是我定義的Function或Sub,它們的功能都是顧名思義的,我就不說了。注意一下,如果你用MS SQL,代碼略有不同。我也很奇怪MS SQL時,addNew后,這個新的自動編號可以輸出,但是和字符一連接就沒有了。各位如果知道為什么,還請相告。



[2]修改節(jié)點
節(jié)點的屬性只有一個名字而已,直接update就可以了,就不說了。
[3]刪除節(jié)點
--><1>選擇節(jié)點
--><2>如果parentID=0,報錯,根節(jié)點不能刪除。
--><3>刪除該節(jié)點及所有子節(jié)點。你可能想是不是很麻煩啊,哈哈,其實我只用了一個SQL語句就搞定啦。
(Access)sql="delete from T_Sort where Instr(sortPath,‘,"&parentID&",‘)>0"
(MS SQL)sql="delete from T_Sort where CHARINDEX(‘,"&parentID&",‘,sortPath)>0"
本算法的精華就在這里啦,仔細想想吧,sortPath最后那個逗號的作用也在這里啦。
--><4>刪除上述所有節(jié)點下的商品。同上,表名不同而已。
(Access)sql="delete from T_Product where Instr(sortPath,‘,"&parentID&",‘)>0"
(MS SQL)sql="delete from T_Product where CHARINDEX(‘,"&parentID&",‘,sortPath)>0"
--><5>范例代碼見圖6。MS SQL的代碼就不貼了。

[4]移動節(jié)點
難點哦,睜大眼睛仔細看。
--><1>選擇要移動的節(jié)點parentID,選擇目的節(jié)點toParentID(也就是把當前節(jié)點放到誰的下面)。
--><2>如果parentID=0報錯,根節(jié)點不能移動。
--><3>如果toParentID=parentID,這是要把自己放到自己下面,報錯。
--><4>根據(jù)parentID,取得它的sortPath,我們叫它fromPath。
--><5>如果toParentID=0,那么toPath="0,",如果toParentID<>0,取得它的sortPath,叫它toPath。
--><6>如果toParentID等于要移動節(jié)點的父節(jié)點,不需要移動,報錯。判斷方法是看toPath & parentID &","是否等于fromPath。
--><7>如果toParentID是要移動節(jié)點的子節(jié)點,不能移動,報錯。判斷方法是看Instr(toPath,fromPath)是否大于0。
--><8>組合要移動節(jié)點的新sortPath,也就是newPath=toPath & parentID &","。
--><9>更新要移動節(jié)點及其所有子節(jié)點的sortPath()。如"0,2,3,5,"移動到"0,1,"下,那么新的sortPath就是"0,1,5,"了(想想,對吧)。而"0,2,3,5,"的所有子節(jié)點的左半部分都是"0,2,3,5,",那么只要把"0,2,3,5,"替換成"0,1,5,"就行了。
(Access)sql="update T_Sort set sortPath=‘"&newPath&"‘+Mid(sortPath,Len(‘"&fromPath&"‘)+1) where Instr(sortPath,‘"&fromPath&"‘)>0"
(MS SQL)sql="update T_Sort set sortPath=replace(sortPath,‘"&fromPath&"‘,‘"&newPath&"‘) where CHARINDEX[(‘"&fromPath&"‘,sortPath)>0"
因為Access好像沒有內(nèi)置repalce函數(shù),所以麻煩了一些。
--><10>更新要移動節(jié)點的parentID。直接update就行啦。
--><11>商品是跟隨分類走的,所以商品的parentID不用更新,只要更新它的sortPath就行了。語句同<9>,只是表名換成T_Product。
--><12>范例代碼見圖7。MS SQL的代碼只有上面2個SQL語句不同,不貼了。

[5]前臺分類瀏覽商品
前臺一般都不會把所有類別一下子都列出來,都是分級瀏覽的,一層一層的看。我們要做的只是瀏覽一個分類時,把它的下級分類列出來。
--><1>取直接子類別,很簡單啦。
sql="select sortID,sortName from T_Sort where parentID="&sortID 就行啦。
--><2>一般我們都會顯示一個當前位置,就是分類所在的路徑,怎么辦呢?難道去遞歸查詢嗎?當然不,我這里用了一個小技巧。
瀏覽某一個分類的時候,我們會有一個sortID,可以根據(jù)它從T_Sort取得sortPath....不說了,大家看示范代碼吧,不懂問我。
范例代碼見圖8。

<%for i=1 to UBound(myArray)
 response.write "-> <a href=‘product.asp?sortID="&myArray(i)&"‘>"&getValueByID(myArray(i),nameArray)&"</a>"
next%>
就OK了。getValueByID是我寫的一個Function,見后。
--><3>顯示該類別及其所有子類別下的所有商品。
sql="select * from T_Product where Instr(sortPath,‘,"&sortID&",‘)>0"
如果只顯示該類別下的商品,那么就用parentID判斷就行了。
[6]前臺檢索商品
如果你的檢索表單不包含商品類別,那么沒有什么特殊的。如果有商品類別的話,也很簡單,SQL的where條件里加一個
"and Instr(sortPath,‘,"&sortID&",‘)>0"就行了。
[7]后臺商品添加、修改
添加是要選擇所在的分類,這樣就可以得到sortID,并能取得它的sortPath,保存到商品記錄就行了。修改類似。
[8]后臺商品刪除
和分類不相關(guān),直接根據(jù)productID刪除就可。
五、附加信息
目前還沒有拆分出來的代碼給大家(太麻煩),主要的東西都在上面啦。
‘-----根據(jù)ID取得name的Sub-----------------
Function getValueByID(sortID,inArray)
 dim i
 if NOT IsArray(inArray) then
  getValueByID=""
  Exit Function
 end if
 for i=0 to UBound(inArray,2)
  if Cstr(sortID)=Cstr(inArray(0,i)) then
   getValueByID=inArray(1,i) ‘返回name
   Exit Function
  end if
 next
 getValueByID=""
End Function
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Chrome擴展開發(fā)指南(8)——Bookmarks(書簽操作)
數(shù)據(jù)庫表TreeView樹的快速生成
SQL集合運算參考及案例(二):樹形節(jié)點數(shù)量逐級累計匯總
樹形結(jié)構(gòu) 數(shù)據(jù)庫表設計
【Mysql左右值】左右值法實現(xiàn)Mysql無限級分類
在Oracle中選取有父子或樹狀關(guān)系的數(shù)據(jù)記錄
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服