Contenido

Aunque formalmente no existe un tipo de pregunta “Lista”, si es posible usar esta estructura de datos y sus funciones, ya que son las mismas existentes para las selecciones múltiples. A continuación, se explica como puede usar listas para facilitar y mejorar la experiencia en el diseño de formularios.

Concepto

Una Lista es una secuencia ordenada de elementos separados por un espacio simple con un número finito de elementos.

Ejemplos de listas:

  • 1 4 65 8 9 10
  • A v f gh jk u 45 er

Creación de Listas

Para crear una lista, existen varias formas:

A partir de una selección múltiple

El resultado de una selección múltiple es una lista con los elementos seleccionados. La única restricción es que los elementos no pueden ser repetidos ni contener espacios.

Los elementos de la lista estarán en el orden que hayan sido seleccionados haciendo clic. Los valores almacenados corresponden a los de la columna name en choices aunque lo visible son las etiquetas (Valores equivalentes en label).

En el ejemplo siguiente, fueron seleccionados: Selección1, luego Selección7, luego Selección4 y finalmente Selección5.

El resultado se ve así:

Usando una función join con separador espacio simple

Creación manual en una pregunta de cálculo (calculate) . El resultado será una lista con los elementos concatenados en el órden ingresado de izquierda a derecha.

Usando una función pulldata a un archivo *.csv que contenga la lista

Consulta externa a través de una pregunta de cálculo (calculate) que emplea la función pulldata al archivo *.csv con la lista. En el ejemplo de abajo, se ha creado un archivo csv y en las columnas de los días lun, mar , etc.. se ha colocado una lista de números separada por espacios. Observe que, en este caso, los elementos se escriben tal cual sin necesidad de encerrarlos entre comillas simples:

La Lista3 se construye mediante pulldata que trae la lista del día Jueves, para el puesto CR XYZ y el resultado se ve así:

Funciones de Listas

count-selected (${Lista}) cuenta el número de elementos de la lista.

Ejemplo: count-selected(${Lista3}) da como resultado 4.

selected-at (${Lista}, indice) retorna el elemento índice de la lista. Nota: el índice empieza en cero, es decir el primer elemento tienen índice 0.

Ejemplo: selected-at(${Lista3},3) da como resultado 6.

in aunque no es una función sino un criterio de coincidencia, se usa en search para pemitir filtrar sólo aquellos elementos contenidos en una lista. También existe el opuesto: not in para traer los excluidos.

search con criterio in o not in en selección múltiplecon o en /no ensearch(nombre_archivo_csv,’in’,columna_a_buscar,pregunta de selección múltiple o lista)Por ejemplo:
search(‘hijos’,’in’.’clase_v’,${clase1})
Busca en el archivo hijos.csv y devuelve todas las filas donde el valor de la columna ‘clase_v’ este en el subconjunto ‘clase1’. Aqui clase1 es una pregunta de selección múltiple o lista.

Recorriendo los elementos de una Lista

Para recorrer los elementos de una lista, se usan los ciclos de repetición. Sólo hay que tener en cuenta que el índice en los ciclos de repetición empiezan en 1 mientras que las listas como se anotó anteriormente empieza en 0. El índice o número de repetición se accede con la función position(..)

Ejemplo Completo

El siguiente ejemplo que puede descargar aquí, contiene las 3 formas de creación de listas y las funciones para acceder los elementos de la Lista3.

En la fila 5 en survey se hace el cálculo del número de elementos de la Lista3 que se obtiene del archivo DemoPuestos2.csv y este valor es usado en la fila 7 columna repeat_count para establecer el número de ciclos de repetición.

Antes de continuar se explicará el comportamiento de los cálculos en los formularios. Cuando se hace un desplazamiento hacia adelante en el dispositivo y se pasa a la siguiente pantalla (o pregunta), se ejecutan todas las operaciones de cálculo del formulario simultáneamente. Este comportamiento podría confundir acerca de algunos resultados inesperados cuando si la expectativa es que el cálculo sea secuencial pregunta a pregunta, cuando no lo es. Por ejemplo si se tienen varias preguntas calculate con estampa de tiempo calculate = now(), todos los resultados mostrarán la misma hora final del último cálculo y no la estampa de cada pregunta.

Este modo de cálculo simultáneo, facilita el tener preguntas de cálculos que hacen referencia a preguntas posteriores, como es el caso de la fila 6, allí se hace la construcción de una lista ElementosRecorridos a través de un join a una pregunta que está dentro del grupo de repetición en la fila 10. Como hay una actualización del cálculo cada vez que se realiza un ciclo de repetición, esta lista irá aumentando con cada uno de los elementos que se vayan consultando hasta su totalidad. En la práctica el resultado es el mismo si esta fila se moviera a la fila 13 después del ciclo de repetición.

Las filas 8 y 9 calcula respectivamente el índice del grupo de repetición y el índice para la lista. La fila 10 usa la función selected-at para retornar el valor correspondiente al índice.

La fila 11 es una nota que despliega los valores respectivos del índice, elemento de la lista y los elementos de la lista Elementos Recorridos.

El formulario en el dispositivo móvil se verá así cuando se ejecuta:

Como se observa en la última imagen, si se retrocede en las preguntas, se conserva el valor final de los elementos mostrados, por lo anotado anterior sobre los cálculos.

En el siguiente video se muestra el funcionamiento de este ejemplo:

Control de Rondas Programado (Otro ejemplo)

En este video encuentra una explicación resumida del uso de listas para programar rondas en días específicos. Los detalles completos los encuentra en esta carpeta.

GPS: Una lista especial

La pregunta de gps (geopoint) es almacenada “por debajo” como una lista de 4 elementos así: the_geom = latitud longitud altitud precisión, por esa razón cuando se quiere garantizar una precisión mínima de X metros se usa selected-at(.,3) <= X como restricción:

De igual forma si se requiere almacenar los 4 elementos para cálculos posteriores se usa como en el siguiente ejemplo, tomando en cuenta la corversión a número (number)

Este otro ejemplo muestra como se construye manualmente la ubicación gps manteniendo el nombre the_geom a través de un join que concatena los valores de latitud y longitud obtenidos de otro formulario. Esto se hace con el fin de poder ubicar en el mapa este valor de ubicación GPS:

¿Te ayudó este artículo?

Angee Ballesteros

Ing. Electrónica, Especialista en Ing. de Software

Deja una Respuesta

Debes estar logueado para poder comentar.