Listas enlazadas

No consigo hacer funcionar este código:
Son dos combos enlazados una base de datos. Si podrías ayudarme, bien con el código o bien enviándome un ejemplo en el cual basarme
Gracias
<%@ Language=VBScript%>
<html>
<head>
<title>Combos combinados</title>
<%Dim cn, rs, basedatos, familias_sql, x
'declaramos las variables
set rs = Server.CreateObject("ADODB.Recordset")
'creamos un objeto recordset
basedatos = Server.MapPath("otaduy.mdb")
'le asignamos a una variable, el camino y nombre de la base de datos
Set cn = Server.CreateObject("ADODB.Connection")
'creamos una conexión
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & basedatos & ";"
'abrimos la conexión con esa base de datos(driver)
set familias_sql="SELECT idfamilia, familia, idlineaprod FROM familia ORDER BY familia"
'a una variable le asignamos una sentencia select para cargar los datos en el primer combo
rs.open familias_sql, cn
'cargamos el cursor con la sentencia sql y lo relacionamos con la conexión
x=0
%>
<script language = "JavaScript">
function sublist(inform, selecteditem)
{
inform.subcatagory.length = 0
<%count = 0
y = 0
do while not rs.eof%>
x = <%= trim(y) %>;
subcat = new Array();
subcatagorys = "<%=(rs("idfamilia"))&" "&(rs("familia")) %>";
subcatagoryof = "<%=(rs("idlineaprod"))%>";
subcatagoryid = "<%=(rs("idfamilia"))%>";
subcat[x,0] = subcatagorys;
subcat[x,1] = subcatagoryof;
subcat[x,2] = subcatagoryid;
if (subcat[x,1] == selecteditem) {
var option<%= trim(count) %> = new Option(subcat[x,0], subcat[x,2]);
inform.subcatagory.options[inform.subcatagory.length]=option<%= trim(count)%>;
}
<%
count = count + 1
y = y + 1
rs.movenext
loop
rs.close
%>
}
</script>
</head>
<body bgcolor="#CDB1B7">
<h2 align="center"><b><i><font color="#AE1732"><u>Combo-box enlazados </u></font></i></b></h2>
<form name="prueba">
<div align="center">
<center>
<table border="0" width="80%">
<tr>
<td width="77%">
<select size="1" id="linea" name="linea" onChange = "javascript:sublist(this.form, linea.value);">
<option selected>Selecciona una familia</option>
<%set rs2 = CreateObject("ADODB.Recordset")
lineapro_Sql = "SELECT idlineaproducto, lineaproducto FROM lineaproductos ORDER BY lineaproducto"
rs2.Open lineapro_Sql, cn
do while not rs2.eof
%>
<option value="<%=rs2("id")%>"><%=rs2("lineaproducto")%></option>
<%rs2.movenext
loop
set rs=nothing
set rs2=nothing
rs.close
rs2.close
cn.close
set cn=nothing%>
</select>
<SELECT id="subcatagory" name="subcatagory" size="1">
<Option selected value="none"></option>
</SELECT></td>
<td width="9%">
<p align="left">
</p>
</td>
</tr>
</table>
</center>
</div>
</form>
</body>
</html>

1 respuesta

Respuesta
1
Esto va a ser un poco largo, así que te pido un poco de paciencia.
Me parece una buena opción las listas enlazadas siempre y cuando no sean demasiadas referencias, con lo que el código sea tan grande que la carga de la página sea impracticable . Me imagino que ese no es el caso y voy al tema.
En primer lugar, para optimizar, se saca la generación del array que contiene las referencias fuera de la función, ya que así la página sólo generará una vez todo el array en lugar de generarlo cada vez que se llama a la función. Eso se traduce en una reducción de tiempo de ejecución.
En segundo lugar, se usa para la carga un objeto de javascript, que nos permite mantener la información en el array de forma más comprensiva.
El parámetro selecteditem se pasa ahora como linea.options[linea.options.selectedIndex].value, ya que si no, no funcionará en netscape.
En total, el código quedará tal que así:
<%@ Language=VBScript%>
<html>
<head>
<title>Combos combinados</title>
<%Dim cn, rs, basedatos, familias_sql, x
'declaramos las variables
set rs = Server.CreateObject("ADODB.Recordset")
'creamos un objeto recordset
basedatos = Server.MapPath("otaduy.mdb")
'le asignamos a una variable, el camino y nombre de la base de datos
Set cn = Server.CreateObject("ADODB.Connection")
'creamos una conexión
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & basedatos & ";"
'abrimos la conexión con esa base de datos(driver)
set familias_sql="SELECT idfamilia, familia, idlineaprod FROM familia ORDER BY familia"
'a una variable le asignamos una sentencia select para cargar los datos en el primer combo
rs.open familias_sql, cn
'cargamos el cursor con la sentencia sql y lo relacionamos con la conexión
x=0
%>
<script language = "JavaScript">
var subcat = new Array();
var miobjeto;
<%
count = 0
do while not rs.eof%>
// Creamos un nuevo objeto y lo cargamos.
miobjeto = new Object();
miobjeto.subcatagorys = "<%=(rs("idfamilia"))&" "&(rs("familia")) %>";
miobjeto.subcatagoryof = "<%=(rs("idlineaprod"))%>";
miobjeto.subcatagoryid = "<%=(rs("idfamilia"))%>";
// Cargamos el objeto en el array.
subcat[subcat.length] = miobjeto;
<%
count = count + 1
rs.movenext
loop
rs.close
%>
function sublist(inform, selecteditem)
{
inform.subcatagory.length = 0
// Introducimos una primera línea vacía.
inform.subcatagory.options[0] = new Option("", "");
for (var aux=0;aux<subcat.length;aux++)
{
if (subcat[aux].subcatagoryof == selecteditem)
{
inform.subcatagory.options[inform.subcatagory.options.length] = new Option(subcat[aux].subcatagorys, subcat[aux].subcatagoryid);
}
}
// Seleccionamos la fila vacía.
inform.subcatagory.selectedIndex = 0;
}
</script>
</head>
<body bgcolor="#CDB1B7">
<h2 align="center"><b><i><font color="#AE1732"><u>Combo-box enlazados </u></font></i></b></h2>
<form name="prueba">
<div align="center">
<center>
<table border="0" width="80%">
<tr>
<td width="77%">
<select size="1" id="linea" name="linea" onChange = "javascript:sublist(this.form, linea.options[linea.options.selectedIndex].value);">
<option selected>Selecciona una familia</option>
<%set rs2 = CreateObject("ADODB.Recordset")
lineapro_Sql = "SELECT idlineaproducto, lineaproducto FROM lineaproduc

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas