请教解决方案,还是联动选择???
我要实现一个4级的选择,数据很多,放在数据库中,很长时间没搞定,各位大哥帮帮忙,给想个办法,用数组肯定很慢!不知用XML行不行,还有什么其他的方法吗?大哥们仁者见仁,给点例子?谢了!!!! 问题点数:100、回复次数:37Top
1 楼bananasmiling(解决问题时间)回复于 2003-12-03 17:13:32 得分 0
我想你还是用三级联动的思路来做四级联动的吧这样会比较省时..Top
2 楼online(龙卷风V4.0--决战江湖(MS MVP-VB))回复于 2003-12-03 21:03:04 得分 0
找一找三级联动的
Top
3 楼yllaji(51FE.COM)回复于 2003-12-04 00:19:21 得分 0
用三级联动 的方法来思考 四级
…… 4级…… 这么多?
呵呵 实在不行 给他来个 “下一步” 什么的,让他们一步步选 算了Top
4 楼Ngod(天泽)回复于 2003-12-05 21:22:20 得分 0
我看到了javascript斑竹的四级菜单,可是select中的value和显示的值是一样,我想用value中的值是代码。可真是很难??郁闷了十天了??现在刚有点想法。但是牺牲了数据库的空间可效率。真是心痛,而且做起来很烦。
继续等待赐教。。。。。。Top
5 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-06 00:51:01 得分 100
数据结构公开出来,我正想做一个四级的玩呢!!Top
6 楼Ngod(天泽)回复于 2003-12-06 12:17:17 得分 0
数据库中有编码和名称,编码是十二位的字符,前两位为生产线名称代码,第三位是大类,第四位到第七位为小类名称,最后五位是物品名称。
例如:
010000000000 XX生产线
011000000000 设备
012000000000 备件
011000100000 电机
011000100001 直流电机
等等.......Top
7 楼loveme2000ok(* °¤ °*)回复于 2003-12-06 12:44:29 得分 0
联动现在已经太热火了,
各位朋友,赐招吧。Top
8 楼yeno(人在广州)回复于 2003-12-06 12:59:36 得分 0
只做过一级联动,呵呵,用内嵌框架做吧,可以实现无限级联运哦Top
9 楼yeno(人在广州)回复于 2003-12-06 13:01:15 得分 0
也就是<iframe>,向<iframe>框架中的页面传值,只要会一级联运,就可以实现无限级联动,呵呵,楼主是否愿意一试?Top
10 楼WapWeb(大白菜芯)回复于 2003-12-06 13:19:15 得分 0
发给你一个联动下拉框的ASP例子吧
http://www.china-cu.net/bbs/dispbbs.asp?boardid=10&id=153
Top
11 楼ce200311(末叶)回复于 2003-12-06 13:31:33 得分 0
四级联动哦,也可以放在2或者3个列表里就搞定了,一个主栏目,接着是2级的读出全部的内容,如果还有子栏目的用
二级/s三级表示,我就是这样Top
12 楼yeno(人在广州)回复于 2003-12-06 15:11:28 得分 0
能解决一级联动的问题,就可以解决其它联动的问题,很高兴,联动的下一步
“根据不定字段查询”的难题在各路英豪帮助下已获解决
请参考贴:
http://expert.csdn.net/Expert/TopicView1.asp?id=2533108Top
13 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 00:59:02 得分 0
数据多和数据少的做法可不一样啊。
数据少的做法是一次全下到客户端,根据需要隐藏和显示某些东西。
数据多就要隐藏一个查询,模拟不刷新了。Top
14 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 04:45:40 得分 0
数据少的做法之一是:
<form id=f name=f>
生产线名称:<SELECT id=s1 name=s1 onchange="vbs:change me"></SELECT>
大 类 名称:<SELECT id=s2 name=s2 onchange="vbs:change me"></SELECT>
小 类 名称:<SELECT id=s3 name=s3 onchange="vbs:change me"></SELECT>
物 品 名称:<SELECT id=s4 name=s4 ></SELECT>
</form>
<SCRIPT LANGUAGE=vbscript >
Dim d,o ' 创建对象变量。
dim v'四个选择框的值
dim L:L=12'编码总长度
a=array(0,2,1,4,5)'编码分位规则:四级字符长度分别是2,1,4,5
Set d = CreateObject("Scripting.Dictionary")
<%
Dim Cn,Rs
Dim SQL,StrDSN
Set cn=Server.CreateObject("ADODB.connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
StrDSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db4.mdb")
Cn.Open strDSN
SQL="select * from tb"
Rs.Open SQL,cn,3,2
do while not Rs.EOF%>
d.Add "<%=rs("code")%>", "<%=rs("name")%>" <%Rs.MoveNext
loop
Rs.Close
Cn.Close
set rs=nothing
set cn=nothing
%>
for i=1 to 4
addo i
next
Sub change(obj)
n=right(obj.id,1)'n是级数
for i=n+1 to 4
remove i '移除
addo i '增加
next
End Sub
sub remove(x)'移除
for each ooo in eval("f.S" & x & ".options")
execScript "f.S" & x & ".remove " & ooo.index,"vbs"
next
end sub
sub addo(x) '增加
dim m:m=0'm代表祖宗字串的长度,假设根节点是12个0
for i=0 to x-1
m=m+a(i)
next
if x=1 then
v=string(L,"0")
else
set sss=eval("f.S" & x-1)
if sss.length=0 then exit sub
v=sss.item(sss.selectedIndex).value
end if
for each code in d.Keys
if left(code,m)=left(v,m) then
if mid(code,m+1,a(x))<>string(a(x),"0") then
if right(code,L-m-a(x))=string(L-m-a(x),"0") then
set o=document.createElement("option")
o.text=d.Item(code)
o.value=code
execScript "f.S" & x & ".add o","vbs"
end if
end if
end if
next
end sub
</SCRIPT>Top
15 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 04:49:13 得分 0
周日0点开始到
早晨4点半做完的
1小时写完成功,3小时把他浓缩优化,顺便实验一下一些技巧
想把代码写的短小明了就是费劲!Top
16 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 05:27:30 得分 0
四级连动(数据量少版)思路:
数据库db4.mdb
一个表TB,三个字段
id code name
1 |010000000000|XX生产线
2 |011000000000|XX设备
3 |012000000000|备件
4 |011000100000|电机
5 |011000100001|直流电机
6 |020000000000|YY生产线
8 |021000000000|YY设备
9 |022000000000|YY备件
10|021000100000|YY电机
11|021000100001|交流电机
12|030000000000|XX生产线
13|031000000000|XX设备
14|032000000000|备件
15|031000100000|电机
16|031000100001|直流电机
17|040000000000|zz生产线
18|041000000000|zz设备
19|042000000000|zz备件
20|041000100000|zz电机
21|041000100001|zz直流电机
22|050000000000|aa生产线
23|051000000000|aa设备
24|052000000000|aa备件
25|051000100000|aa电机
26|051000100001|aa直流电机
数据库中有编码和名称,
编码是十二位的字符,
前两位为生产线名称代码,
第三位是大类,
第四位到第七位为小类名称,
最后五位是物品名称。
首先声明这么设计数据库实际会给编程带来麻烦,
也不适合海量数据。
具体先不探讨。
但是既然数据库不能更改,那么说一下思路:
1,第一步:
数据量不是海量的情况下,可以一次载到客户端
只要能弄到客户端,什么都好办。
这里采用了dictionary对象,比常规数组方便些。
Dictionary 对象等价于 PERL 联合数组。
项目可以是数据的任何形式,并存储在数组中。每个项目都与一个具有唯一性的键相联。
该键用于取得单个项目,并且通常是整数或字符串,但也可以是除数组以外的任何类型。
客户端脚本中夹服务器端脚本,为项目赋值
<SCRIPT LANGUAGE=vbs>
略
Set d = CreateObject("Scripting.Dictionary")
<% 服务器读数据库循环%>
d.Add "<%=rs("code")%>", "<%=rs("name")%>"
<% 循环结束%>
</SCRIPT>
还有一种办法用控件载到客户端,参考二级连动select:
http://expert.csdn.net/Expert/topic/2174/2174874.xml?temp=.9758264
就是每级都生成无数隐藏起来的select,假连动,实际上是隐藏和显示
2,第二步:
动态增加option的原理
set opt=document.createElement("option")
opt.text="text"
opt.value="value"
form1.select1.add opt
删除
for each opt in form1.select1.options
form1.select1.remove opt.index
next
这样为每个下拉框写上onchange代码,基本成功
2,第三步:
合并类似的函数,优化,调试Top
17 楼Ngod(天泽)回复于 2003-12-07 13:33:03 得分 0
先谢谢superdullwolf(超级大笨狼) 兄。
我试试。Top
18 楼Ngod(天泽)回复于 2003-12-07 13:50:47 得分 0
superdullwolf(超级大笨狼) 说的没错,我也是把数据一次性的读到客户端,结果考虑到效率问题,才发了这个帖子,这种情况如果改变数据库的结构该怎么办呢?
要想每次只读出所需要的数据,是不是只能一步一步的提交数据,然后返回。
两种方法有得有失,有没有方法两全其美,那么如果是用这两种方法中的一种,分析一下那种更划算,数据量大概有几万条,十万以下。Top
19 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 15:17:53 得分 0
别着急,我的代码还没贴完呢,以上是为真正海量数据打基础,通过以上代码明白原理
下面的代码适合海量数据,原理是隐藏一个框架ifram尺寸0 X 0,每次改他的地址查寻结果通过parent传递。两个小文件,我敢说在csdn我做的4级连动代码最短!!
ss3.asp
<%
Dim Cn,Rs
Dim SQL,StrDSN
dim L:L=12'编码总长度
dim first:first=string(L,"0")
a=array(0,2,1,4,5)
Set cn=Server.CreateObject("ADODB.connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
StrDSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ="
StrDSN = StrDSN & Server.MapPath("db4.mdb")
Cn.Open strDSN
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body>
<IFRAME id=ifr
src="Q.asp?x=1&first=000000000000"
width=0 height=0> </IFRAME>
</div>
<form id=f name=f>
生产线名称:
<SELECT id=s1 name=s1 onchange="vbs:change me">
<%addfirst 1%>
</SELECT>
大 类 名称:
<SELECT id=s2 name=s2 onchange="vbs:change me">
<%addfirst 2%>
</SELECT>
小 类 名称:
<SELECT id=s3 name=s3 onchange="vbs:change me">
<%addfirst 3%>
</SELECT>
物 品 名称:<SELECT id=s4 name=s4 >
<%addfirst 4%></SELECT>
</form>
<%
Cn.Close
set rs=nothing
set cn=nothing
sub addfirst(x)
dim m:m=0'm代表祖宗字串的长度,假设根节点是12个0
for i=0 to x-1
m=m+a(i)
next
SQL="select * from tb where code like '" & left(first,m) & string(a(x),"_") & string(L-m-a(x),"0") & "' and code<>'" & first & "'"
'Response.Write SQL
Rs.Open SQL,cn,3,2
if Rs.RecordCount>0 then
first=rs("code")
do while not Rs.EOF%>
<option value="<%=rs("code")%>"><%=rs("name")%></option>
<%Rs.MoveNext
loop
end if
Rs.Close
end sub
%>
</body>
</html>
<SCRIPT LANGUAGE=vbscript >
Sub change(obj)
n=right(obj.id,1)'n是级数
ifr.location.href="Q.asp?x=" & n & "&first=" & obj.value
End Sub
</SCRIPT>
第二个文件
Q.asp
<%
Dim Cn,Rs
Dim SQL,StrDSN
dim L:L=12'编码总长度
dim first:first=string(L,"0")
a=array(0,2,1,4,5)
Set cn=Server.CreateObject("ADODB.connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
StrDSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ="
StrDSN = StrDSN & Server.MapPath("db4.mdb")
Cn.Open strDSN
x=Request("x")
first=Request("first")
sub addfirst(x)
dim m:m=0'm代表祖宗字串的长度,假设根节点是12个0
for i=0 to x-1
m=m+a(i)
next
SQL="select * from tb where code like '" & left(first,m) & string(L-m,"_") & "' and code<>'" & first & "'"
'Response.Write SQL
Rs.Open SQL,cn,3,2
if Rs.RecordCount>0 then
first=rs("code")
do while not Rs.EOF%>d.Add "<%=rs("code")%>", "<%=rs("name")%>"
<%
Rs.MoveNext
loop
end if
Rs.Close
end sub
%>
<SCRIPT LANGUAGE=vbscript >
Dim d,o ' 创建对象变量。
dim v'四个选择框的值
dim L:L=12'编码总长度
a=array(0,2,1,4,5)'编码分位规则:四级字符长度分别是2,1,4,5
Set d = CreateObject("Scripting.Dictionary")
<%addfirst x%>
change <%=x%>
Sub change(x)
n=right(x,1)'n是级数
for i=n+1 to 4
remove i '移除
addo i '增加
next
End Sub
sub remove(x)'移除
for each ooo in eval("parent.f.S" & x & ".options")
execScript "parent.f.S" & x & ".remove " & ooo.index,"vbs"
next
end sub
sub addo(x) '增加
dim m:m=0'm代表祖宗字串的长度,假设根节点是12个0
for i=0 to x-1
m=m+a(i)
next
if x=1 then
v=string(L,"0")
else
set sss=eval("parent.f.S" & x-1)
if sss.length=0 then exit sub
v=sss.item(sss.selectedIndex).value
end if
for each code in d.Keys
if left(code,m)=left(v,m) then
if mid(code,m+1,a(x))<>string(a(x),"0") then
if right(code,L-m-a(x))=string(L-m-a(x),"0") then
set o=document.createElement("option")
o.text=d.Item(code)
o.value=code
execScript "parent.f.S" & x & ".add o","vbs"
end if
end if
end if
next
end sub
</SCRIPT>Top
20 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 15:21:17 得分 0
以上代码适合海量数据,经简单测试好使,
因为每次调用查询传到客户端的东西有限,所以理论上适合海量数据。
Top
21 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 15:23:29 得分 0
还有100分双星!!!
superdullwolf在CSDN各个板块的得分综合表
板块 专家分 信誉分 等级
Web 开发 9902 97
Top
22 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 15:25:40 得分 0
数据量大概有几万条,十万以下。不算大。
用我的两种做法对比一下,看那个快?Top
23 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 16:06:26 得分 0
我用下面代码增加了1万多记录,速度还可以,还可以优化。
<%
Dim Cn,Rs
Dim SQL,StrDSN
dim a,b,c,d
dim AA,BB,CC,DD,EE
AA=10:BB=9:CC=10:DD=10
'AA=1:BB=1:CC=1:DD=1
'共10*9*10*10=10000个数据
Set cn=Server.CreateObject("ADODB.connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
StrDSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ="
StrDSN = StrDSN & Server.MapPath("db4.mdb")
Cn.Open strDSN
sql="select * from tb"
Rs.Open sql,cn,3,2
for a=1 to AA'增加10个生产线
Rs.AddNew
rs("code")=f(a,2) & string(10,"0")
rs("name")="生产线" & f(a,2)
for b=1 to BB '增加9个生产设备
Rs.AddNew
rs("code")=f(a,2) & b & string(9,"0")
rs("name")="设备" & f(a,2) & b
for c=1 to CC'增加10个备件类型
Rs.AddNew
rs("code")=f(a,2) & b & f(c,4) & string(5,"0")
rs("name")="备件类型" & f(a,2) & b & c
for d=1 to DD '增加10个电机
Rs.AddNew
rs("code")=f(a,2) & b & f(c,4) & f(d,5)
rs("name")="零件" & f(a,2) & b & f(c,4) & f(d,5)
next
next
next
next
Rs.Update
Rs.Close
Cn.Close
set rs=nothing
set cn=nothing
function f(x,y)
f=cstr(x)
do while len(f)<y
f="0" & f
loop
end function
%>Top
24 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 16:09:50 得分 0
如果4级分别用3个iframe能更快些!Top
25 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 16:10:54 得分 0
1万条记录还是第一种快!Top
26 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 16:23:49 得分 0
9万条也是第一种快!
建议用第一种!!Top
27 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 16:27:32 得分 0
哦,错了,9万条两种都很慢,看来我还要改Top
28 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 17:38:11 得分 0
哈哈,终于完成,四级连动完美版,access数据库,速度非常快!!!
两个小文件总共代码不超过80行!
文件一:ss3.htm
<form id=f name=f>
生产线名称:
<SELECT id=s1 name=s1 onchange="vbs:change me"></SELECT>
大 类 名称:
<SELECT id=s2 name=s2 onchange="vbs:change me"></SELECT>
小 类 名称:
<SELECT id=s3 name=s3 onchange="vbs:change me"></SELECT>
物 品 名称:<SELECT id=s4 name=s4 ></SELECT>
</form>
<IFRAME id=ifr
src="Q.asp?x=0&first=000000000000"
width=0 height=0> </IFRAME>
<SCRIPT LANGUAGE=vbscript >
Sub change(obj)
n=right(obj.id,1)'n是级数
ifr.location.href="Q.asp?x=" & n & "&first=" & obj.value
End Sub
</SCRIPT>
文件二:Q.asp
<%
Dim Cn,Rs
Dim SQL,StrDSN
dim L:L=12'编码总长度
dim first:first=string(L,"0")
a=array(0,2,1,4,5)
Set cn=Server.CreateObject("ADODB.connection")
Set Rs = Server.CreateObject("ADODB.Recordset")
StrDSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ="
StrDSN = StrDSN & Server.MapPath("db4.mdb")
Cn.Open strDSN
x=cint(Request("x"))+1
first=trim(Request("first"))
sub addfirst(x)
dim m:m=0'm代表祖宗字串的长度,假设根节点是12个0
for i=0 to x-1
m=m+a(i)
next
SQL="select * from tb where code like '" & left(first,m) & string(a(x),"_") & string(L-m-a(x),"0") & "' and code<>'" & first & "'"
Rs.Open SQL,cn,3,2
if Rs.RecordCount>1 then
first=rs("code")
do while not Rs.EOF%>d.Add "<%=rs("code")%>", "<%=rs("name")%>"
<%
Rs.MoveNext
loop
end if
Rs.Close
end sub
%>
<SCRIPT LANGUAGE=vbscript >
Dim d,o ' 创建对象变量。
Set d = CreateObject("Scripting.Dictionary")
<%addfirst x%>
dim x:x=<%=x%>
dim first:first="<%=first%>"
remove x '移除
addo x '增加
sub remove(x)'移除
for each ooo in eval("parent.f.S" & x & ".options")
execScript "parent.f.S" & x & ".remove " & ooo.index,"vbs"
next
end sub
sub addo(x) '增加
for each code in d.Keys
set o=document.createElement("option")
o.text=d.Item(code)
o.value=code
execScript "parent.f.S" & x & ".add o","vbs"
next
end sub
if x <4 and eval("parent.f.S" & x & ".length")<>0 then window.location.href="Q.asp?x=" & x & "&first=" & first
</SCRIPT>
<%Cn.Close
set rs=nothing
set cn=nothing%>
Top
29 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 17:38:46 得分 0
9万条记录运行如飞!!Top
30 楼possible_Y(████本人签名需要刮开,方可看到 )回复于 2003-12-07 18:01:35 得分 0
哇塞……
哈哈Top
31 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 18:11:21 得分 0
说明:
哈哈,终于完成,我做的四级连动完美版,access数据库,速度非常快!!!
两个小文件总共代码一共不超过80行!9万条记录运行如飞!!
问题起因:
http://expert.csdn.net/Expert/topic/2523/2523437.xml?temp=.5512812
我马上要升两星了,还差一百分,估计是明天
升完后我也要忙工作了
不能再沉迷在这里了
哎,舍不得这里给我这样的快乐和成就感!
哈哈,终于完成
我敢说csdn里面数据库下拉列表我的代码最短!
完全vbs,无特殊组件
思路:
数据库db4.mdb
一个表TB,三个字段
id code name
1 |010000000000|XX生产线
2 |011000000000|XX设备
3 |012000000000|备件
4 |011000100000|电机
5 |011000100001|直流电机
6 |020000000000|YY生产线
8 |021000000000|YY设备
9 |022000000000|YY备件
10|021000100000|YY电机
11|021000100001|交流电机
12|030000000000|XX生产线
13|031000000000|XX设备
14|032000000000|备件
15|031000100000|电机
16|031000100001|直流电机
17|040000000000|zz生产线
18|041000000000|zz设备
19|042000000000|zz备件
20|041000100000|zz电机
21|041000100001|zz直流电机
22|050000000000|aa生产线
23|051000000000|aa设备
24|052000000000|aa备件
25|051000100000|aa电机
26|051000100001|aa直流电机
数据库中有编码和名称,
编码是十二位的字符,
前两位为生产线名称代码,
第三位是大类,
第四位到第七位为小类名称,
最后五位是物品名称。
首先声明这么设计数据库实际会给编程带来麻烦,
也不适合海量数据。
具体先不探讨。
但是既然数据库不能更改,那么说一下思路:
1,第一步:
数据量大,必须考虑异步调用,采用隐藏iframe的办法
前三个每次change事件刷新这个iframe
<SELECT id=s1 name=s1 onchange="vbs:change me"></SELECT>
。。。
ifr.location.href="Q.asp?x=" & n & "&first=" & obj.value
2,第二步:
动态增加option的原理
set opt=document.createElement("option")
opt.text="text"
opt.value="value"
form1.select1.add opt
删除
for each opt in form1.select1.options
form1.select1.remove opt.index
next
在iframe里面偷换parent里面的显示
3,第三步:
因为是连动,那么iframe每次刷新都要继续向后刷新,直到最后
if x <4 and eval("parent.f.S" & x & ".length")<>0 then window.location.href="Q.asp?x=" & x & "&first=" & first
Top
32 楼nbstoneboy(stoneboy)回复于 2003-12-07 18:23:03 得分 0
关注Top
33 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-07 18:23:37 得分 0
下载:http://www.ymdg.com/s4.rarTop
34 楼monkeys(Myron.Liu)回复于 2003-12-07 18:42:44 得分 0
好人Top
35 楼Ngod(天泽)回复于 2003-12-09 13:07:51 得分 0
感动中.......
Top
36 楼xhbmj(《升龙道》)回复于 2003-12-09 16:09:07 得分 0
感谢笨狼的热心Top
37 楼netfly2003(netfly)回复于 2004-02-24 18:02:08 得分 0
我們現在用的都五級連動的,Top




