发布一个无限级别分类算法
sfply 2004-11-24 02:08:23 由于目前在做库存管理系统,因此不可避免地遇到如“主材-电子材料-二极管-发光二极管”这类无限分类的问题。
由于没有时间去参考前辈们的做法,就自己写了一个,请高人不吝赐教.
数据库Class
ID 自动编号
ClassID 分类编号(必须唯一,建议采用1001-100101-10010101..这种直观的方法编号)
ClassName 分类名称
FatherID 父分类ID,一级分类为0
1、取得数据结构
i = 0
set rs = conn.execute("select * from Class order by ClassID")
if not rs.eof and not rs.bof then
do while not rs.eof and not rs.bof
i = i + 1
MyClassArray = MyClassArray & "|" & rs("ID") & "," & rs("WH_ClassName") & "," & rs("WH_ClassFather") & "," & rs("WH_ID")
rs.movenext
loop
end if
ArrayMyClass = split(MyClassArray,"|")
以上这个SQL将所有分类信息放在一个字符串中,以后就不需要再查询数据库了,因此可以考虑放在Application中,就可以免读数据库了
2、无限追溯父路径
比如,主材-电子材料-二极管-发光二极管
我目前所处在的位置是“发光二极管”,那么怎么把前面的所有父级别类别都显示并能够连接过去呢?
参数是?classid=
Private Function GetClass(id,urlstring) '无限分类列
for i = 0 to ubound(ArrayMyClass)
if ArrayMyClass(i) <> "" then
if split(ArrayMyClass(i),",")(0) = id then
if split(ArrayMyClass(i),",")(2) <> 0 then '这里控制如果追溯到一级分类了就不再调用嵌套调用过程了
GetClass = GetClass(split(ArrayMyClass(i),",")(2),"> <a href=?ClassID="&split(ArrayMyClass(i),",")(0)&">"&split(ArrayMyClass(i),",")(1)&"</a> "&urlstring)
else
GetClass = "> <a href=?ClassID="&split(ArrayMyClass(i),",")(0)&">"&split(ArrayMyClass(i),",")(1)&"</a> "&urlstring
end if
end if
end if
next
End function
response.write GetClass(request("ClassID"),"")
这里request("ClassID")是当前的分类ID,GetClass要两个参数,第一个是当前ID,第二个用于保存历史父路径信息
index.asp?classid=13 得到的执行结果是(HTML形式)
<a href=?ClassID=1>主材</a> > <a href=?ClassID=7>电子材料</a> > <a href=?ClassID=10>二极管</a> > <a href=?ClassID=13>发光二极管</a>
3、增加新分类
使用思想是和上面一样的
得到的形式是结果是这样的(HTML形式)
<select size="1" name="FatherID">
<option value=1>主材[1001]</option>
<option value=7>主材-电子材料[100101]</option>
<option value=10>主材-电子材料-二极管[10010101]</option>
<option value=13>主材-电子材料-二极管-发光二极管[1001010101]</option>
<option value=11>主材-电子材料-三极管[10010102]</option>
<option value=12>主材-电子材料-电阻[10010103]</option>
<option value=8>主材-塑料制品[100102]</option>
<option value=14>主材-塑料制品-塑胶材料[10010201]</option>
<option value=9>主材-金属材料[100103]</option>
<option value=2>辅料[1002]</option>
<option value=3>半成品[1003]</option>
<option value=4>成品[1004]</option>
<option value=5>工具设备[1005]</option>
<option value=6>其他[1006]</option>
</select>
这样排序井然,都得助于分类编号的标准,因为SQL是用分类排序的:)
过程代码
Private Function GetClassName(id,urlstring) '无限分类树
for i = 0 to ubound(ArrayMyClass)
if ArrayMyClass(i) <> "" then
if split(ArrayMyClass(i),",")(0) = id then
if split(ArrayMyClass(i),",")(2) <> 0 then
GetClassName = GetClassName(split(ArrayMyClass(i),",")(2),trim("-"&split(ArrayMyClass(i),",")(1))&urlstring)
else
GetClassName = trim(split(ArrayMyClass(i),",")(1))&urlstring
end if
end if
end if
next
End function
调用
<select size="1" name="FatherID">
<%
for j = 0 to ubound(ArrayMyClass)
if ArrayMyClass(j) <> "" then response.write "<option value="&split(ArrayMyClass(j),",")(0)&">"&GetClassName(split(ArrayMyClass(j),",")(0),"")&"["&split(ArrayMyClass(j),",")(3)&"]</option>"&vbCrLf
next
%>
</select>