> Manuales > Taller de ASP

Explicamos como recoger campos de formulario en los que recibimos más de un valor por campo.

No debería significar un problema recoger los campos de formulario corrientes, como campos de texto, botones de radio, textareas, etc, donde sólo se envía un dato vinculado a dicho campo campo. Se hace con la método form del objeto request, indicando entre paréntesis el nombre del campo que queremos recoger.

mi_variable = request.from("nombre_campo")

Para el que esto le resulte nuevo, podemos encontrar en el Manual de ASP un capítulo donde se detalla el proceso de recoger datos del formulario. Nosotros en este artículo vamos a tratar de explicar un método para recoger datos un poco más complejos, donde nos pueden enviar varios valores dentro de un mismo campo de formulario. En concreto vamos a tratar de extraer los datos de un campo de formulario "Select múltiple" que se consigue con las siguientes etiquetas HTML:

<select name="equipo" multiple>
<option value="Madrid">Madrid
<option value="Barcelona">Barcelona
<option value="Valencia">Valencia
<option value="Bilbao">Bilbao
<option value="Sevilla">Sevilla
<option value="ATMadrid">At. Madrid
<option value="Cadiz">Cadiz
<option value="Dep. Coruña">Dep. Coruña
<option value="Santander">Santander
</select>


Hemos colocado un select normal que tiene el atributo múltiple, que vemos que no se iguala a nada, simplemente se coloca si queremos que el usuario pueda seleccionar varias opciones. Para ello debería seleccionar una de las opciones y con el la tecla de Control (Ctrl) o mayúsculas (La flechita hacia arriba) seleccionar otra opción. Si se utiliza la tecla de Control se seleccionan las dos opciones, la que había y la nueva. I se utiliza mayúsculas se seleccionarían todas las opciones entre la primera y la última. Podemos practicar a seleccionar varias opciones, para el que lo desee, con el campo de abajo.


Cómo llegan los datos

Cuando recibimos este campo de formulario nos llegan todos los valores que un usuario haya seleccionado, separados por comas. Así, un valor posible que se puede recibir por el formulario sería el siguiente:

Madrid, Barcelona, Valencia, ATMadrid, Dep. Coruña

Este valor lo obtenemos utilizando el objeto request de ASP, tal como comentábamos antes. Para acceder entonces a ese dato escibiríamos.

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.

Espero que con lo dicho hasta ahora hayamos podido encontrar sentido al ejercicio y resulte válido como práctica de VBScript y la tecnología ASP. Podemos ver el ejemplo en marcha para examinar su funcionamiento.

Además, podemos descargar en un zip los fuentes que hemos utilizado con ASP para este ejercicio, por si los queremos tener y probar en nuestro computador.

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.

Carlos Luis Cuenca

Carlos es ingeniero informático por la UPM (Politécnico de Madrid), especializad...

Manual