Foros del Web » Programando para Internet » ASP Clásico »

Problema con combos anidados

Estas en el tema de Problema con combos anidados en el foro de ASP Clásico en Foros del Web. Amigos, necesito de vuestra ayuda. Tengo un formulario, en el tengo 2 combos enlazados, el script de estos combos es generado en ASP: Código HTML: ...
  #1 (permalink)  
Antiguo 26/03/2008, 17:37
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Pregunta Problema con combos anidados

Amigos, necesito de vuestra ayuda.
Tengo un formulario, en el tengo 2 combos enlazados, el script de estos combos es generado en ASP:
Código HTML:
<script type="text/javascript">
function addOpt(oCntrl, iPos, sTxt, sVal)
{ 
  var selOpcion=new Option(sTxt, sVal); 
  oCntrl.options[iPos]=selOpcion;
}

function CambiaModelo(oCntrl)
{
  oCntrl.length=0
  switch (document.getElementById("marca").selectedIndex)
  {
  <%
    dim rs_marca, rs_modelo
    i = 0
    Set rs_marca = SQLQuery(cnnDB, "SELECT * FROM marcas ORDER BY cod_marca ASC")
    If Not rs_marca.EOF Then
    Do While Not rs_marca.EOF
  %>
    case <% = rs_marca("cod_marca") %>:
    <%
      dim detModelos
      j = 1
      Set rs_modelo = SQLQuery(cnnDB, "SELECT * FROM marca_modelos WHERE cod_marca=" & rs_marca("cod_marca") & " ORDER BY dsc_modelo ASC")
      If Not rs_modelo.EOF Then
      detModelos="addOpt(oCntrl, " & 0 & ", 'Seleccione un modelo', 0);" & vbCR
      Do While Not rs_modelo.EOF
        detModelos=detModelos & "addOpt(oCntrl, " & j & ", '" & rs_modelo("dsc_modelo") & "', " & rs_modelo("cod_modelo") & ");" & vbCR
        j = j + 1
        rs_modelo.MoveNext
      Loop
      Response.Write detModelos
      End If
    %>
      break; 
  <%
    i = i + 1
    rs_marca.MoveNext
    Loop
    End If
  %>
  } 
}
Cuando se presiona grabar los datos del formulario, estos se validan en ASP asi:
Código PHP:
If Len(uid)=0 Then
    Call DisplayError
(1lang(cnnDB"ClientName"))
End if 
DisplayError tiene:
Código PHP:
' DisplayError:
Procedure for creating error pages.
Sub DisplayError(eTypecomponent)

    
' Create the web page
  If Not Application("Debug") Then
    Response.Clear
    Response.Write("<html><head><title>ERROR</title></head><body>")
  End If
  Response.Write "<p><center><table width=""200""><tr><td bgcolor=""red"" align=""center"">" & _
      "<b>ERROR</b></tr></td><tr><td bgcolor=""#eeeeee"" align=""center"">"

'    
Error Types:
'    1: Missing required field
'    
2SQL error
'    3: Generic Error, just display full component string

    Select Case eType
    Case 1
        Response.Write "<b>" & component & "</b> " & _
          "&nbsp;" & lang(cnnDB, "isarequiredfield") & ".<p>" & _
          "<i>" & lang(cnnDB, "PleasepresstheBACKbutton") & "</i></p>"
    Case 2
        Response.Write(lang(cnnDB, "ASQLqueryhasfailed") & ". ")
    Case 3
        Response.Write(component)
    End Select


    ' 
Finish off the table and page
    Response
.Write("</tr></td></table></center><p>&nbsp;</p></body></html>")

     
Stop processing the .asp file
    Response
.End()
End Sub 
Si se ejecuta este procedimiento se pasa a una pantalla donde aparece un mensaje:
Código:
ERROR 
Nombre del cliente  es un campo requerido.
Por favor presione el boton RETROCEDER
El problema viene aqui al retroceder se pierde el item seleccionado en el segundo combo.
Me hablaron de usar Session, pero no entiendo como recuperarlo al retroceder.
Ojala alguien pueda ayudarme.
Gracias
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #2 (permalink)  
Antiguo 27/03/2008, 07:15
Avatar de GaboMaKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Viña del Mar - Chile
Mensajes: 323
Antigüedad: 21 años, 7 meses
Puntos: 2
Re: Problema con combos anidados

si quieres usar sesiones lo haces asi, a una variable por ejemplo

session("GuardaItem") = item <-- el item que quieres mantener.

en la pagina donde quieras recuperarlo:

item= session("GuardaItem")

esop
__________________
Exito!!
:censura:
Visita Uganet.cl
  #3 (permalink)  
Antiguo 27/03/2008, 07:53
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Sonrisa Re: Problema con combos anidados

Hola!
Gracias por tu respuesta. Mi duda es, en que momento uso ese codigo de recuperación? Es decir, esa linea se debe ejecutar al momento de regresar (retroceder) a la pagina inicial.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #4 (permalink)  
Antiguo 27/03/2008, 12:12
Avatar de GaboMaKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Viña del Mar - Chile
Mensajes: 323
Antigüedad: 21 años, 7 meses
Puntos: 2
Re: Problema con combos anidados

Cita:
Iniciado por flaviovich Ver Mensaje
Hola!
Gracias por tu respuesta. Mi duda es, en que momento uso ese codigo de recuperación? Es decir, esa linea se debe ejecutar al momento de regresar (retroceder) a la pagina inicial.
ahi decides tu, en que momento la llamas, por lo que dices seria en la pagina donde vuelves preguntar si el item esta vacio cargas el valor de la session, es una idea...
exito
__________________
Exito!!
:censura:
Visita Uganet.cl
  #5 (permalink)  
Antiguo 28/03/2008, 17:25
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

He probado asi:
Código PHP:
<%if modelo="" then
        modelo 
session("old_modelo")
else
        
session("old_modelo") = modelo
end 
if%> 
pero no funciona.
Disculpen pero yo no uso mucho ASP.
Por que al retroceder el segundo combo queda asi?

Me he dado cuenta que esto solo sucede en IE.
Por favor, como puedo corregir esto?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 28/03/2008, 20:25
Avatar de RucarMaN  
Fecha de Ingreso: julio-2003
Ubicación: Caripito Edo Monagas
Mensajes: 169
Antigüedad: 20 años, 10 meses
Puntos: 1
Re: Problema con combos anidados

<head>
<script language = "JavaScript">

<%Dim x, count, y

SQL = "SELECT IdModelo, NombreModelo, IdMarca FROM Modelos"
CrearRs(objRS)
x=0
%>

// FUNCION DE COMBO BOX COMBINADO

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("NombreModelo"))%>";
subcatagoryof = "<%=(rs("IdMarca"))%>";
subcatagoryid = "<%=(rs("NombreModelo"))%>";
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()
Set rs = Nothing
%>
}
</script>
</head>
-----------------------
<form>
<select size="1" id="cat" name="MarcaVehiculo" onChange = "javascript:sublist(this.form, cat.value);" tabindex="6">

<option selected value="0">Seleccione</option>
<%
SQL = "SELECT IdMarca, NombreMarca FROM Marcas"
CrearRS(objRS)
Do While Not rs.EOF%>
<option value="<%=rs("NombreMarca")%>"><%=rs("NombreMarca" )%></option>
<%rs.MoveNext
Loop
rs.Close()
Set rs = Nothing
%>
</select>
<select id="subcatagory" name="ModeloVehiculo" size="1" tabindex="7">
<option value="0">--------------------</option>
</select>
</form>

espero que te sirva....
__________________
Con la ayuda de todos seremos mejores...

http://www.pemoweb.com
  #7 (permalink)  
Antiguo 31/03/2008, 09:52
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

Gracias por contestar.
Adapte tu codigo, y me quedo asi:
Código HTML:
<head>
<script language = "JavaScript">

<!-- 	#include file = "public.asp" -->
<% 
Dim x, count, y, cnnDB
Set cnnDB = CreateCon

qry = "SELECT * FROM marca_modelos"
Set rs = SQLQuery(cnnDB,qry)
x=0
%>

// FUNCION DE COMBO BOX COMBINADO

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("dsc_modelo"))%>";
subcatagoryof = "<%=(rs("cod_marca"))%>";
subcatagoryid = "<%=(rs("cod_modelo"))%>";
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()
Set rs = Nothing
%>
}
</script>
</head>
<%
blnSubmitNew = iif(Cint(Request.Form("save")) = 1, True, False)
If blnSubmitNew Then
    Call DisplayError(1, lang(cnnDB, "ClientName"))
end if
%>
<form action="t.asp" method="post">
<input type="hidden" id="save" name="save" value="0" />
<select size="1" id="cat" name="MarcaVehiculo" onChange = "javascript:sublist(this.form, cat.value);" tabindex="6">

<option selected value="0">Seleccione</option>
<%
qry = "SELECT * FROM marcas"
Set rs = SQLQuery(cnnDB,qry)
Do While Not rs.EOF%>
<option value="<%=rs("cod_marca")%>"><%=rs("dsc_marca" )%></option>
<%rs.MoveNext
Loop
rs.Close()
Set rs = Nothing
%>
</select>
<select id="subcatagory" name="ModeloVehiculo" size="1" tabindex="7">
<option value="0">--------------------</option>
</select>
<br />
<br />
<input type="submit" value="Sgte pag" name="B1" onclick="document.getElementById('save').value='1'; return checksubmit(this)" />&nbsp;
</form> 
pero el problema persiste.
Pf verifica este codigo, y dime que esta mal.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #8 (permalink)  
Antiguo 31/03/2008, 11:07
Avatar de RucarMaN  
Fecha de Ingreso: julio-2003
Ubicación: Caripito Edo Monagas
Mensajes: 169
Antigüedad: 20 años, 10 meses
Puntos: 1
Re: Problema con combos anidados

A mi me funciona bien....
verifica la base de dato

Marca
* IdMarca -
NombreMarca

Modelo
* IdModelo
IdMarca -
NombreModelo
__________________
Con la ayuda de todos seremos mejores...

http://www.pemoweb.com
  #9 (permalink)  
Antiguo 31/03/2008, 11:41
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

Amigazo, el problema es cuando presiono el boton "sgte pag". Este muestra un mensajito en una siguiente pantalla. Entonces tengo que retroceder y ahi es donde no aparece la lista del segundo combo.
Se entiende el problema?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #10 (permalink)  
Antiguo 31/03/2008, 12:01
Avatar de JuanRAPerez
Colaborador
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.393
Antigüedad: 20 años, 7 meses
Puntos: 27
Re: Problema con combos anidados

dos cosas:

uno:
Si los errores que te dara son por campos requeridos (así como dice tu ejemplo) lo que te recomiendo es que busques una función para validar el formulario, y fuerzas al usuario a ingresar todos los "campos requeridos" desde el inicio antes de procesar el formulario, asi te evitas este error cierto?

Dos:
basados en las sessiones no se si te funcionara pero la idea seria

en tu pagina donde recibes creas las sessiones de el item que deseas que te respete los combo

session("Combo1") = item1
session("Combo2") = item2

luego en la pagina de el formulario tendrías que validar

if session("Combo2") <> "" then
'nunca ha procesado el formulario
else
aqui imprimes el combo dependiente y pones selected al registro que coincida con el item2
end if


p.d. ando pensando en vos alta.


suerte
__________________
JuanRa Pérez
San Salvador, El Salvador
  #11 (permalink)  
Antiguo 31/03/2008, 17:44
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

El problema es que todo se hace en la misma pagina. Si tienes deseo de ayudarme con este problema puedo enviarte el ASP, solo dejame tu correo.
Si habia pensado en el punto uno que mencionas, pero queria evitarme cambiar todo el codigo de validacion.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #12 (permalink)  
Antiguo 01/04/2008, 04:58
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Mira, yo justo tambien estoy trabajando con combos anidados, o combos dependientes, como quieras decirle, asi que aprobecho para mostrarte el codigo que tengo yo, quizas te pueda servir...
Solo tengo un pequeño inconveniente con el que estoy... yo no se programar en JavaScript, y no se como llamar en el "body onload" a mi funcion que llena el combo anidado o dependiente...

Este es el codigo en ASP:

Código:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Response.Buffer = True%>
<HTML>
<HEAD><TITLE>Combo Dependiente</TITLE></HEAD>
<body>
<%

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 rsCombo1 = Server.CreateObject("ADODB.Recordset")
Set rsCombo2 = Server.CreateObject("ADODB.Recordset")
strSQLCombo1 = "SELECT * FROM tblcategorias"
strSQLCombo2 = "SELECT * FROM tblsubcategorias"
rsCombo1.Open strSQLCombo1, adoCon, adOpenStatic, adLockOptimistic
rsCombo2.Open strSQLCombo2, adoCon, adOpenStatic, adLockOptimistic

%>
<script language="javascript">
function Combos(x) {
  ItDepend=document.getElementById('CombDependiente');
  if(!ItDepend){return;}                 
  var mitems=new Array();
  mitems['Categoria']=['Subcategoria'];
<%
For i = 1 to rsCombo1.RecordCount
	Response.Write("  mitems['" & rsCombo1("nombre_categoria") & "']=[")
	rsCombo2.MoveFirst
	NoSeEncontroRegistro = True
	EsPrimero = True
	For x = 1 to rsCombo2.RecordCount
		If rsCombo2("categoria_asociada") = rsCombo1("id") Then
			NoSeEncontroRegistro = False
			If EsPrimero = False Then Response.Write(",")
			Response.Write("'" & rsCombo2("nombre_subcategoria") & "'")
			EsPrimero = False
		End If
		rsCombo2.MoveNext
	Next 'x
	If NoSeEncontroRegistro = True Then Response.Write("''")
	Response.Write("];")
	rsCombo1.MoveNext
	Response.Write(VbCrLf)
Next 'i
%>
  ItDepend.options.length=0;
  ItActual=mitems[x.options[x.selectedIndex].value];
  if(!ItActual){return;}
  ItDepend.options.length=ItActual.length;
  for(var i=0;i<ItActual.length;i++) {
    ItDepend.options[i].text=ItActual[i];
    ItDepend.options[i].value=ItActual[i];
  }
}
</script>

<form id="AgregarProducto" name="AgregarProducto" method="post" action="">
<label for="or">Categoria:</label>
<select name="or" id="or" onChange="Combos(this)">
<%
rsCombo1.MoveFirst
For i = 1 to rsCombo1.RecordCount
	Response.Write("  <option value=""" & rsCombo1("nombre_categoria") & """>" & rsCombo1("nombre_categoria") & "</option>")
	Response.Write(VbCrLf)
	rsCombo1.MoveNext
Next 'i
%>
</select>
<label for="CombDependiente">Subcategoria:</label>
<select name="CombDependiente" id="CombDependiente"></select>
<input type="submit" value="Ir" />
</form>

</body>
</html>

Y este es el codigo HTML que genera, apreciar que es un codigo muy limpio y ordenado:

Código HTML:
<HTML>
<HEAD><TITLE>Combo Dependiente</TITLE></HEAD>
<body>

<script language="javascript">
function Combos(x) {
  ItDepend=document.getElementById('CombDependiente');
  if(!ItDepend){return;}                 
  var mitems=new Array();
  mitems['Categoria']=['Subcategoria'];
  mitems['Cartuchos y Toners']=['HP','Lexmark','Canon'];
  mitems['Discos Ríg y Remov']=[''];
  mitems['Grab/Lect de CD y DVD']=[''];
  mitems['Memorias']=[''];
  mitems['Pen Drives']=[''];
  mitems['Placas de Sonido']=[''];
  mitems['Procesadores']=['AMD','Intel'];
  mitems['Scanners']=[''];
  mitems['Software y Programas']=[''];
  mitems['Alimentación']=[''];
  mitems['CDs y DVDs Vírg']=[''];
  mitems['Discos Rígidos']=[''];
  mitems['Gabinetes y Accesorios']=[''];
  mitems['Libros y Manuales']=[''];
  mitems['Modems']=[''];
  mitems['Motherboards']=[''];
  mitems['Notebooks']=['Toshiba'];
  mitems['Papeles y Resmas']=[''];
  mitems['Perif y Accesorios']=[''];
  mitems['Placas de Video y Editora']=['Nvidia','ATI'];
  mitems['Impresoras']=[''];

  ItDepend.options.length=0;
  ItActual=mitems[x.options[x.selectedIndex].value];
  if(!ItActual){return;}
  ItDepend.options.length=ItActual.length;
  for(var i=0;i<ItActual.length;i++) {
    ItDepend.options[i].text=ItActual[i];
    ItDepend.options[i].value=ItActual[i];
  }
}
</script>

<form id="AgregarProducto" name="AgregarProducto" method="post" action="">
<label for="or">Categoria:</label>
<select name="or" id="or" onChange="Combos(this)">
  <option value="Cartuchos y Toners">Cartuchos y Toners</option>
  <option value="Discos Ríg y Remov">Discos Ríg y Remov</option>
  <option value="Grab/Lect de CD y DVD">Grab/Lect de CD y DVD</option>
  <option value="Memorias">Memorias</option>
  <option value="Pen Drives">Pen Drives</option>
  <option value="Placas de Sonido">Placas de Sonido</option>
  <option value="Procesadores">Procesadores</option>
  <option value="Scanners">Scanners</option>
  <option value="Software y Programas">Software y Programas</option>
  <option value="Alimentación">Alimentación</option>
  <option value="CDs y DVDs Vírg">CDs y DVDs Vírg</option>
  <option value="Discos Rígidos">Discos Rígidos</option>
  <option value="Gabinetes y Accesorios">Gabinetes y Accesorios</option>
  <option value="Libros y Manuales">Libros y Manuales</option>
  <option value="Modems">Modems</option>
  <option value="Motherboards">Motherboards</option>
  <option value="Notebooks">Notebooks</option>
  <option value="Papeles y Resmas">Papeles y Resmas</option>
  <option value="Perif y Accesorios">Perif y Accesorios</option>
  <option value="Placas de Video y Editora">Placas de Video y Editora</option>
  <option value="Impresoras">Impresoras</option>

</select>
<label for="CombDependiente">Subcategoria:</label>
<select name="CombDependiente" id="CombDependiente"></select>
<input type="submit" value="Ir" />
</form>

</body>
</html> 
Notese que algunos items estan vacios, se puede poner que diga Vacio en vez de dejarlo en blanco. Por ahora es solo una prueba, cuando la pagina este on line tendra mas informacion la base de datos.

Solo me queda lo que dije mas arriba, lo de body onload, si alguien sabe como, por favor me lo dice? Sino posteo en el foro de JavaScript.

Saludos!!
  #13 (permalink)  
Antiguo 01/04/2008, 05:23
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Ahora, el problema que tienes tu es que si haces click en atras no te muestra cual era la opcion seleccionada en el combo dependiente, ya que este es generado dinamicamente al vuelo por JavaScript y no queda en memoria.

Pero el combo padre, que tiene los datos ya incrustados, y sin JavaScript si te tendria que mantener la opcion seleccionada, cierto?

Si yo encontrase como llamar a mi funcion en el body onload, cuando vuelva para atras en el explorador, se ejecuta esta funcion, y como la opcion padre sigue marcada, las opciones hijo tambien estaran disponibles; no sera la que seleciono el usuario, sino la primera disponible, pero vamos avanzando algo... ahora puedes utilizar la famosa session o un cookie (o mejor ambos por si acaso jajaja) para poner cual es el item que tiene que estar seleccionado, en una funcion en JavaScript que tendria que tener una estructura de este tipo:

Si <%aca pones la cookie en asp%> no es null o <%la session con el combo dependiente sacado en asp%> no es null
selecionar esa opcion en el combo dependiente
end if

Y esto iria al final de la pagina, para que sea la ultima instruccion en ejecutarse.

Lastima que yo de JavaScript no entiendo... y trato de escaparle

Creo que asi podrias resolver tu problema...

Es solo una sugerencia
  #14 (permalink)  
Antiguo 01/04/2008, 05:35
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Otra cosa que se me ocurre es que valides el formulario primero en java, osea que no te envie a otra pagina donde se valida y si hay algo que anda mal te muestra el cartelito y te dice que vuelvas atras. Que valide antes de redireccionar, para no perder la info.

Sino lo que puedes hacer es: al apretar Enviar tu envias todos los datos del form a una pagina (en este caso ella misma), no? bueno, recupera esos datos con Request.Form y meteselos a las opciones: combobox, text box, etc..

Seria algo asi:

If Resquest.Form("variable") <> "" Then
Le metes el valor
End If

Asi cuando le aparezca el cartelito de error arriba del todo, abajo sigue teniendo el formulario con todo lo que selecciono antes, y puede corregir en lo que no ingreso bien, y apretar el boton de enviar nuevamente. Sin necesidad de hacer para atras.

Que te parece?
  #15 (permalink)  
Antiguo 01/04/2008, 06:10
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Por cierto... ya encontre como hacer el body onload

Reemplaza en el codigo asp que habia pasado <body> por esto:

<body onLoad="Combos(document.forms['AgregarProducto'].or);">

Funciona de maravillas! Tanto en IE (7) como en Firefox (2.0.0.13)

Última edición por i_e_s27; 01/04/2008 a las 06:27
  #16 (permalink)  
Antiguo 01/04/2008, 07:45
Avatar de JuanRAPerez
Colaborador
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.393
Antigüedad: 20 años, 7 meses
Puntos: 27
Re: Problema con combos anidados

Cita:
Iniciado por i_e_s27 Ver Mensaje
Otra cosa que se me ocurre es que valides el formulario primero en java...

cierto es lo mas lógico si son campos obligatorios.


suerte
__________________
JuanRa Pérez
San Salvador, El Salvador
  #17 (permalink)  
Antiguo 01/04/2008, 08:32
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Cita:
Iniciado por JuanRAPerez Ver Mensaje
cierto es lo mas lógico si son campos obligatorios.


suerte
Si, pero si el usuario tiene Java desabilitado... toda la validacion no sirve para nada... por eso hay que usar validacion Java y ASP.
  #18 (permalink)  
Antiguo 01/04/2008, 09:06
Avatar de JuanRAPerez
Colaborador
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.393
Antigüedad: 20 años, 7 meses
Puntos: 27
Re: Problema con combos anidados

bueno...

creo que por eso es que hay que tomar todas las cosas que se puedan hacer

1. poner validación a nivel de java (si el usuario lo tiene deshabiltiado validamos en ASP)
2. validar vía asp que las variables no vayan vacías. (si es asi podemos hacer un response redirect con los valores que ya ingreso, y así recuperar los en los combos y texbox lo que el usuario ya ingreso.)
3. validad en la base de datos para que tampoco permita nulos.

básicamente siento yo que ese seria el orden de las cosas (algunos agregados mas como evitar sqlinjection y esas cosas tambien, pero para tu caso haz eso)


en el 2

si tu variable nombre = "" entonces has un response.redirect a laa pagina inicial y llevate todas las variables que el usuario haya llenado (incluyendo el caso de el post tus combos)

suerte
__________________
JuanRa Pérez
San Salvador, El Salvador
  #19 (permalink)  
Antiguo 07/04/2008, 08:59
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

Gracias por tu respuesta. Tu eres el unico que entendio a la perfeccion mi problema. Hice lo del onload, pero aun no logro mostrar el item seleccionado.
Varias personas me dicen que valide en javascript y que no deje que pase a la siguiente pagina. Si me dices que es imposible lo que yo quiero hacer entonces lo hare en javascript.

Cita:
Iniciado por i_e_s27 Ver Mensaje
Ahora, el problema que tienes tu es que si haces click en atras no te muestra cual era la opcion seleccionada en el combo dependiente, ya que este es generado dinamicamente al vuelo por JavaScript y no queda en memoria.

Pero el combo padre, que tiene los datos ya incrustados, y sin JavaScript si te tendria que mantener la opcion seleccionada, cierto?

Si yo encontrase como llamar a mi funcion en el body onload, cuando vuelva para atras en el explorador, se ejecuta esta funcion, y como la opcion padre sigue marcada, las opciones hijo tambien estaran disponibles; no sera la que seleciono el usuario, sino la primera disponible, pero vamos avanzando algo... ahora puedes utilizar la famosa session o un cookie (o mejor ambos por si acaso jajaja) para poner cual es el item que tiene que estar seleccionado, en una funcion en JavaScript que tendria que tener una estructura de este tipo:

Si <%aca pones la cookie en asp%> no es null o <%la session con el combo dependiente sacado en asp%> no es null
selecionar esa opcion en el combo dependiente
end if

Y esto iria al final de la pagina, para que sea la ultima instruccion en ejecutarse.

Lastima que yo de JavaScript no entiendo... y trato de escaparle

Creo que asi podrias resolver tu problema...

Es solo una sugerencia
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #20 (permalink)  
Antiguo 07/04/2008, 09:54
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
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
  #21 (permalink)  
Antiguo 07/04/2008, 20:20
Avatar de i_e_s27  
Fecha de Ingreso: marzo-2008
Ubicación: En mi casa
Mensajes: 208
Antigüedad: 16 años, 2 meses
Puntos: 5
Re: Problema con combos anidados

Sino pegale una mirada a estas paginas:

http://www.codingforums.com/showthread.php?t=36141

http://kb.adobe.com/selfservice/view...9117&sliceId=2

Quizas te sirva o te oriente!

Saludos!

Última edición por i_e_s27; 07/04/2008 a las 21:30
  #22 (permalink)  
Antiguo 10/04/2008, 16:48
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 10 meses
Puntos: 39
Re: Problema con combos anidados

Amigos, siento decepcionarlos pero no lo logre, y por eso opte por la otra opcion: validar por javascript.
Gracias por vuestra incondicional ayuda.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:36.