关于ASP查询动态字段的探讨,高手请进!(一个超难的问题!!!)

yeno 2003-12-05 10:37:18
我有两个联运的下拉框,分别命名为S1,S2,S3,input4
查询方式:S1=S2 and S3=S4
S1有如下值:用户姓名,手机号码,银行账号……(字段值的多少由数据库而定)
S2是按照S1的值实现了联动
也就是当S1选择“用户姓名”时,S2中显示所有的用户姓名以供选择
S3有如下值:姓名,证件号码,手机……(下拉框的内容也是直接从数据库中提取)
input4 为一文件输入框,按照S3中选择的查询条件输入查询内容

现在要做的工作就是从数据库中查询记录显示:
S1中选取的内容作为要查询的字段,S2选取的内容作为该字段的值
例如:用户姓名=张三
这时S1中选取的内容是用户姓名,而S2中选取的内容是张三
要求实现下列查询功能
select * from table where S1=S2 and S3=S4
S1与S3分别为前面选择的要查询的字段名
S2与S4则为要查询的条件
应该怎样实现这样的联动不定值字段查询功能?寻高手相助
...全文
119 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
liugys 2003-12-19
  • 打赏
  • 举报
回复
to loveme2000ok:
关于模块化开发,需要程序员对工作的热爱,有改善自己工作的决心及行动:)

to yeno(无忧天):
关于联动不定字段,应该需要做张映射表,保存查询字段与对应数据表之间的关系。
查询时可以分级读取,即选中查询字段,再从数据库中读取对应表的记录。
关于不刷新页面生成select,网上资料很多。
yeno 2003-12-08
  • 打赏
  • 举报
回复
呵呵,兄弟们,既然没人来讨论,我想该结贴啦
yeno 2003-12-07
  • 打赏
  • 举报
回复
我寻问了不少世外高人,联动不定字段查询,确实有很大的难度
或许它会是个死节吧
yeno 2003-12-06
  • 打赏
  • 举报
回复
嗯,衷心感谢各位的回答,联动的问题在此之前已经解决,现在是要将联动框的内容作为查询条件,此问题比较费解的就是,查询的字段是个未知数
不知道当前查询的是哪个字段,也就是当前查询的字段是不可预知的
如果知道查询的字段的话,那只要用
select
case...
end select
就可以解决了,可是,要查询的本身就不知道是哪个字段呀,所以无从下手了,帮帮忙呀,各路大侠!
meizz 2003-12-06
  • 打赏
  • 举报
回复
发给你一个联动下拉框的ASP例子吧:
<%@ Language=VBScript codepage=936 %>
<% Option Explicit %>
<!-- 数据库结构 两个字段 provinceName(省名) cityName(城市名) -->
<!-- #include file="connection.asp" -->
<script language=javascript>
<%
dim RS
Set RS = Server.CreateObject("ADODB.Recordset")
RS.open "SELECT * FROM tableName ORDER BY provinceName DESC", Conn, 0, 1

dim provinceName '省名
dim provinceList '记录所有的省名, 最后输出到JS里组成省名数组
dim cityList '记录某个省的所有城市名, 最后输出到JS里组成城市名数组
dim cityIndex 'JS的city数组名与省名下拉框的索引对应
cityIndex = 1

do while not RS.eof
if isEmpty(provinceName) then
cityList = cityList & chr(34) & Trim(RS("cityName")) & chr(34) &","
provinceName = Trim(RS("provinceName"))
else
if provinceName<>Trim(RS("provinceName")) then
provinceList = provinceList & chr(34) & provinceName & chr(34) &","
if not isEmpty(cityList) then Response.write "var city"& cityIndex &_
" = ["& Left(cityList, Len(cityList)-1) &"];"& VBCrLf
'输出每个省所对应的城市名的列表并组成JS的数组, 数组形式参考下面的实例
cityIndex = cityIndex + 1
cityList = ""
end if
provinceName = Trim(RS("provinceName"))
cityList = cityList & chr(34) & Trim(RS("cityName")) & chr(34) &","
'将每个省里的所有城市名组成一串字串
end if
RS.movenext
loop

if not isEmpty(cityList) then
Response.write "var city"& cityIndex &" = ["& Left(cityList, Len(cityList)-1) &"];"& VBCrLf
end if
if not isEmpty(provinceName) then
provinceList = provinceList & chr(34) & provinceName & chr(34) &","
Response.write "var provinceName = ["& Left(provinceList, Len(provinceList)-1) &"];"
'输出省名字串并组成省名的JS数组, 形式见下实例
end if

RS.close : Set RS=nothing
Conn.close : Set Conn=nothing
%>
</script>

<form name=form1>
<select name=province onchange="cityName(this.selectedIndex)">
<option value="">请选择省名</option>
</select>

<select name=city>
<option value="">请选择城名</option>
</select>
</form>

<script language=javascript>

/* 若要直接看下拉框联动效果的话, 将这段被注释的代码起用, 且上面的那段ASP注释即可
var provinceName = ["浙江", "江苏", "安徽", "江西"];
var city1 = ["杭州", "宁波", "温州", "绍兴", "金华", "湖州"];
var city2 = ["南京", "苏州", "无锡", "常州", "镇江", "徐州"];
var city3 = ["合肥", "翕县", "黄山", "祁门", "休宁"];
var city4 = ["南昌", "九江", "赣州", "上饶", "新余", "景德镇"];
//你在ASP输出的页面里应该看到如上这般的JS数组, 能看到则表示成功
*/


function province()
{

var e = document.form1.province;
for (var i=0; i<provinceName.length; i++)
e.options.add(new Option(provinceName[i], provinceName[i]));
}
function cityName(n)
{
var e = document.form1.city;
e.options.length = 1;
if (n == 0) return;
var a = eval("city"+ n); //得到城市的数组名
for (var i=0; i<a.length; i++) e.options.add(new Option(a[i], a[i]));
}
window.attachEvent("onload", province); //初始时给省名下拉框赋内容
</script>
bushido 2003-12-06
  • 打赏
  • 举报
回复
问题的根本就是在,从两个联动的下拉框中选取查询条件时,再从第三个下拉框随意选一个条件,然后点击查询,可是点击按钮不但不会让页面跳出,还把查询值给清掉,如果保留查询值才是最关键所在。

不就是想保留查询值吗?
select1,select2,input3
当选择select1时,给select1的option里的value增加值,比如
<select name=select1 onchange=top.location=this.options[this.selectedIndex].value+"&select1="+this.selectedIndex

在Customer.asp里,取得select1值,用来选定原来的选项,其它类同
这些都是jscript角本的设计,没有什么太难的呀
yeno 2003-12-06
  • 打赏
  • 举报
回复
怎么没有回答?自己再UP一次,帮帮我呀!
loveme2000ok 2003-12-06
  • 打赏
  • 举报
回复
各位,伸个援助之手吧,
这个问题说到底就是一个变量保存有关的问题。
yeno 2003-12-06
  • 打赏
  • 举报
回复
如何实现这样的联动不定值字段查询功能,期待各位圣手的佳音
yeno 2003-12-06
  • 打赏
  • 举报
回复
那就进一步深讨“联动不定字段查询原理”吧
前提是要查询的字段是不确定的
loveme2000ok 2003-12-06
  • 打赏
  • 举报
回复
liugys(liuliu) :这位仁弟说的很道理,敢问一下,你有没有这方面开发经验,给小弟明示。
liugys 2003-12-06
  • 打赏
  • 举报
回复
其实纯粹的联动很简单的,就是一个数组的查询。

开发过一次的东西,要下次使用,可能还是比较麻烦,

封装起来就不同了,可以任意次快速的调用,这就是软件开发过程中的积累
i三千 2003-12-06
  • 打赏
  • 举报
回复
顶一顶
yeno 2003-12-06
  • 打赏
  • 举报
回复
谢了,兄弟,希望愿意学习和更深层次掌握联动的朋友都来看一看,顶一顶,
都来交流一下呀!

会聚CSDN联动讨论高手!!
liugys 2003-12-06
  • 打赏
  • 举报
回复
大家有兴趣可以看看我写的二级联动类。
封装得比较好。
支持同一页面多次使用二级联动,可以很容易的改造为N级联动

<%
' -------------------------------------------------------------------------------
' Copyright (c) 2002-2004
' All rights reserved.
' Filename :common_link2menu.asp
' Abstract :公共二级联动模块
' Version :1.0
' Author :LiuGuoyuan@boco.com.cn
' Finished Date :2003-01-23
' Last Modified :2003-02-13
'
' 使用方法:
' 一、创建二级联动类(类名可自行定义)
' Set testMenu=New Link2Menu

' 二、设置类参数:
' 1、parentObjectName ---父菜单名称|文字
' 例:testMenu.parentObjectName = "equfm_id|端口状态"
' 2、parentSQL ---父菜单生成SQL,(字段1为ID号,字段2为名称)
' 例:testMenu.parentSQL = "SELECT equ_id,equ_code FROM iptia_equipment ORDER BY equ_id"
' 3、childObjectName ---子菜单名称|文字
' 例:testMenu.childObjectName = "vlan_id|VLAN"
' 4、childSQL ---子菜单生成SQL,第一字段必须与父菜单SQL的第一字段相同
' 例:testMenu.childSQL = "SELECT equ_id,vlan_id,vlan_code FROM iptia_vlan ORDER BY vlan_id"
' --- 可选参数 ---
' 1、isModify = true | false '是否修改状态,默认为false, 用以跳转到到默认选项
' 例: testMenu.isModify=true
' 2、rsName = [recordSet Name] '记录集名称,默认为"rs",记录集修改时使用

' 三、执行初始化: testMenu.Init()

' 四、WEB页显示:
' 父菜单:testMenu.ShowParentMenu()
' 子菜单:testMenu.ShowChildMenu()
' 备注:为数据修改状态时,需要设置isModify=true

' 五、撤消对象: Set testMenu=Nothing
'-------------------------------------------------------------------------------------
%>
<%
Dim link2Menu_FirstRun '是否第一次运行
link2Menu_FirstRun=true

Class Link2Menu
Public strParentMenu,strChildMenu
Public hiddenMenu
Public parentObjectName,childObjectName,parentSQL,childSQL
Public isModify '是否修改状态
Public rsName '记录集名称

Public Function Init()
'二级联动菜单
Dim objRS,SQL
Dim parentObject,childObject
Dim parentObjectText,childObjectText
parentObject = split(parentObjectName,"|")(0)
childObject = split(childObjectName,"|")(0)
parentObjectText = split(parentObjectName,"|")(1)
childObjectText = split(childObjectName,"|")(1)
if isModify="" Then isModify=false

hiddenMenu="treeCode_"&parentObject '隐藏表单对象名称,保存联动菜单内容
Set objRS=Server.CreateObject("ADODB.Recordset")
SQL = parentSQL
objRS.Open SQL,Conn,1,1
'---生成父菜单--
strParentMenu="<select name='"&parentObject&"' onChange=""ChangeLinkMenu(this.options[this.selectedIndex].value,'"&hiddenMenu&"','"&childObject&"','"&parentObject&"')"">"&_
"<option value=""-1"" selected>--- 请选择"&parentObjectText&" ---</option>"
Do While Not objRS.EOF
strParentMenu=strParentMenu&"<option value="""&objRS(0)&""">"&objRS(1)&"</option>"
objRS.MoveNext()
Loop
strParentMenu=strParentMenu&"</select>"
objRS.Close

'---生成子菜单内容---
SQL=childSQL
objRS.Open SQL,conn,1,1
objRS.Cachesize = 5
treeCode = "<input type='hidden' disable='true' name='"&hiddenMenu&"' value='"
Do While Not objRS.EOF
treeCode=treeCode & objRS(0) &","& objRS(1)&","&objRS(2)&";"
objRS.MoveNext()
Loop
treeCode = treeCode & "'>"
Response.Write treeCode
objRS.Close
Set objRS = Nothing

strChildMenu="<select name='"&childObject&"' size='1'>"&_
"<option value='' selected>--- 请选择"&childObjectText&" ---</option>"&_
"</select>"
If link2Menu_FirstRun Then '第一次运行时输出JS
%>
<script language="javascript">
function ChangeLinkMenu(id,dataObject,childObject,parentObject)
{//二级联动-改变子菜单,参数说明:id: 所选父菜单的值
var name,count,j;
var treeCode=new Array();
var dataObject=eval("document.all."+dataObject); //数据对象:源数据所在对象
var childObject=eval("document.all."+childObject); //目标对象
var parentObject=eval("document.all."+parentObject); //父对象
treeCode=dataObject.value.split(";");
count=treeCode.length-1;
j=1;

if (id!=-1 && id!="")
{
childObject.options.length=1;
for (i=0;i<count;i++)
{
treeCodeItem=new Array(3);
treeCodeItem=treeCode[i].split(",");
nodeType=treeCodeItem[0];
nodeId=treeCodeItem[1];
nodeName=treeCodeItem[2];
if (nodeType==id)
{
childObject.options.length=j+1;
childObject.options[j]=new Option(nodeName,nodeId);
j++;
}
}
childObject.options[j>1?1:0].selected=true;
}
else
{
childObject.options.length=1;
childObject.options[0].selected=true;
}
}
function SelectItem(strValue,ObjName,selMode){
/*函数功能:选中菜单记录
参数说明:
strValue: 数字或字符
值,用于与菜单值匹配,该内容一般来自数据库中,如果菜单为多选,则数值之间用“,”(逗号)分隔,如"24,33,25,23"
ObjName:
菜单名称,可用全名,如:"document.form1.selMenu",也可用缩写,如"selMenu"
selMode:
选择模式,默认0单选,1多选。
如用在页面修改中需调用checkform.js
*/
var numargs = arguments.length; //返回的参数数量
var sourceObject; //进行匹配的菜单对象
var isFinded = false; //是否找到匹配内容
var i,j;

if (numargs>1){
if (ObjName.search(/\./g)<0) //对象名称不包含".",则搜索对象
sourceObject=FindObject(ObjName) //FindObject函数在checkform.js中
else
sourceObject=eval(ObjName);
}else{
sourceObject=eval("document.all.selectTree"); //设置缺省对象
}

if ((""+strValue)==""){
sourceObject.options[0].selected=true;
}else{
if (selMode==1){ //多选菜单
var aryID=strValue.split(",");
if (aryID.length==0) return;
for (j=0;j<aryID.length;j++){
for (i=0;i<sourceObject.options.length;i++){
if (sourceObject.options[i].value==aryID[j]){
sourceObject.options[i].selected = true;
isFinded = true;
break;
}
}
}
}else{//单选菜单
var count=sourceObject.options.length;
for (i=0;i<count;i++){
if (sourceObject.options[i].value==(""+strValue)){
sourceObject.options[i].selected = true;
isFinded = true;
break;
}
}
}
if (!isFinded) sourceObject.options[0].selected=true;;
}
return true;
}
</script>
<%
End If
link2Menu_FirstRun=false
End Function

Public Function ShowParentMenu()
Response.Write (strParentMenu)
End Function

Public Function ShowChildMenu()
Response.Write (strChildMenu)
If isModify Then '为修改状态时选中默认
If rsName="" Then rsName=rs
Call Change(rsName)
End If
End Function

Private Function Change(rsName)
'---初始化二级联动菜单,修改数据时使用
If Not IsObject(rsName) Then Exit Function
Dim parentObject,childObject
Dim parentObjectType,childObjectType
Dim rsParentObject,rsChildObject
parentObject = split(parentObjectName,"|")(0)
childObject = split(childObjectName,"|")(0)

'--- 以下代码是为了防止WEB表单名与数据库字段名不匹配 ---
'--- 因为如果使用数据库公共增改模块,表单名称就有前缀("str_" or "int_") ---
parentObjectType = Left(parentObject,4)
childObjectType = Left(childObject,4)
If parentObjectType="str_" or parentObjectType="int_" Then
rsParentObject=Right(parentObject,len(parentObject)-4)
Else
rsParentObject=parentObject
End If
If childObjectType="str_" or childObjectType="int_" Then
rsChildObject=Right(childObject,len(childObject)-4)
Else
rsChildObject=childObject
End If
%>
<script language="javascript">
SelectItem("<%=rsName(rsParentObject)%>","document.all.<%=parentObject%>"); //选中父对象
parentID=document.all.<%=parentObject%>[document.all.<%=parentObject%>.selectedIndex].value;
ChangeLinkMenu(parentID,'<%=hiddenMenu%>','<%=childObject%>','<%=parentObject%>'); //根据父对象生成子菜单
SelectItem("<%=rsName(rsChildObject)%>","document.all.<%=childObject%>");//选中子菜单相应项目
</script>
<%
End Function
End Class
%>
loveme2000ok 2003-12-06
  • 打赏
  • 举报
回复
各位大虾,快来帮忙吧,联动问题迫在眉睫,有什么好办法好见解来提一提吧
yeno 2003-12-06
  • 打赏
  • 举报
回复
本贴已找到解决的方法,就是用数组,多次嵌套查询
在此衷心感谢各位的相助,特别是superdullwolf(超级大笨狼)和possible_Y
两位前辈高人

不过鉴于联动的问题特别多,所以暂时保留此贴,以跟大家探讨更多好的方法和技巧
loveme2000ok 2003-12-06
  • 打赏
  • 举报
回复
哪位大虾能够给小弟抽出一点点时间,帮忙解决一下这个联动的问题!谢谢!
yeno 2003-12-05
  • 打赏
  • 举报
回复
嗯,老大,我知道,这是朋友拿来难倒我的一个题呀
他的意思是要实现这个类似的功能
超级大笨狼 2003-12-05
  • 打赏
  • 举报
回复
哦,我好象大概明白了
用户姓名 ----》张三
李四 ----》 姓名 查询条件:<input>
证件号码:123454
手机:2312213
手机 ----》13133336
13243534
2312213 ----》 姓名
证件号码:123454
手机:2312213
老大,你这么设计功能上就不合理
加载更多回复(12)

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧