注册 登录
编程论坛 ASP技术论坛

一个二级联动的怪问题?请求大家研究

kira007 发布于 2007-11-05 18:10, 1014 次点击
前段时间做了个二级的菜单联动,联动条件 表A的 categoryid = 表B的 categoryid ;现在我将表A 的categoryid由数字型改为 文本型,联动条件改成 表A的 categoryid like '% " & 表B的 categoryid &"%' 后就不能联动了,是否做联动的 条件 不能使用 like 这种方式?
小弟在线期待大家的指点。
12 回复
#2
永夜的极光2007-11-05 18:37

具体现象是什么?

还有,第一个%后面是不是多了一个空格

#3
kira0072007-11-05 20:40
具体现象就是 ,二级类别栏目为空白,即使选择了一级大类,也是空白的。
注明:数据库中存在一级大类的从属二级子类的。
#4
kira0072007-11-05 20:53

补充以下代码给大家研究
<%
'从小类表中取出数据
set rs=server.CreateObject("adodb.recordset")
sql="select * from b2b_parductppp "
rs.open sql,conn,1,1
%>
<script language="JavaScript">
var num;
//定义数组
var calArray=new Array();
<%
dim j
j=0
do while not rs.eof
%>
//将小类表中的所有相关记录存到数组calArray的对应元素中,红色加粗值类型为文本型
calArray[<%=j%>]=new Array("<%=rs("MarkID")%>","<%=rs("MarkName")%>","<%=rs("category")%>");
<%
j=j+1
rs.movenext
loop
rs.close
set rs=nothing
%>
//给num赋值为记录总数
num=<%=j%>
function givevalue(myvalue){
/*当选择大类列表的值不为空时首先清空小类下拉列表的所有项目。不然小类列表中的项目会叠加的。
同时也是初始化 options 的值为0 */
document.myform.SelectMark.length = 0;
//循环写出请求的大类所对应的小类。
for (i=0;i < num; i++)
{
if (calArray[i][2] == myvalue)
{
document.myform.SelectMark.options[document.myform.SelectMark.length] = new Option(calArray[i][1], calArray[i][0],"","");
/*定义新的Option对象并赋值。options的索引值从0开始。new Option对象有4个属性,对应分别是:文本串、value、defaultSelect、selected。在这里只用了第一个和第二个。*/
}
}
}
</script>
---------------------------------------------------------------------------------------------------------
大类选择列表框
<select name="categoryid" onChange="givevalue(document.myform.categoryid.options[document.myform.categoryid.selectedIndex].value)">
<option value="0">---选择类别---</option>
<%
sort(0)
dim ii
ii=0
dim firstid
sub sort(selec)
sql="select * from category where ParentID = "&selec&" order by categoryorder"
Set Rs1=Conn.Execute(sql)
if rs1.eof or rs1.bof then
noclass=1
else
rs1.movefirst
firstid=rs1("categoryid")
do while not rs1.eof
if selec=0 then

%>
<option value="<%=int(rs1("categoryid"))%>"><%=rs1("category")%></option>
<%
else
%>
<option value="<%=int(rs1("categoryid"))%>"><%=string(ii*2," ")%><%=rs1("category")%></option>
<%
end if

ii=ii+1
sort rs1("categoryid")
ii=ii-1
rs1.movenext
loop
rs1.close
Set Rs1 = Nothing
end if
end sub

%>
</select>
-----------------------------------------------------------------------------------------------------------
小类关联列表框
<select name="SelectMark" >
<%if noclass=1 then%>
<option value="" selected>暂无品牌</option>
<%
else
'在没有选择大类(页面刚载入)时要载入的小类,要跟默认的大类对应。
set rs=server.CreateObject("adodb.recordset")
sql="select * from b2b_parductppp where category like '%"&firstid&"%' "
rs.open sql,conn,1,1
if rs.eof or rs.bof then
%>
<option value="" selected>暂无品牌</option>
<%
else
do while not rs.eof
%>
<option value="<%=rs("MarkID")%>"><%=trim(rs("MarkName"))%></option>
<%
rs.movenext
loop
end if
rs.close
set rs=nothing
end if
%>
</select>
----------------------------------------------------------------------------------------------------------

firstid 为 一级大类的联动关键值
无论这样sql="select * from b2b_parductppp where category like '%'"&firstid&"'%' "
还是这样sql="select * from b2b_parductppp where category like '%"&firstid&"%' "

#5
hmhz2007-11-05 22:46
为什么使用模糊查询呢?连动应该都是唯一值的吧,如果使用模糊查询做连动,很可能会起冲突的
#6
kira0072007-11-05 22:57

因为 它 拥有多重属性的关系,不能用唯一值来联动。

#7
永夜的极光2007-11-06 08:17
'在没有选择大类(页面刚载入)时要载入的小类,要跟默认的大类对应。
set rs=server.CreateObject("adodb.recordset")
sql="select * from b2b_parductppp where category like '%"&firstid&"%' "
rs.open sql,conn,1,1


这段默认值有没有载入呢
#8
yms1232007-11-06 09:04
个人认为二级联动列表框最好主要用Javascript来完成。
#9
hmhz2007-11-06 10:16
使用Ajax无刷新做联动菜单最好的
#10
放任一切2007-11-06 10:24

这里是一个四级联动的例子,个人感觉不错
改成二级或多级的也很方便。
可以参考一下!

只有本站会员才能查看附件,请 登录

#11
kira0072007-11-06 14:58
还是没能解决这个问题,只是把 原来的 数字型 categoryid 字段改为 文本型的 category,
联动关键 由 categoryid= "&firstid&" 改为 category like '%"&firstid&"%'
按道理应该可以才对的,为何只显示一片空白?
#12
kira0072007-11-07 11:36
[分享]奇怪的二级联动问题,解决了
以下是引用kira007在2007-11-5 20:53:47的发言:

补充以下代码给大家研究
<%
'从小类表中取出数据
set rs=server.CreateObject("adodb.recordset")
sql="select * from b2b_parductppp "
rs.open sql,conn,1,1
%>
<script language="JavaScript">
var num;
//定义数组
var calArray=new Array();
<%
dim j
j=0
do while not rs.eof
%>
//将小类表中的所有相关记录存到数组calArray的对应元素中,红色加粗值类型为文本型
calArray[<%=j%>]=new Array("<%=rs("MarkID")%>","<%=rs("MarkName")%>","<%=rs("category")%>");
<%
j=j+1
rs.movenext
loop
rs.close
set rs=nothing
%>
//给num赋值为记录总数
num=<%=j%>
function givevalue(myvalue){
/*当选择大类列表的值不为空时首先清空小类下拉列表的所有项目。不然小类列表中的项目会叠加的。
同时也是初始化 options 的值为0 */
document.myform.SelectMark.length = 0;
//循环写出请求的大类所对应的小类。
for (i=0;i < num; i++)
{
if (calArray[i][2] == myvalue)
{
document.myform.SelectMark.options[document.myform.SelectMark.length] = new Option(calArray[i][1], calArray[i][0],"","");
/*定义新的Option对象并赋值。options的索引值从0开始。new Option对象有4个属性,对应分别是:文本串、value、defaultSelect、selected。在这里只用了第一个和第二个。*/
}
}
}
</script>
---------------------------------------------------------------------------------------------------------
大类选择列表框
<select name="categoryid" onChange="givevalue(document.myform.categoryid.options[document.myform.categoryid.selectedIndex].value)">
<option value="0">---选择类别---</option>
<%
sort(0)
dim ii
ii=0
dim firstid
sub sort(selec)
sql="select * from category where ParentID = "&selec&" order by categoryorder"
Set Rs1=Conn.Execute(sql)
if rs1.eof or rs1.bof then
noclass=1
else
rs1.movefirst
firstid=rs1("categoryid")
do while not rs1.eof
if selec=0 then

%>
<option value="<%=int(rs1("categoryid"))%>"><%=rs1("category")%></option>
<%
else
%>
<option value="<%=int(rs1("categoryid"))%>"><%=string(ii*2," ")%><%=rs1("category")%></option>
<%
end if

ii=ii+1
sort rs1("categoryid")
ii=ii-1
rs1.movenext
loop
rs1.close
Set Rs1 = Nothing
end if
end sub

%>
</select>
-----------------------------------------------------------------------------------------------------------
小类关联列表框
<select name="SelectMark" >
<%if noclass=1 then%>
<option value="" selected>暂无品牌</option>
<%
else
'在没有选择大类(页面刚载入)时要载入的小类,要跟默认的大类对应。
set rs=server.CreateObject("adodb.recordset")
sql="select * from b2b_parductppp where category like '%"&firstid&"%' "
rs.open sql,conn,1,1
if rs.eof or rs.bof then
%>
<option value="" selected>暂无品牌</option>
<%
else
do while not rs.eof
%>
<option value="<%=rs("MarkID")%>"><%=trim(rs("MarkName"))%></option>
<%
rs.movenext
loop
end if
rs.close
set rs=nothing
end if
%>
</select>
----------------------------------------------------------------------------------------------------------

firstid 为 一级大类的联动关键值
无论这样sql="select * from b2b_parductppp where category like '%'"&firstid&"'%' "
还是这样sql="select * from b2b_parductppp where category like '%"&firstid&"%' "

问题在网友“做人很低调”的帮助下,问题完美解决了,只是把JS代码中的if中的条件换成calArray[i][2].indexOf(myvalue)!=-1 就实现了我所需要的效果!


#13
fuhuijun2007-11-07 12:07
我觉得应该是这样的:sql="select * from b2b_parductppp where category like '%"&firstid&"%' "
1