Ver Mensaje Individual
  #20 (permalink)  
Antiguo 07/04/2008, 09:54
Avatar de i_e_s27
i_e_s27
 
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 17 años, 1 mes
Puntos: 5
Re: Problema con combos anidados

Mira, tengo un nuevo codigo para los combos anidados, o dependientes;

Su principal diferencia con el que te habia mostrado antes es que trabaja las opciones con numeros de ID, en la parte value, y no con la parte text, ademas le puedo decir si quiero que me deje seleccionada alguna opcion.

Mira con detalle:

Código:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Response.Buffer = True
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Combo Dependiente</title>
<%
Const adOpenForwardOnly = 0 'Es el cursor por defecto y nos permite recorrer el Recordset en forma secuencial.
Const adOpenKeySet = 1 'Permite movernos hacia delante y atrás. Permite observar las modificaciones en los datos del Recordset , no así si existen ingresos de nuevos registros.
Const adOpenDynamic = 2 'Permite movernos en cualquier sentido, viendo cualquier modificación, ingreso o eliminación de datos del Recordset.
Const adOpenStatic = 3 'Permite movernos en cualquier sentido, pero no se verá ningún cambio ocurrido en la tabla.

Const adLockReadOnly = 1 'Es el cerrojo por defecto y no permite modificar los registros de la tabla.
Const adLockPessimistic = 2 'Una vez que alguien abre la tabla, ésta queda bloqueada para los demás usuarios. Con este modo se asegura la integridad de los datos.
Const adLockOptimistic = 3 'La tabla sólo será bloqueada a los demás usuarios mientras se ejecute una operación Update. De esta forma la tabla se bloqueará durante mucho menos tiempo que con el método anterior.
Const adBatchOptimistic = 4 'Los registros serán actualizados en modo batch. 

Dim adoCon
Set adoCon = Server.CreateObject ("ADODB.Connection")
adoCon.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/MISITIO/dbgeneral.mdb")

Set rsComboCategoria = Server.CreateObject("ADODB.Recordset")
Set rsComboSubcategoria = Server.CreateObject("ADODB.Recordset")
strSQLComboCategoria = "SELECT * FROM tblcategorias"
strSQLComboSubcategoria = "SELECT * FROM tblsubcategorias"
rsComboCategoria.Open strSQLComboCategoria, adoCon, adOpenStatic, adLockOptimistic
rsComboSubcategoria.Open strSQLComboSubcategoria, adoCon, adOpenStatic, adLockOptimistic
%>

<script language = "JavaScript">
function RellenarCombo(ComboPadre, ComboDependiente, IDSelected) {
  
  IDsSubcategorias = new Array();
  IDsSubcategorias = [<%
	EsPrimero = True
	rsComboSubcategoria.MoveFirst
	For x = 1 to rsComboSubcategoria.RecordCount
		If EsPrimero = False Then Response.Write(",")
		Response.Write("'" & rsComboSubcategoria("id") & "'")
		rsComboSubcategoria.MoveNext
		EsPrimero = False
	Next 'x
	Response.Write("];")
%>
  
  NombresSubcategorias = new Array();
  NombresSubcategorias = [<%
	EsPrimero = True
	rsComboSubcategoria.MoveFirst
	For x = 1 to rsComboSubcategoria.RecordCount
		If EsPrimero = False Then Response.Write(",")
		Response.Write("'" & rsComboSubcategoria("nombre_subcategoria") & "'")
		rsComboSubcategoria.MoveNext
		EsPrimero = False
	Next 'x
	Response.Write("];")
%>
  
  AsociacionSubcategorias = new Array();
  AsociacionSubcategorias = [<%
	EsPrimero = True
	rsComboSubcategoria.MoveFirst
	For x = 1 to rsComboSubcategoria.RecordCount
		If EsPrimero = False Then Response.Write(",")
		Response.Write("'" & rsComboSubcategoria("categoria_asociada") & "'")
		rsComboSubcategoria.MoveNext
		EsPrimero = False
	Next 'x
	Response.Write("];")
%>
  
  IDItemSeleccionado = ComboPadre.options[ComboPadre.selectedIndex].value
  ComboDependiente.length = 0
  for (var i in IDsSubcategorias) {
    if (AsociacionSubcategorias[i] == IDItemSeleccionado) {
      ComboDependiente.options[ComboDependiente.length] = new Option(NombresSubcategorias[i], IDsSubcategorias[i]);
	  if (IDsSubcategorias[i] == IDSelected) {
	    ComboDependiente.options[ComboDependiente.length - 1].defaultSelected = true
	    ComboDependiente.options[ComboDependiente.length - 1].selected = true
	  }
    }
  }
}
</script>

</head>

<body onLoad="RellenarCombo(document.forms['AgregarProducto'].categoria, document.forms['AgregarProducto'].subcategoria, 12);">

<form id="AgregarProducto" name="AgregarProducto" method="post" action="" accept-charset="UTF-8">
    <label for="categoria">Categoria:</label>
    <select name="categoria" id="categoria" style="width:180px" accept-charset="UTF-8" onChange="RellenarCombo(document.forms['AgregarProducto'].categoria, document.forms['AgregarProducto'].subcategoria);">
<%
    rsComboCategoria.MoveFirst
    For i = 1 to rsComboCategoria.RecordCount
        Response.Write("  <option value=""" & rsComboCategoria("id") & """>" & rsComboCategoria("nombre_categoria") & "</option>")
        Response.Write(VbCrLf)
        rsComboCategoria.MoveNext
    Next 'i
%>
    </select>
    <label for="subcategoria">Subcategoria:</label>
    <select name="subcategoria" id="subcategoria" style="width:180px" accept-charset="UTF-8"></select>
    <input type="submit" value="Ir" />
</form>
<%
	Set rsComboCategoria = Nothing
	Set rsComboSubcategoria = Nothing
	adoCon.Close
	Set adoCon = Nothing
%>
</body>

</html>
Lo que te marque en rojo es las dos veces que llamo a la funcion JavaScript RellenarCombo(ComboPadre, ComboDependiente, IDSelected).

Fijate que en el body onLoad le puse al final un 12, que es el ID autonumerico de la subcategoria que sale de la base de datos.

Tu en vez de poner el 12, vas a poner <%Response.Write(Session("Subcategoria_Seleccionad a")) %>

Y en la pagina que recibe los datos es donde le guardas la informacion a esa Session, con el id de la subcategoria que estaba seleccionada. Que la sacas con el Request.Form.

Seria algo asi:

Session("Subcategoria_Seleccionada") = Request.Form("Subcategoria")

Tambien puedes hacerlo con cookies en vez de session.

No lo probe si funcionaba, pero tengo mi pequeña duda de que no ande porque al hacer atras con el explorador carga la pagina de la cache, no la carga de cero.

Ahi lo que tendrias que hacer sino es pasar TODOS los campos del formulario a Sessiones, y le pones un meta refresh o algo asi para que te vuelva a cargar la pagina de cero.

Es complicado...

Pero posibles soluciones hay muchas.

Espero que resuelvas tu problema y nos cuentes!

Saludos