ACC四级联动搜索难题!

<form name="form">
一级类:<select name=Study_class ><option selected>请选择教材版本</option></select>
二级类:<select name=Academy ><option selected>请选择年级册别</option></select>
三级类:<select name=Special1 ><option selected>请选择单元类别</option></select>
四级类:<select name=Special2><option selected>请选择课文名称</option></select>
<label>
<input type="submit" name="Submit" value="查找">
</label>
</form>
求相关四级联动代码?
现有ACC数据库data.mdb,数据库中有4个表:card     grade    unite   name分别对应四个级别,怎样联动查询?
2007-8-10 16:15 SinNeR
一种实现方法就是跟二级联动的原理是一样的。
不去管四级联动,始终注意上下级联动的实现的正确,这样就能保证整个联动的正确性。
另外要注意的是,当一个select控件被上级控制发生变化的时候,所有的下级select控件都要清空。

2007-8-10 16:20 网狂
可否指点个相关例子,参考一下!拜托!

2007-8-10 16:29 SinNeR
[url]http://search.blueidea.com/?q=%E4%BA%8C%E7%BA%A7%E8%81%94%E5%8A%A8&tr=bbs[/url]

其实,如果不用ajax来实现的话,其实现过程大体如下
1。从数据库中取得需要的数据。
2。将数据拼写成字符串,拼写的字符串为javascript中可识别的数组或者其他格式的容器。
3。写javascript函数,操作javascript数组,实现菜单联动。
第2步第3步应该有类似的很成熟的代码。第一步要看你数据库的结构。

你可以分开来实现,先实现静态的页面根据javascript的数组元素实现联动,然后实现从数据库将取得的数据拼写成规定的形式。

这种方法并不是很好,察看源代码的时候会发现许多冗余代码。

有兴趣的话,可以把数据库对应表的结构贴出来,一起讨论一下。

2007-8-10 16:51 网狂
表一:card结构 ------CardID(数字类型)  CardName(文本)
                                    1                     人教版
                                    2                     苏教版
表二:grade 结构------GradeID(数字类型)  GradeName(文本)    CardID(数字类型)  
                                    1                     七年级上册                    1
                                    2                     七年级下册                    1
                                    3                     七年级上册                    2
                                    4                     七年级下册                    2
表三:unite结构------UniteID(数字类型)  UniteName(文本)  GradeID(数字类)   CardID(数字类型)
                                    1                     第一单元                    1                          1
                                    2                     第二单元                    2                          1
                                    3                     第三单元                    1                          2
                                    4                     第一单元                    2                          2
表四:Name结构------NameID(数字类型)  NameName(文本)   UniteID   GradeID   CardID
                                      1                        苏州园林           1           1             1
                                      2                        白杨礼赞           1           2             1
                                      3                        陈毅市长           2           2             2

2007-8-10 17:44 SinNeR
首先,数据库连接
取得如下的记录集
[code]
SELECT CardID CardName FROM card
[/code]

[code]
SELECT GradeID,GradeName,CardID FROM grade
[/code]

[code]
SELECT UniteID,UniteName,GradeID FROM unite
[/code]

[code]
SELECT NameID,NameName,UniteID FROM Name
[/code]
遍历ResultSet应该很熟悉了。
遍历的时候拼写成如下的字符串格式。
比如对于card表的记录集
var aCard=new Array();
aCard[0]=new Array();
aCard[0][0]="1";
aCard[0][1]="人教版";
aCard[1]=new Array();
aCard[1][0]="1";
aCard[1][1]="苏教版";
注意,aCard[0]=new Array();是头部,不参与循环。
aCard[0]=new Array();
aCard[0][0]="1";
aCard[0][1]="人教版";
是RS中循环要实现的。通过索引,各个字段名来拼写。

拼写完的字符串,在页面script代码中输出。
如ASP中拼写的字符串名位 strACard
<script language="javascript">
<%=strACard%>
</script>

其他几个类似。

2007-8-10 18:48 SinNeR
然后就是javascript的方法了。
这个方法可以写的共通些。
首先分析,我们的操作就是要把javascript数组中的元素生成SELECT控件的option对象。
比如select控件名为
<select name=Study_class ><option selected>请选择教材版本</option></select>
要显示的数组为aCard
基本的语句就是
document.forms[0].Study_class[i] = new Option(aCard[i][1],aCard[i][0]);

现在分析共通的javascript函数的流程,首先注意到最上级别控件要显示数组中全部的元素,而其余级别的Select控件要显示选择好了父元素对应的子元素。所以要区别开来。
另,如果第一层select控件选择变更的时候,第二层select控件刷新,那么第三,四层select控件中的元素就要清空。不然会有错误的。

综合以上,仔细的分析后,可以得到这个共通函数的逻辑大体如下
[code]
参数:
sltObj:要表示的select控件对象。
arrObj:要操作的数组对象
sltIndex:当前选择的option控件的value。 -1的时候代表没有选择,全部显示。
level:当前select控件的层次 用于判断是否要清空下层以后的控件。

流程
1。判断要生成的option数组的大小。
如果sltIndex为-1,则要生成的option数组的大小为arrObj的大小。
如果sltIndex不为-1,遍历arrObj,计算arrObj[i][2]的值为sltIndex的个数,这个值就是option数组的大小。
设得到的值为size.

定义option的大小。
sltObj.length = size;

2。初始化数组的Option对象。
首先清空Select控件中的Option。

如果sltIndex为-1,将全部的arrObj中的元素显示出来。
如果sltIndex不为-1,遍历arrObj,将arrObj[i][2]的值为sltIndex的数据显示出来。
具体代码为
sltObj[i] = new Option(arrObj[i][1],aarrObj[i][0]);

3。判断是否有要清空的对象。
这个时候要注意,可以在Script中先定义一个全局变量,用来存储各个Select控件。
比如,
allSltObj = new array();
allSltObj[0]= document.forms[0].Study_class;
...

判断
如果level + 2 > allSltObj.length,什么也不做。
否则,
for ( i = level + 2 -1;i<allSltObj.length;i++ ){
清空allSltObj[i]中的Option对象。
}
[/code]

以上就是这个函数的核心部分,另,细节上,避免某些触发事件出问题,建议给每个Select控件都加上形如<option selected>请选择教材版本</option>之类的选项。

调用的时候,基本如下
整个页面被初期化的时候,调用这个函数,初始化第一个select控件,其他的不管。
第一个至第三个空间触发onChange事件的时候,调用这个方法。
传入的参数依次如下
sltObj:下一个select对象。
arrObj:对应的存储下一个select控件中的数据的数组。
sltIndex:当前控件被选择的value。
level:当前select控件的层次。

基本上就是这样的流程了,这个方法的缺点是,数据很多的时候,打开页面,会发现好多代码。
而且初期化会很慢。
优点是只在初始化请求服务器,其他时候不会请求服务器。
具体是否要用看你的业务的特点来定。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值