request.form("equipo")
El método reques.form en este caso devuelve, como indicábamos, todos los equipos seleccionados separados por comas. De manera adicional, podemos tratar el valor devuelto como una colección, que es una estructura de datos especial, parecida a los arrays, que se recorren fácilmente con un bucle FOR EACH.
| Referencia: Tenemos un taller de ASP en el que hacemos un par de ejemplos del bucle FOR EACH para recorrer arrays y colecciones. |
En algún caso puede interesarnos volcar la información de esa colección a un array para tratar luego los equipos en otros procesos. Como práctica también puede ser útil ver como se haría y de paso, conocemos un poco mejor el bucle FOR EACH.
Construir el array
Nuestro ejercicio requiere un array que tenga un número indeterminado de casillas, que depende del número de valores que recibamos desde el campo <select> del formulario. Si queremos hacer esto bien vamos a necesitar un array dinámico, al que iremos asignando posiciones según lo necesitemos. En el Manual de Visual Basic Script podemos encontrar la explicación sobre cómo tratar arrays dinámicos.
dim equipos()
redim equipos(0)
Así creamos el array y le indicamos que vamos a utilizar como índice máximo el cero, que corresponde con una casilla, equipos(0).
Script para meter los datos en un array
Vamos a hacer un script que se encargue de rellenar el array con todos los valores del campo. Dicho script recorre la lista de valores que llegan del formulario y los introduce en el array, a la vez que va aumentando en una casilla el espacio del array antes de añadir un nuevo elemento.
Dim equipos(), I
I = 0
For Each Valor In Request.Form("equipo")
Redim Preserve equipos(I)
equipos(I) = Valor
I = I + 1
Next
Empezamos el script declarando el array (sin definir sus casillas, para poder redimensionarlo dinámicamente) y una varible para llevar la cuenta de los valores introducidos, que inicializamos a cero en la siguiente línea.
El bucle FOR EACH recorre cada una de las posiciones de la colección Request.Form("equipo") y en cada iteración introduce en una variable, en este caso llamada Valor, el contenido de la posición actual.
Una vez dentro del bucle se redimensiona el array preservando su contenido previo (redim preserve) para que contenga las posiciones necesarias para almacenar los valores que vamos extrayendo de la colección. Dicho de otro modo, en cada iteración creamos una nueva posición (guardando todas las posiciones anteriores) e introducimos en la posición creada el contenido de la variable Valor, que guardaba la posición actual de la colección. Por último incrementamos en uno el número de posiciones que debe contener el array, para utilizarlo si volvemos a pasar por el bucle.
|
Nota: Podíamos haber creado un array utilizando la función split, incorporada en VBScript. Dicha función recibe una cadena y un separador y devuelve un array donde en cada casilla se ha introducido una sub-cadena creada al romper por cada separador.
De modo que, a partir del request.form("equipo") (que es también una cadena donde cada valor aparece separado por una coma), aplicando la función Split e indicando que el separador es el caracter coma (,), obtendremos el array deseado. equipos = Split(request.form("equipo"),",") Este método es muy rápido y simple, pero podría fallar si uno de los valres del select contiene una coma, tal como apuntan algunos colaboradores con sus comentarios al artículo. |
|
Créditos y agradecimientos
Este reportaje ha sido mejorado gracias a los comentarios, investigaciones y correcciones de las siguientes personas: Sergio Flores: flaco@lamatufia.com.ar. Agradecimientos especiales a este compañero, que indico el script para recorrer la colección Antonio Guerrero agnotario@eresmas.com. Nos apuntó la solución con la función split. César Nieto cesarnieto@terra.es. También nos recomendó utilizar split. Aston aston@maestrosdelweb.com. Que nos propuso la solución con Split y también un recorrido de colecciones. Al pie del artículo se conservan todos los comentarios enviados por los anteriores compañeros, y otros que podrán ir incorporándose. Muchas gracias a todos. |
| Por: Miguel Angel Alvarez | 31/5/02
|
request.form("campo")(1)
Así recogeríamos el valore venido en primer lugar. Si queremos recoger el valor del segundo lugar lo haríamos igual, indicando con un 2 el índice de la posición a recoger.
request.form("campo")(2)
Lo que no veo claro es cómo hayar el número de posiciones del supuesto array. Pues,a unque lo podamos acceder con índices como un array, en realidad no lo es. Por lo tanto uBound() no sirve para hallar la solución. Lo que se me ha ocurrido, que pienso que sí funcionaría bien es contar el número de comas que tenga request.form("campo")... entonces el número de valores que nos llegan sería ese número de comas + 1.
| Por: Sergio Flores | 01/6/02
|
Si lo que ustedes quieren es almacenar en un array todos los valores, no es necesario semejante funcion ni menos saber el mayor número del índice.
No se puede utilizar UBound() ya que no es un array, pero como es una colección es más fácil todavía:
<%
Dim MisDatos(), I
I = 0
For Each Valor In Request.Form("CampoMultiple")
Redim Preserve MisDatos(I)
MisDatos(I) = Valor
I = I + 1
Next
%>
Espero que les haya servido de algo y hasta pronto.
Muy bueno el sitio!!
Un abrazo desde La Rioja, Argentina.
| Por: Antonio Guerrero | 03/6/02
|
| Por: Antonio Guerrero | 03/6/02
|
request.form("campo").count
Saludos
| Por: César Nieto | 03/6/02
|
miarray=Split(mitexto,",")
Me crea un array con los elementos que hay separados por el carácter que yo le diga, en este caso la coma.
| Por: Aston | 03/6/02
|
En cualquier caso, podemos facilitarnos la tarea de meter en un array (matriz o arreglo) los valores recogidos de un Select múltiple ¡con una sola línea!
aEquipos = Split(Request.Form("Equipos"), ",")
¡Ya está, ya hemos llenado el array!
Esto devuelve:
aEquipos(0) = "Madrid" aEquipos(1) = "Barcelona" aEquipos(2) = "Valencia" aEquipos(3) = "ATMadrid" aEquipos(4) = "Dep. Coruña"
Espero que sirva de ayuda.
Aston - http://www.laventanita.net
| Por: Aston | 03/6/02
|
Investigando un poco sobre el problema que plantea nuestro amigo Miguel Angel Alvarez, saber cuántos elementos tendría nuestro supuesto array, la mejor opción pasa por tratarlo como una colección para recorrerlo después con un sencillo bucle For Each... Next con lo que de nuevo solucionaríamos el problema en pocas líneas:
Ejemplo:
<%
<HTML>
For Each n in Request.Form("Delegaciones")
Response.Write n & "<br>"
Next
%>
<HEAD>
</HEAD>
<BODY>
<form method="post" name="Deleg" action="Multi.asp">
<SELECT NAME="Delegaciones" SIZE="7" multiple>
<option value='Andalucía'>Andalucía</option><option value='Cataluña'>Cataluña</option><option value='Centro I'>Centro I</option><option value='Centro II'>Centro II</option><option value='Levante'>Levante</option>
</SELECT><br>
<INPUT type=submit value=Submit name=submit1>
</form>
</BODY>
</HTML>
Aston - http://www.laventanita.net
| Por: Sergio Flores | 04/6/02
|
He visto que han publicado otros lectores soluciones con la función de expresiones Split, la cual guarda en un vector o array todos los valores separados por un determinado delimitador (en este caso la coma ",").
El problema que existe utilizando esta funcion se presenta que al mostrar un select multiple con valores como por ejemplo "Gimenez, Benjamin", "Alanis, Lucas", etc. éste devuelve datos erroneos, en este ejemplo devolveria en el array(0) = "Gimenez", en array(1) = "Benjamin", en array(2) = "Alanis" y en array(3) = "Lucas" y no array(0) = "Gimenez, Benjamin" y array(1) = "Alanis, Lucas" como deberia ser. Esto se soluciona utilizando For Each como lo expliqué anteriormente.
Hasta pronto!
| Por: Walter Portocarrero | 17/6/02
|
Una forma que yo encontre para poder recojer varios valores seleccionados de un select fue de la siguiente manera:
for i=1 to request.form("sel_Rev").count
usu = request.form("sel_Rev")(i)
next
que es equivalente al FOR EACH, y que es basicamente la misma idéa.
Espero que esta pequeña colaboración pueda servir a quienes recien empiezan en este maravilloso mundo que es el desarrollo de aplicaciones web.
Saludos
| Por: Pablo Guillenea | 27/3/03
|
| Por: Hugo | 21/4/03
|
| Por: Pedro | 25/9/03
|
| Por: Alejandro | 11/11/03
|
| Por: Malak | 07/10/07
|