Expresiones de enlace en apps de plantilla a demanda

Los enlaces de datos en una app de plantilla especifican qué datos de su correspondiente app de selección se utilizan para formular las consultas emitidas al cargar datos en una app a demanda.

La forma básica de las expresiones de enlace--$(od_FIELDNAME)--se puede modificar para refinar las selecciones y asegurarse de que la app de plantilla cargue los datos correctamente.

Advertencia: Las apps de plantilla creadas originalmente con la extensión Qlik Sense para On-demand App Generation deben cambiarse para utilizar el enfoque ilustrado a continuación para enlazar una gran cantidad de selecciones de un campo.

Enlazar un gran número de selecciones desde un campo

El motor Qlik associative engine limita la cantidad de valores que se pueden concatenar juntos en una sola sentencia LET. Para evitar la limitación, una sentencia INLINE LOAD se puede usar para construir de manera eficiente una lista de valores separados por comas.

Primero debe crear una subrutina de script para procesar una tabla INLINE.

SUB BuildValueList(VarName, TableName, ColName, QuoteChrNum) IF $(QuoteChrNum) = 0 THEN LET LOADEXPR = 'Concat($(ColName),' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ELSE LET CHREXPR = ' chr(' & '$(QuoteChrNum)' & ') '; LET LOADEXPR = 'Concat( $(CHREXPR) & $(ColName) & $(CHREXPR)' & ',' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ENDIF _TempTable:   LOAD $(LOADEXPR) Resident $(TableName); Let vNoOfRows = NoOfRows('_TempTable'); IF $(vNoOfRows)> 0 THEN LET $(VarName) = Peek('CombinedData',0,'_TempTable'); ENDIF drop table _TempTable; drop table '$(TableName)'; END SUB;
Nota: Las llamadas a la subrutina BuildValueList deben utilizar valores específicos para el parámetro QuoteChrNum. Cuando el campo procesado por la subrutina es numérico, el parámetro debe fijarse en 0. Para los datos de caracteres, el parámetro debe fijarse en 39.

El enlace debe escribirse utilizando una tabla INLINE para crear una estructura para los valores de campo que se cargarán independientemente del número de valores.

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

La expresión $(od_ORIGIN) {"quote": "", "delimiter": "") será reemplazada por una lista de valores de campo ORIGIN desde la app de selección, separados por saltos de línea. Si el campo ORIGIN contiene los tres valores BOS, JFK, ORD, entonces la tabla expandida INLINE presentará el siguiente aspecto:

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL BOS JFK ORD ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

El valor de la variable ORIGIN que sigue a la llamada a BuildValueList será:

'BOS','JFK’,'JFK'

Enlazar valores opcionales y excluidos

A veces es necesario crear una condición de filtro en la consulta del script de la app de plantilla a demanda usando campos que no son directamente seleccionables en la app de selección. Por ejemplo, los registros de ventas podrían usar un código de región como REGION_CODE, mientras que la app de selección usa un campo REGION_NAME más reconocible para hacer selecciones de región. La app de selección puede tener un modelo que use una tabla aparte para asociar REGION_CODE con REGION_NAME, de modo que los usuarios puedan seleccionar valores desde REGION_NAME para controlar el estado de selección.

Si bien la selección de valores de REGION_NAME ocasiona que esos valores se coloquen en el estado seleccionado, los valores de REGION_CODE están solo en el estado opcional, es decir, blanco en lugar de verde. Además, si el diseño de las hojas de la app de selección excluye REGION_CODE de su conjunto de paneles de filtrado, no hay forma de que la expresión de enlace $(od_REGION_CODE) en el script de la app a demanda se expanda a la lista de regiones seleccionadas, porque los valores REGION_CODE nunca se seleccionarán realmente, es decir, nunca se volverán de color verde.

Para manejar esta situación, existe una sintaxis adicional que controla con mayor precisión qué valores de estado de selección se utilizan en cada enlace de datos. El prefijo od_ en la parte del nombre de campo en cada expresión de enlace a demanda puede incluir una combinación de letras para indicar si los valores que se utilizarán en el enlace son los tomados del estado seleccionado y del estado opcional. Las combinaciones válidas, usando el ejemplo REGION_CODE, son:

Combinaciones válidas usando el código REGION_CODE
Patrón Expansión
$(ods_REGION_CODE) Valores seleccionados (en verde) de REGION_CODE
$(odo_REGION_CODE) Valores opcionales (en blanco) de REGION_CODE
$(odso_REGION_CODE) Valores seleccionados u opcionales de REGION_CODE
$(od_REGION_CODE) Igual que $(ods_REGION_CODE), solo valores seleccionados (en verde) de REGION_CODE

En el caso de la app a demanda para el ejemplo de datos de ventas, la siguiente expresión de enlace de datos garantiza que o bien los valores seleccionados o los opcionales de REGION_CODE sean incluidos en el enlace REGION_CODE:

$(odso_REGION_CODE)

Enlazar valores numéricos

Cuando los datos que se van a enlazar a la app a demanda consisten en números en lugar de cadenas de texto, es útil deshabilitar el entrecomillado de los campos numéricos. Por ejemplo, si los registros de ventas incluyen una columna numérica DAY_OF_WEEK y desea que el usuario de la app de selección seleccione combinaciones arbitrarias de DAY_OF_WEEK, aumentaría la consulta de agregación utilizada para cargar la app de selección para que incluya DAY_OF_WEEK tanto en la lista SELECT como en la lista GROUP BY. Si se colocan comillas en torno a los valores DAY_OF_WEEK cuando están seleccionados, podría producirse un error de consulta en tiempo de ejecución si la base de datos no admite la conversión automática de cadena de texto a numérica.

Para manejar esta situación, hay un sufijo de sintaxis que se puede agregar al final de la parte FIELDNAME de la expresión de enlace para obligar al enlace de campo a que utilice valores numéricos desde la app de selección en lugar de valores de cadena de texto. El sufijo es _n como en la siguiente cláusula WHERE:

WHERE DAY_OF_WEEK IN ( $(od_DAY_OF_WEEK_n) );

Esto se expandiría a:

WHERE DAY_OF_WEEK IN ( 1,2 );

Cuando se requiere un cierto número de selecciones

En algunas situaciones, puede ser necesario que la consulta a la app a demanda contenga un número específico o un determinado rango de valores para un campo específico. Por ejemplo, si la consulta de la app a demanda contiene una cláusula BETWEEN para obtener todas las ventas entre una fecha de inicio y una de finalización, la expresión de enlace para el campo YEARQUARTER puede tener una sintaxis de sufijo de [2] que requerirá exactamente seleccionar dos valores para YEARQUARTER, como en:

$(od_YEARQUARTER)[2]

El punto de navegación de la app a demanda en la app de selección permanecerá deshabilitado siempre que no haya exactamente dos valores de YEARQUARTER seleccionados. Aparecerá un mensaje para indicar que deben seleccionarse exactamente dos valores de YEARQUARTER.

Las restricciones en cuanto a la cantidad de selección crean un enlace de requisito previo entre la app de selección y la app a demanda. Esto es diferente de las expresiones de enlace que no usan restricciones de cantidad. Por ejemplo, cuando el script de la app de plantilla contiene una expresión de enlace sin una restricción de cantidad, como en:

$(od_MYFIELD)

no hay ningún requisito en cuanto a que la app de selección contenga un campo llamado MYFIELD ni que haya ningún valor seleccionado de ese campo si existe. Si la app de selección no contiene un campo denominado MYFIELD o si el usuario simplemente no hace ninguna selección, el punto de navegación de la app a demanda aún puede habilitarse cuando se realicen otras selecciones para cumplir con la condición de valor límite de registro.

Si por otro lado, la expresión de enlace es:

$(od_MYFIELD)[1+]

ahora hay dos requisitos aplicados a la app de selección:

  • La app de selección debe contener un campo llamado MYFIELD.
  • El usuario debe seleccionar al menos un valor para MYFIELD.

Este tipo de expresión de enlace debe usarse con cuidado porque limita qué apps de selección se pueden usar con la app de plantilla. No debe usar esta restricción de cantidad en los enlaces de una app de plantilla a menos que esté seguro de que desea imponer ese requisito de cantidad de selección en todas las apps de selección que enlacen con esa app de plantilla.

Para efectuar el proceso de enlace de datos, el servicio de apps a demanda utiliza un método de sustitución de cadenas que es insensible a los comentarios en el script. Esto significa que no debe utilizar expresiones de enlace en los comentarios a menos que desee que esos comentarios contengan la lista de valores enlazados tras la generación de la app.

También se pueden hacer otras restricciones en cuanto a cantidad. La tabla siguiente resume las diferentes combinaciones que se pueden hacer en cuanto a restricciones en la cantidad de selección.

Diferentes combinaciones en cuanto a restricciones en la cantidad de selección
Tipo de restricción Requisito de selección
$(od_YEARQUARTER)[2] Deben seleccionarse exactamente 2 valores de YEARQUARTER.
$(od_YEARQUARTER)[2-4] Deben seleccionarse entre 2 y 4 valores de YEARQUARTER.
$(od_YEARQUARTER)[2+] Deben seleccionarse al menos 2 valores de YEARQUARTER.
$(od_YEARQUARTER)[2-] Se pueden seleccionar como mucho 2 valores de YEARQUARTER.
Nota: La comprobación para determinar si se han cumplido todas las restricciones de cantidad en la app de plantilla se realiza durante el proceso de generación de la app. Si se viola una restricción de cantidad, se rechazará la solicitud para generar la app y se mostrará un mensaje de error.

Cambiar los caracteres de entrecomillado de valor y delimitador

Cuando una lista de valores de un campo seleccionado en una app de selección a demanda se inserta en el script de una app de plantilla, los valores van rodeados de comillas simples y separados por comas. Estos son los caracteres predeterminados para entrecomillado y delimitadores. Estos valores se pueden cambiar en la sintaxis añadida a la sentencia de enlace para cada campo. Por ejemplo:

$(odso_ORIGIN){"quote": "|", "delimiter": ";"}

Estos nuevos valores se utilizan después al formular la lista de valores de enlace tomados de la app de selección. Si, por ejemplo, los valores seleccionados son los primeros tres meses del año, la lista se construiría así:

|Enero|;|Febrero|;|Marzo|

Los valores predeterminados para los caracteres de entrecomillado y delimitador funcionan para la mayoría de las bases de datos SQL estándar. Pero podrían no funcionar para algunas bases de datos SQL y no funcionan en el caso de numerosas fuentes de datos dinámicas como NoSQL y REST. Para esas fuentes, es necesario agregar esta expresión de enlace a fin de cambiar los caracteres de entrecomillado y delimitador.

Bind data containing commas and/or quotation marks

If the data in any of the fields used for bind variables contains commas, you need to change the default behavior of the INLINE load statement to not interpret commas as field separators. Cambie el delimitador que utiliza la especificación de formato por un carácter que no aparezca en los valores del campo que se está enlazando, como se muestra con el carácter "|" en el siguiente ejemplo:

Also, if any of the bound fields contain single quotation marks, you need to add a Replace command to the LOAD statement that will add an extra single quotation mark after each single quotation mark in the value. This prevents the quote characters from being interpreted as the end of the string that is used in the WHERE clause. Note that database products may use different techniques for escaping single quotation marks.

Por ejemplo:

OdagBinding: LOAD Replace(VAL,'''','''''') AS VAL INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ] (ansi, txt, delimiter is '|', embedded labels);