Contenido
Pregunta calculate con función pulldata

Hay un caso de mucha utilidad en preguntas tipo calculate para traer datos de campos existentes en archivos csv externos. Esta función es muy parecida a la de excel BuscarV o Vlookup, donde partiendo de un valor se trae el correspondiente al mismo registro en la columna seleccionada.
Esta función se conoce como pulldata 4 parámetros y la sintaxis de la función es como sigue:
pulldata(‘nombre de archivo csv sin extensión’,’campo de dato a traer’,’campo de dato para coincidencia exacta’,’valor de coincidencia´)
Se debe tener en cuenta que al igual que un Buscarv, la función pulldata trae un único valor, si existe más de una coincidencia para los elementos definidos, la función traerá la primera ocurrencia que cumpla con las condiciones definidas ignorando las demás.
Cómo se diseña (define en un formulario):
En Editor Web:
En Plantilla Excel:

Este ejemplo se interpretaría así: Traiga el registro de la columna Nombre del archivo EjemploCSV.csv cuyo Id sea igual al ingresado.
Se usan con frecuencia en conjunto con selección única de datos externos (dinámica). Con la selección única se trae un campo que identifique un registro único y luego se usa un calculate con la función pulldata.
Nota: Aunque es opcional, cuando el listado es muy grande, conviene cambiar el nombre de la columna de búsqueda y agregarle el sufijo _key (Ejemplo codigo_key) con esto el sistema sabrá cual es la columna llave de la tabla e indexará para búsquedas más rápidas. Ejemplo:

Finalmente lo que va en la columna calculate es:
pulldata(‘EjemploCSV’,’Nombre’,’Id_key’,${q1})
Pulldata 6 parámetros

Adicional a la función clásica de pulldata con 4 parámetros, esta versión extiende a 6 parámetros (dos adicionales opcionales) que agregan una versatilidad única para consulta de datos externos en archivos csv o grupos de repetición en otros formulario. La función se construye de la siguiente forma:
pulldata(‘NombreArchivo’,’ColumnaTrae’,’ColumnaFiltro’,’ValorFiltro’,Indice,’Filtro’)
Donde:
- NombreArchivo: Nombre del archivo csv sin extensión
- ColumnaTrae: Campo que contiene el valor (o los valores a traer).
- ColumnaFiltro: Campo sobre el cual se hace la comparación o filtro
- ValorFiltro: Valor de referencia para el filtro
- Indice: Valor numérico que toma los siguientes parámetros
- -1: Cuenta el número de registros que coinciden con el filtro
- 0: Trae la lista separada por espacios de los valores que coinciden con el filtro
- 1,2, ..n : Trae el valor n-ésimo que coincide con el filtro. Si el valor es mayor que la cuenta retorna nulo.
- Filtro o Coincidencia: (Nuevo): Tipo de coincidencia a aplicar y puede tomar los siguientes valores
- ‘matches’: Coincidencia exacta
- ‘contains’: Coincidencia contiene
- ‘startswith’: Coincidencia empieza con
- ‘endswith’: Coincidencia termina con
- ‘in’: Coincidencia incluye
- ‘not in’: Coincidencia no incluye
Ejemplo con archivo csv:
Supongamos el siguiente archivo csv: BDEquipos.csv
Vamos a realizar 3 consultas con pulldata para coincidencia o filtro ‘matches’ ‘tipo4’
pulldata('BDEquipos','descripcion','os','tipo 4',-1,'matches') devuelve 5 que es el número de registros cuyo ‘os’ = ‘tipo 4’
pulldata('BDEquipos','descripcion','os','tipo 4',0,'matches') devuelve la lista con los 5 valores cuyo 'os' = 'tipo 4' así ‘televisor equipos de sonido televisor equipo de sonido cámara’.
Advertencia: La lista devuelta es separada por un espacio, por ende hay que tener cuidado que los valores que se traigan no contengan también espacios (como en el ejemplo) si va a realizar un procesamiento posterior.
pulldata('BDEquipos','descripcion','os','tipo 4',2,'matches') devuelve el segundo registro = 'equipos de sonido'.


Ejemplo con grupo de repetición de otro formulario:
Supongamos el siguiente formulario: BDEquipos que tiene el siguiente ID y datos:

En main:

Y en el grupo de repetición q1:

Vamos a realizar 3 consultas con pulldata para coincidencia o filtro ‘matches’ ‘tipo 1’
pulldata('linked_s217_18628','descripcion','os','tipo 1',-1,'matches') devuelve 2 que es el número de registros cuyo ‘os’ = ‘tipo 1’ pulldata('linked_s217_18628','descripcion','os','tipo 1',0,'matches') devuelve la lista con los 2 valores cuyo 'os' = 'tipo 1' así 'aspiradora brilladora') Pulldata('linked_s217_18628','descripcion','os','tipo 4',2,'matches') devuelve el segundo registro ='equipos de sonido'.
Observe que, aunque se trate de los mismos datos cuando se hace referencia a datos referenciados o sea linked_id, el archivo que se genera en el dispositivo móvil sólo contiene las columnas referenciadas, en este caso descripción y os. Por eso descarta los registros duplicados.


Lo anterior permite hacer formulario más elaborados como por ejemplo hacer consultas desde otro formulario con grupo de repetición y usar el llamado de pulldata con índice -1 para tener el conteo y éste colocarlo como conteo del grupo de repetición y de la misma manera usando position(..) como índice, traer el elemento respectivo.

Recursos para realizar el ejemplo:
- BDEquipos.csv
- Formulario del ejemplo
- Formulario BDEquipos
A partir de la versión móvil 6.500 y superior, también puede usar las siguientes funciones de agregación en lugar del índice:
- sum: la suma de todos los registros
- mean: la media o el promedio de los valores
- min: el valor mínimo
- max: el valor máximo
- count: el recuento del número de registros coincidentes
- list: todos los valores coincidentes separados por un espacio
Nota: Cuando el índice no es un número debe llevar comillas simples.
Busqueda de datos de referencia (Pulldata 3 y 5 párametros)

Adicional a los pulldata de 4 y 6 parámetros ya conocidos, ahora es posible extraer datos especificando una expresión que filtre o modifique los mismos. Es decir, la expresión no solo reemplaza la definición como parámetros individuales de la columna y el valor a filtrar, sino que permite modificar los datos de la respuesta.
Pulldata 3 parámetros
Este pulldata complementa el pulldata de 4 parámetros, es decir, trae o identifica un único valor como respuesta a la expresión. Tiene la siguiente estructura:
pulldata('fuente', 'columna a traer', "expresion")
Ejemplo:
pulldata('ciudades', 'nombre_ciudad', "#{pais} = 'Col' and #{cod_ciudad} = 23")
En el ejemplo anterior traerá el nombre de la ciudad cuyo país sea ‘Col’ y el codigo de la ciudad sea 23.
Advertencia: Una función de extracción de datos que utiliza una “expresión” no se activa automáticamente si alguna de las preguntas a las que se hace referencia cambia su valor. Sin embargo, puede forzar este comportamiento encerrando la función pulldata dentro de una función if () que hace referencia a las mismas preguntas. Es decir, si en el ejemplo anterior en vez de tener valores estáticos como ‘col’ o 23 la igualación se hace a respuestas de preguntas, será necesario el uso de if de la siguiente forma:
if(concat(${pais}, ${cod_ciudad}) = '', '', pulldata('ciudades', 'nombre_ciudad', "#{pais} = ${pais} and #{cod_ciudad} = ${codCiudad}"))
Pulldata 5 parámetros
Este pulldata complementa el pulldata de 6 parámetros, es decir, trae o identifica un resultado para varios valores identificados mediante una expresión.
pulldata('fuente', 'columna a traer', 'expresion', 'índice', 'eval')
Ejemplo:
pulldata('people', 'edad', "cast(#{edad} as integer) > 23, 'mean', 'eval')
En el ejemplo anterior se obtendrá la edad promedio de las personas mayores a 23.
Advertencia: Dado que se emplea una expresión aplica la misma advertencia que para pulldata 3 parámetros, así que si en vez de tener un valor fijo 23 queremos que se evalue edades mayores a la respuesta a una pregunta para un adecuado funcionamiento la sintaxis cambia a:
if(${edad} >= 0, pulldata('people', 'edad', "cast(#{edad} as integer) > ${edad}", 'mean', 'eval'),'')
En este caso se obtendrá la edad promedio de las personas mayores que la respuesta establecida en la pregunta “edad”
Comparativo de pulldatas
Cantidad de parámetros | Descripción | Sintaxis |
---|---|---|
3 | Se obtiene un valor único identificado mediante una expresión | pulldata(‘fuente’, ‘columna a traer’, “expresion”) |
4 | Se obtiene un valor único identificado por un valor específico en una sola columna de filtro | pulldata(‘fuente ‘, ‘ columna a recuperar’, ‘columna de filtro’, ‘valor del filtro’) |
5 | Se obtiene un resultado para múltiples valores identificados usando una expresión | pulldata(‘fuente’, ‘columna a traer’, ‘expresion’, ‘índice’, ‘eval’) |
6 | Se obtiene un resultado para múltiples valores identificados por un valor específico en una sola columna de filtro | pulldata(‘fuente’,’columna a traer’,’columna de filtro’,’valor del filtro’,Indice,’Filtro’) |
En los siguientes enlaces podrá encontrar un ejemplo general de pulldata con 3,4,5 y 6 parámetros y los csv empleados como recursos compartidos para los mismos:
Ejemplos pulldata 3,4,5 y 6 parametros
Nota: Como puede observar la expresión se escribe entre comillas dobles (“”) y para hacer referencia a las columnas del csv o las preguntas del formulario a consultar, dentro de la expresión debe usar #{} y no ${}.
También es posible que al usar una expresión para obtener datos, deba “convertir” los valores en números enteros o decimales. Esto se debe a que todos los datos CSV se almacenan como texto. Por ejemplo, si tiene una expresión de filtro como “# {edad} <$ {edad_max}”. Aquí # {edad} es el valor de la edad en la tabla csv y deberá cambiar su expresión a “cast (# {edad as integer) <$ {edad_max}”. Para más información puede ver la sección Convirtiendo a un tipo diferente de dato.
Advertencia: La búsqueda de datos en referencias estáticas puede causar problemas, ya que la función de búsqueda debe activarse mediante un cambio en uno de sus parámetros. Por ejemplo: pulldata (‘ref_data’, ‘nombre’, ‘código’, ‘AAAA1’). Entonces, en este ejemplo, el código es fijo y la búsqueda no se activará automáticamente. Una solución a esta situación puede ser colocar ‘AAAA1’ en una pregunta tipo calculate de forma tal que la sintaxis cambie a pulldata (‘ref_data’, ‘nombre’, ‘código’,${Cod})
En el siguiente enlace puede ver la versión online de el pulldata, es decir, el lookup:
Alternativa online a selección dinámica y pulldata (Funciones lookup y lookup_choices)