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

¿Cómo recoger el valor de un combo?

Estas en el tema de ¿Cómo recoger el valor de un combo? en el foro de ASP Clásico en Foros del Web. Saludos al foro: Ya ven de nuevo por aquí preguntando algo....;) A ver me estoy volviendo loco para recoger el valor de un combo en ...
  #1 (permalink)  
Antiguo 25/06/2004, 10:04
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
Pregunta ¿Cómo recoger el valor de un combo?

Saludos al foro:
Ya ven de nuevo por aquí preguntando algo....;)
A ver me estoy volviendo loco para recoger el valor de un combo en una variable.
El combo recoge los datos de una base de datos, pero el caso es que la página falla porque la variable donde se recoge el valor del combo siempre está vacía.

Cómo puedo hacer para recoger el valor de un combo????.
Pueden ayudarme....
Gracias.

Última edición por ciberpata; 28/06/2004 a las 09:37
  #2 (permalink)  
Antiguo 25/06/2004, 10:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
No entiendo:
1) Tienes un formulario.
2) Tienes un select.
3) Lo envias por un submit
4) Lo recojes en la misma o en otra página con request.form("nombre_select") 'o request("nombre") y la guardas en una variable
5) La variable tiene el contenido del Option seleccionado
¿así lo haces?
  #3 (permalink)  
Antiguo 25/06/2004, 12:12
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
A ver:
He intentado por enésima vez hacerlo por partes y ahora creo que está bien salvo que me funciona a veces.
Cuando se carga la página se listan en comboarticulo los articulos que estan dados de alta en la DB.
Se trata de conseguir que el usuario vea los distintos tipos de tallaje que ya existen dados de alta de un artículo.
Entonces cuando se hace click sobre el botón "Consultar tallajes" deben aparecer reflejados los tallajes correspondientes a ese artículo.

Las tablas que uso no están vacias y tienen la estructura siguiente:
tabla Nombre campo tipo de datos
-------- -------------- -------------
articulostalla id Autonumérico
articulo texto
tallas id numéro
talla texto

Paso el código para que lo veas (si es que se ve ;) )


Código
-----------------------
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
response.Expires=0
Response.AddHeader "PRAGMA", "NO-CACHE"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento sin t&iacute;tulo</title>
</head>
<!--Incluimos el fichero de constantes-->
<!--#INCLUDE file="../ADOVBS.asp"-->

<%
comboarticulo=request.form("comboarticulo")
response.write("El valor del combo es: " & comboarticulo)
%>

<%'Conectamos a la base de datos
set Conn= Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = "DSN=clubviajesoferta.com.amancio"
Conn.open
Set RS=Server.CreateObject("ADODB.Recordset")
RS.activeconnection=Conn
RS.source="articulostalla"
RS.Locktype = adLockOptimistic
RS.CursorType = adOpenDinamic
RS.open
%>

<%
'Conectamos a la base de datos
Set Command= Server.CreateObject("ADODB.Command")

' Abrimos el Recordset RS2 para realizar la consulta del combotallasexistentes
Command.ActiveConnection=Conn
Command.CommandType=adCmdText
'Si se sustituye la línea siguiente por :
' Command.CommandText= "Select * From tallas"' WHERE id = " & comboarticulo
' verás que no hay ningun error en las tablas
Command.CommandText= "Select * From tallas WHERE id = " & comboarticulo & " ORDER BY talla"
Set RS2=Command.Execute ()
%>


<body>
<form action="anadir_talla.asp" method="post" name="form1" id="form1">
<table width="30%" border="0">
<tr valign="top">
<td width="68%">Tallas existentes </td>
<td width="16%"><select name="combotallasexistentes" size="5" id="combotallasexistentes">
<%
if not (rs2.bof and rs2.eof) then
rs2.movefirst
do while not rs2.eof
%>
<option value="<%=rs2("talla")%>"><%=rs2("talla")%></option>
<%
rs2.movenext
loop
end if
%>
</select></td>
<td width="16%"><input type="submit" value="Consultar tallajes"></td>
</tr>
</table>


<p>&nbsp;</p>
<p>Articulo
<select name="comboarticulo" id="comboarticulo">
<%
if not (rs.bof and rs.eof) then
rs.movefirst
do while not rs.eof
%>
<option value="<%=rs("id")%>" selected><%=rs("articulo")%></option>
<%
rs.movenext
loop
end if
%>
</select>
</p>
</form>
</body>

<%
rs.close
rs2.close
conn.close
%>
</html>
------------------------
Fin de código
  #4 (permalink)  
Antiguo 25/06/2004, 13:05
Avatar de LeCLUB  
Fecha de Ingreso: abril-2003
Ubicación: Barcelona (España)
Mensajes: 205
Antigüedad: 21 años, 1 mes
Puntos: 1
independientemente de lo que haga la página ASP, has mirado que cuando se cargue la página html, ver mediante VER | CÓDIGO FUENTE si el combo tiene los valores que tu quieres ?

Es decir, VERIFICA que en la página HTML resultante del ASP, en los VALUE de los OPTIONS haya datos !
__________________
Documentación de VBScript V5.6 en Español:
http://download.microsoft.com/downlo...ES/scd56es.exe
  #5 (permalink)  
Antiguo 26/06/2004, 03:15
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
He comprobado los valores como tú muy bien me indicas y están bien.
O sea el combo tiene datos en el value de options
Gracias
  #6 (permalink)  
Antiguo 28/06/2004, 09:36
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
El asunto es que he probado a recoger la variable de un combo estático (con valores fijos) y no tengo ningún problema.
La cosa cambia cuando el combo tomas los valores de la base de datos. Ahí es donde no va
  #7 (permalink)  
Antiguo 28/06/2004, 09:49
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Bueno, yo cambiaría un par de cosas para seguir probando:

<select name="comboarticulo" id="comboarticulo">
a solo <select name="comboarticulo"> a que no utilizas el Id.
<%
...
%><option value="<%=rs("id")%>" selected><%=rs("articulo")%></option>
<%...%>
a
%><option value="<%=rs("id")%>" <%if rs("id")= comboArticulo Then response.write " selected" End If%>><%=rs("articulo")%></option>
Esto para que te mantenga seleccionado el que habías elegido, de lo contrario todas las opciones tienen el select y te marca la última.

Por ultimo modificaría temporalmente el envío del formulario de POST a GET para ver en la URL que efectivamente se envía el valor. Claro que si haces esto debes modificar el request.form a request solamente.

Saludos

Última edición por Myakire; 28/06/2004 a las 09:50
  #8 (permalink)  
Antiguo 28/06/2004, 10:49
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
Creo haber realizado tus modificaciones pero no va.
No va, no consigo ver nada. Y el error que me da es:
"No se puede mostrar la página"
O sea que no tengo ni idea de que rayos es lo q pasa.
Por favor podrías revisar mi código (te lo agradecería muchísimo) para ver que rayos le pasa.

Código remodelado
------------------
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
response.Expires=0
Response.AddHeader "PRAGMA", "NO-CACHE"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento sin t&iacute;tulo</title>
</head>
<!--Incluimos el fichero de constantes-->
<!--#INCLUDE file="ADOVBS.asp"-->

<%
comboarticulo=request("comboarticulo")
response.write("El valor del combo es: " & comboarticulo)
%>

<%'Conectamos a la base de datos
set Conn= Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = "DSN=clubviajesoferta.com.amancio"
Conn.open
Set RS=Server.CreateObject("ADODB.Recordset")
RS.activeconnection=Conn
RS.source="articulostalla"
RS.Locktype = adLockOptimistic
RS.CursorType = adOpenDinamic
RS.open
%>

<%
'Conectamos a la base de datos
Set Command= Server.CreateObject("ADODB.Command")

' Abrimos el Recordset RS2 para realizar la consulta del combotallasexistentes
Command.ActiveConnection=Conn
Command.CommandType=adCmdText
'Si se sustituye la línea siguiente por :
' Command.CommandText= "Select * From tallas"' WHERE id = " & comboarticulo
' verás que no hay ningun error en las tablas
Command.CommandText= "Select * From tallas WHERE id = " & comboarticulo & " ORDER BY talla"
RS2=Command.Execute ()
%>


<body>
<form action="anadir_talla.asp" method="get" name="form1">
<table width="30%" border="0">
<tr valign="top">
<td width="68%">Tallas existentes </td>
<td width="16%"><select name="combotallasexistentes" size="5" id="combotallasexistentes">
<%
if not (rs2.bof and rs2.eof) then
rs2.movefirst
do while not rs2.eof %>
<option value="<%=rs2("talla")%>"><%=rs2("talla")%></option>
<%rs2.movenext
loop
end if
%>
</select></td>
<td width="16%"><input type="submit" value="Consultar tallajes"></td>
</tr>
</table>


<p>&nbsp;</p>
<p>Articulo
<select name="comboarticulo">
<%
if not (rs.bof and rs.eof) then
rs.movefirst
do while not rs.eof %>
<option value="<%=rs("id")%>" selected>
<%if rs("id")=comboarticulo then
response.write("selected")
end if
%>
<%=rs("articulo")%>
</option>
<%
rs.movenext
loop
end if
%>
</select>
</p>
</form>
</body>

<%
rs.close
rs2.close
conn.close
%>
</html>
---------------------------------------
Fin de código


Muchisimas gracias por todo

Última edición por ciberpata; 28/06/2004 a las 11:04 Razón: Código mal escrito
  #9 (permalink)  
Antiguo 28/06/2004, 11:01
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Esta linea esta mal:
<option value="<%=rs("id")%>" selected>
<%if rs("id")=comboarticulo then
response.write("selected")
end if
%>
</option>
sería mas bien:
<option value="<%=rs("id")%>" <%if rs("id")=comboarticulo then
response.write(" selected ") end if%>> <%=rs("articulo")%></option>

Para que no te marque el error de que "No se puede ver la página", cambia en "Tools"->"Internet Options"->"Advanced"->Desmarcar "Show Friendly HTTP MEssages"

Saludos
  #10 (permalink)  
Antiguo 28/06/2004, 11:13
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
Una vez hechos los cambios el error que me devuelve es:

El valor del combo es:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis (falta operador) en la expresión de consulta 'id ='.

/anadir_talla.asp, line 43

-----
Supongo que eso será porque la variable "comboarticulo" está vacía.
Pero no se porque está vacia. Si he recogido bien el valor del combo
Gracias por todo. No sabes lo que me estas ayudando
  #11 (permalink)  
Antiguo 28/06/2004, 14:52
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Bueno, para que no truene modifica esta linea:
Command.CommandText= "Select * From tallas WHERE id = " & comboarticulo & " ORDER BY talla"
a
Command.CommandText= "Select * From tallas WHERE id = '" & comboarticulo & "' ORDER BY talla"

Y es normal que no tenga nada la primera vez, no te preocupes. Lo que tendrías que hacer es algo así:
if comboarticulos = "" Then
Command.CommandText= "Select * From tallas "
else
Command.CommandText= "Select * From tallas WHERE id = '" & comboarticulo & "'
End If

Pureba y me dices.
  #12 (permalink)  
Antiguo 29/06/2004, 09:27
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
He probado a cambiar la sentencia dejandola como me indicabas, o sea:

Command.CommandText= "Select * From tallas WHERE id = '" & comboarticulo
& "' ORDER BY talla"

Y ahora me da el error:
--------------------------
El valor del combo es:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][Controlador ODBC Microsoft Access] No coinciden los tipos de datos en la expresión de criterios.

/anadir_talla.asp, line 40
--------------------------
La línea 40 es la que ejecuta la sentencia sql


Gracias por todo
  #13 (permalink)  
Antiguo 29/06/2004, 14:42
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Bueno, seguramente id es numérico, entonces no debes preguntar por el ID cuando comboarticulo venga en blanco (la primera vez). Con el IF de arriba se supone que se valida.
if comboarticulos = "" Then
Command.CommandText= "Select * From tallas "
else
Command.CommandText= "Select * From tallas WHERE id = '" & comboarticulo & "'
End If
  #14 (permalink)  
Antiguo 30/06/2004, 11:45
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años
Puntos: 0
Pues parece que no va.
Ahora me muestra solamente el combo "combotallaexistentes" vacio y no muestra el boton "consultar tallajes", tampoco muestra el combo "comboarticulo", ni el boton "consultar tallajes".
O sea que no termina de dibujar el formulario.

Creo que hay un pequeño problema ;) veras:
1) En el combo "combotallasexistentes" tiene que dar un listado de la tabla "tallas" y en el combo "comboarticulo" tiene que sacar un listado de la tabla "articulostalla".
Y no veo por ninguna parte una conexión con la tabla tallas.
O sea ya se que es una chorrada pero he probado a meter una linea:
RS2.source="tallas"
para que me diese un listado de las tallas pero no me funciona.

2) Por otro lado la tabla tallas y la tabla articulostalla estan relacionadas por un campo id que en el caso de la tabla tallas es numerico (entero largo) y en el caso de la tabla articulostalla es autonumerico (entero largo).

Podra venir algun problema de coincidencia de tipos por eso?

Vuelvo a pasar el código fuente para situarnos:

Código:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
response.Expires=0
Response.AddHeader "PRAGMA", "NO-CACHE" 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento sin t&iacute;tulo</title>
</head>
<!--Incluimos el fichero de constantes-->
<!--#INCLUDE file="../../ADOVBS.asp"-->

<% 
comboarticulo=request("comboarticulo")
response.write("El valor del combo es: " & comboarticulo) 
%>

<%'Conectamos a la base de datos
set Conn= Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = "DSN=clubviajesoferta.com.amancio"
Conn.open
Set RS=Server.CreateObject("ADODB.Recordset")
RS.activeconnection=Conn 
RS.source="articulostalla"
RS.Locktype = adLockOptimistic
RS.CursorType = adOpenDinamic
RS.open
%>

<%
'Conectamos a la base de datos
Set Command= Server.CreateObject("ADODB.Command")

' Abrimos el Recordset RS2 para realizar la consulta del combotallasexistentes
Command.ActiveConnection=Conn
Command.CommandType=adCmdText
if comboarticulos = "" Then
	Command.CommandText= "Select * From tallas"
else
	Command.CommandText= "Select * From tallas WHERE id = '" & comboarticulo & "'"
End If

RS2=Command.Execute () 
%>


<body>
<form action="anadir_talla.asp" method="get" name="form1">
<table width="30%" border="0">
<tr valign="top">
<td width="68%">Tallas existentes </td>
<td width="16%"><select name="combotallasexistentes" size="5" id="combotallasexistentes">
<%
if not (rs2.bof and rs2.eof) then
rs2.movefirst
do while not rs2.eof %>
<option value="<%=rs2("talla")%>"><%=rs2("talla")%></option>
<%rs2.movenext
loop
end if 
%>
</select></td>
<td width="16%"><input type="submit" value="Consultar tallajes"></td>
</tr>
</table>


<p>&nbsp;</p>
<p>Articulo
<select name="comboarticulo">
<%
if not (rs.bof and rs.eof) then
rs.movefirst
do while not rs.eof %>
<option value="<%=rs("id")%>" selected>
<%if rs("id")=comboarticulo then
response.write("selected")
end if 
%>
<%=rs("articulo")%>
</option>
<%
rs.movenext
loop
end if 
%>
</select>
</p>
</form>
</body>

<%
rs.close
rs2.close
conn.close
%>
</html>

Siento darte la vara pero es muy importante que consiga hacer esto y es la única vía de solución posible.
Gracias

Última edición por ciberpata; 30/06/2004 a las 11:48
  #15 (permalink)  
Antiguo 01/07/2004, 11:13
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Bueno, disculpa, pero veo que el problema es muy sencillo, pero como que haz dejado de aplicarle la lógica para resolverlo. Por ejemplo, esta linea la sigues poniando mal y solo me explico eso por que no la haz comprendido:
<option value="<%=rs("id")%>" selected>
<%if rs("id")=comboarticulo then
response.write("selected")
end if
%>
<%=rs("articulo")%>
</option>

Con el hecho de que cierres el Option (" .. selected>") dejas fuera la condición que solo selecciona la opción que fue seleccionada en la llamada anterior a esa página. Con ver el HTML que te genera (siempre debes de ver el HTML generado cuando no se pinta el formulario como lo deseas) se podría detectar este error. Esta condicipon (el if) debe ir en lugar de imprimir el select siempre en cada linea.

Ahora, por lo del problema, intenta reprogramar el código con esta instrucciones.
1) Recupera la talla y el articulo del request y guardalo en variables.
2) Los artículos (según entiendo) siempre se muestran todos. Entonces siempre haz un recordset con un "select * from articulos", así, sin condición.
Solo cuida de que el response.write " selected" (notese el espacio depues de las comillas, ¿cómo se generaría el HTML si no lo tuviera?) se ejecute cuando el request del articulo sea igual a "" (cadena vacia) o al iD del artículo.
3) Depues de este combo sigue el de tallas, deberías de mostrar esta consulta con el id del artículo que corresponse al primero (por default, para la primera vez que se cargue la página) del combo. Esto lo haces creando otro recordset (o utilizando el mismo despues de cerrarlo y limpiarlo (rs.close y rs=null)) pero que apunte a una consulta u a otra (con el select condicionado que ya te había mencionado).
Si el request de la talla viene vacio significa que igualmente es la primera vez, etonces seleccionas el tallaje del artículo uno o del primero que este en la lista, sino entonces haces el select con el que venga en el request de talla (que ya estas seguro no viene vacio).
A este último combo le aplicas igual un response.write " selected" si vas a repintar la página despues de haber seleccionado un tallaje.

Mira, lo mejor de los foros es que te den pistas, tips para resolver tú el problema y que te quedes con el conocimiento. Y es que no todos los foristas estamos en ese momento en condiciones de reproducir el problema, ya sea por no tener Access (por ejemplo), o por estar trabajando. Pero la buena intención de ayudar, ahí esta.

En serío creo que si meditas un poco el funcionalmiento que deseas tenga tu sitio, verás que es bastante sencillo y pronto conseguiras que reaccione como quieres.

Saludos

Última edición por Myakire; 01/07/2004 a las 11:23
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 11:36.