欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

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



4.2 算法簡(jiǎn)要說(shuō)明
[1]parentID保存的自然是節點(diǎn)的父節點(diǎn),如果一個(gè)節點(diǎn)的parentID=0時(shí),認為它是一級分類(lèi)。
-->[2]一個(gè)節點(diǎn)的sortPath為它的父節點(diǎn)的sortPath+自己的sortID+","。如sortID=32的節點(diǎn)的父節點(diǎn)是節點(diǎn)21,節點(diǎn)21的sortPath是"0,21,",那么節點(diǎn)32的sortPath就是"0,21,32,"。有點(diǎn)繞,看圖三清楚啦??赡苣阆氩煌樯蹲詈笠鄠€(gè)逗號啊,后面你就明白啦。所有節點(diǎn)的sortPath的左邊兩位都是"0,",因為它們都在根節點(diǎn)下。一個(gè)節點(diǎn)的sortPath一定包含在它的子節點(diǎn)的sortPath中。

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



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

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

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

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久