Learn Qlik

Enviar datos desde el script de carga Qlik

Qlik Sense permite el análisis interactivo de datos, pero a veces solo desea enviar datos a los usuarios por correo electrónico. Este tutorial describe cómo puede enviar una tabla de datos por correo electrónico durante el proceso de carga utilizando Qlik Web Connectors y HTML. También analiza algunas de las otras cosas que puede hacer con el conector SMTP gratuito.

Por qué enviar datos desde el script de carga de Qlik

QlikView tiene un par de características que son muy útiles que no se proporcionan con Sense directamente. La primera es que el QMC envía alertas por correo electrónico cada vez que falla una tarea, y la otra es la funcionalidad de Alertas. El uso del conector SMTP dentro de Qlik Web Connectors le permite replicar esta funcionalidad y, además, hacer más. Esta publicación de blog analiza el envío de datos a los usuarios desde el script de carga. Estoy buscando escribir notificaciones de fallas de tareas en una futura publicación de blog. Como recordatorio de cómo puede enviar datos desde QlikView, es posible que desee ver esta publicación del blog sobre el envío de datos en las alertas de QlikView. El conector SMTP es uno de los conectores estándar (es decir, gratis) que se proporcionan con los conectores web de Qlik.

Para más detalles, puedes ver esta publicación en los conectores web gratuitos de Qlik. Tenga en cuenta que se ha cambiado el nombre del conector SMTP desde el nombre original del conector de notificación, lo que proporciona un poco más de claridad con respecto a lo que hace.

Lo que veremos en esta publicación es empujar una tabla de datos agregados a una dirección de correo electrónico en cada actualización de los datos.

Enfoque de la solución

Por lo general, en una aplicación Sense está cargando una serie de filas de detalles y luego construyendo tablas y gráficos que proporcionan vistas agregadas de los datos. El uso de Alertas QlikView o NPrinting del motor Qlik se puede utilizar para crear estas agregaciones para usted. Como vamos a enviar los datos desde el script de carga, debemos realizar las agregaciones nosotros mismos en este punto. Tanto Alertas como NPrinting también pueden activar correos basados ​​en criterios; aunque este ejemplo no cubre esto, siempre recuerde que la secuencia de comandos de carga es un lenguaje de programación completo, por lo que llamar partes del código de forma condicional es muy simple.

Para mostrar claramente los datos agregados en un correo electrónico, vamos a utilizar HTML para construir una tabla, con un toque de CSS para que se vea ordenado. El conector SMTP le permite pasar el cuerpo del correo electrónico en la URL o vincularlo a un archivo local con el contenido. Como nuestra tabla puede volverse bastante grande, la escribiremos en un archivo HTML en el disco y le diremos al conector que lo introduzca. El proceso de creación del archivo se ha cubierto en esta publicación anterior en el comando Qlik STORE, pero lo haré Te diré todo lo que necesitas aquí también.

El conector SMTP también puede enviar archivos adjuntos y enlaces a imágenes (quizás creadas sobre la marcha utilizando la API de Sense), pero no lo estoy cubriendo en esta publicación.

Antes de comenzar – Los requisitos previos

La solución que se ofrece a continuación asume que su versión de Sense admite el comando URL IS. Esto se introdujo en la versión de febrero de 2018 de Sense. También hace referencia al conector SMTP, cuyo nombre se cambió en algún momento este año, por lo que se recomienda una versión actualizada de QWC. Si está utilizando QWC sin una licencia (es decir, solo conectores libres), entonces debe mantenerse dentro del último par de versiones de todos modos, por lo que una actualización siempre es sensata.

Construyendo una aplicación que envía datos

Ahora que está listo, aquí están los pasos que debe seguir para recibir un correo electrónico directamente desde su script de carga de Qlik. He descrito la conexión a algunos datos de muestra (del excelente sitio de GapMinder), pero obviamente puede agregar los datos que desee. He cargado mi aplicación en Qlik Community si desea descargarla, pero debe obtener una aplicación que funcione correctamente siguiendo estos pasos.

Configuración de bibliotecas

Esta aplicación requiere que se configuren dos bibliotecas.

En primer lugar configurar una biblioteca web llamada GenericWeb. Esto puede apuntar a cualquier página web válida, ya que reemplazaremos la URL más adelante en el código. Esta es todavía una característica bastante nueva en Sense, y vale la pena saber cómo usarla para evitar un montón de conexiones web diferentes.

A continuación, configure una conexión de Carpeta llamada TempData a un almacén temporal en su servidor o escritorio Sense. He usado c: \ temp . Puedes usar una ubicación diferente, simplemente adapta el código más adelante. Como esta ubicación tendrá una copia de sus datos, deberá asegurarse de que esté segura.

Creación de subrutinas de codificación

Algunas de las variables que conforman la URL que se pasa a Qlik Web Connectors deben estar codificadas en URL. Esto significa que los caracteres que podrían malinterpretarse deben cambiarse a una secuencia de caracteres.

Crea una sub rutina para hacer esta codificación:

sub Encode(vEncodeMe, vEncoded) let vEncoded = replace(replace(replace(replace(replace(replace(replace(vEncodeMe, ‘:’, ‘%3a’), ‘/’, ‘%2f’), ‘?’, ‘%3f’), ‘=’, ‘%3d’), ‘\’, ‘%5c’), ‘@’, ‘%40’), ‘ ‘, ‘+’); end sub

El primer parámetro es el valor a codificar, el segundo parámetro es una variable que se rellena con el valor codificado.

Establecer constantes

Estas tres variables almacenan algunos valores ambientales. La variable vQwcConnectionName se usa cuando Qlik Web Connectors cuando genera un código de Modo estándar para nosotros, por lo que vale la pena usar ese nombre. La vConn es solo para acortar nuestra URL más adelante, ya que podemos referirnos a la variable. Finalmente, vEmailFile define dónde se escribirá nuestro archivo de ensayo, esto debe coincidir con la carpeta de la biblioteca creada anteriormente.

let vQwcConnectionName = ‘lib://GenericWeb/’; let vConn = ‘http://localhost:5555/data?connectorID=NotificationConnector’; let vEmailFile = ‘c:\temp\EMailOutput.html’;

La URL de su servidor de Qlik Web Connector puede diferir, así que ingréselo aquí. Es posible que necesite un nombre de máquina o una referencia de dominio aquí, en lugar de localhost, si su instancia de QWC está en otra máquina.

Configuraciones SMTP

Ahora definimos la configuración de la conexión SMTP. Tenga en cuenta que algunas de estas variables utilizan la subrutina Encode que creamos, otras no las necesitamos para.

call Encode(‘notifyme@email.com’, vMailRecipients); call Encode(‘smtp.gmail.com’, vSMTP); let vPassword = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’; call Encode(‘someaddress@gmail.com’, vFromEmail); call Encode(‘Sending data from Sense Load Script’, vSubject); call Encode(vEmailFile, vEmailContent); let vUseSSL = ‘True’; let vSSLMode = ‘Implicit’; let vPort = ‘465’;

Los ajustes anteriores son para una cuenta de Gmail. Deberá instalar las configuraciones correctas para cualquier servidor SMTP que desee utilizar. Como este proceso es solo para enviar correos electrónicos, es una buena idea configurar una nueva cuenta expresamente para este propósito.

La contraseña debe codificarse antes de que se ingrese aquí. Esto se puede hacer utilizando la interfaz de usuario de Qlik Web Connectors. Primero vaya a su página de QWC (https: // localhost: 5555 /) y vaya a la configuración del Conector SMTP (esto se encuentra debajo de los Conectores Estándar). Aquí puede configurar y probar la configuración de SMTP, incluida la introducción de su contraseña. El código que se genera en una ejecución exitosa incluirá la versión codificada de su contraseña. Extraiga esto de la URL e ingréselo en el lugar correcto, aparecerá después de Contraseña = y antes del siguiente signo (&).

Tenga en cuenta que si bien la contraseña tiene un aspecto muy diferente, debe pasarse a SMTP como la cadena original. Esto significa que se utiliza un mecanismo de codificación bidireccional, por lo que alguien que tenga su contraseña codificada podría, en teoría, volver a la original. De ahí el consejo de configurar una nueva cuenta solo para enviar.

Hay una función en QWC donde puede enviar una contraseña de texto sin formato y recibir la codificada (el conector auxiliar). Esto significa que puede introducir la contraseña en texto sin formato en su script. Sin embargo, no recomendaría este enfoque.

Tenga en cuenta que el sujeto está incluido en estas variables. Si desea tener un tema dinámico (por ejemplo, con un recuento de registros), puede mover esa línea más adelante en su código.

Obtener algunos datos

Aquí debe obtener los datos de origen para cualquier tabla que desee enviar por correo electrónico. Si la aplicación que está creando es únicamente para el envío de datos, es posible que desee traer los datos agregados que desea enviar. Si está enviando desde una aplicación que también se utiliza para el análisis, es probable que desee datos detallados para ese análisis, y los datos agregados se pueden crear en el siguiente paso.

Esta declaración utiliza nuestra biblioteca genérica y toma algunos datos.

Population: CROSSTABLE (Year, Population) LOAD “Total population” as Country, [2011.0] as [2011], [2012.0] as [2012], [2013.0] as [2013], [2014.0] as [2014], [2015.0] as [2015] FROM [$(vQwcConnectionName)] (URL IS [https://docs.google.com/spreadsheet/pub?key=phAwcNAVuyj0XOoBL_n5tAQ&output=xlsx], ooxml, embedded labels, table is Data) ;

Agregue esos datos

Cuando cree una tabla en Qlik Sense, proporcionará una serie de dimensiones y luego algunos cálculos (Medidas). Esto le dará una fila por cada combinación de dimensiones.

Necesitamos crear esa misma tabla en código. Esto se puede hacer con una instrucción GROUP BY, como esta.

AnnualData: LOAD Year, num(sum(Population), ‘#,##0’) as [World Population], num(max(Population), ‘#,##0’) as [Largest Population], num(avg(Population), ‘#,##0’) as [Country Average] RESIDENT Population GROUP BY Year ;

En este caso estamos creando una fila por año. Se pueden agregar dimensiones adicionales a la lista de carga, cada una de estas también debe agregarse a la instrucción GROUP BY, en una lista separada por comas.

Las expresiones dadas en una carga de GROUP BY son muy similares a las usadas en las expresiones de los objetos Qlik en el extremo frontal, pero hay algunas diferencias. Pruebe las expresiones que usaría para ver si funcionan, si no, tendrá que modificarlas. Probablemente la diferencia más notable es que no tiene acceso a Set Analysis en el script de carga.

Cargar información de encabezado en una tabla

Vamos a escribir el contenido de una tabla Qlik en un archivo para luego enviarlo como un correo electrónico HTML. Así que primero tenemos que poner el preámbulo en la mesa.

EMailOutput: LOAD [<!–EMailOutput–>] INLINE [ <!–EMailOutput–> <html> <head> <style> tr:first-child td {font-weight: bold;background-color: #dddddd;} h3 {Font-family: Arial;Font-size: 12pt;} td {border-left:1px solid #555555;border-top:1px solid #555555;font-family: Arial;font-size:9pt;text-align:left;padding: 2px 10px 2px 10px;} table {border-right:1px solid #555555;border-bottom:1px solid #555555;border-collapse:collapse;} </style> </head> <body> <h3>Population stats for past five years</h3> <table> <tr><td>Year</td><td>World Population</td><td>Largest Population</td><td>Country Average</td></tr> ];

Tenga en cuenta que el nombre del campo se escribirá en nuestro archivo de salida, por lo que debe tener sentido como HTML. Por eso he puesto un comentario HTML allí.

Aquí se proporciona una hoja de estilo, lo que significa que la tabla que está escrita con los datos puede ser mucho más sencilla, ya que todo el estilo está manejado por el CSS.

Añadir la tabla de datos

Tenemos los datos que necesitamos en una tabla, ahora solo tenemos que formatearlos para que se muestren directamente en HTML y agregarlos a nuestra tabla.

CONCATENATE(EMailOutput) LOAD ‘<tr><td>’ & Year & ‘</td><td>’ & replace([World Population], ‘,’, ‘,’) & ‘</td><td>’ & replace([Largest Population], ‘,’, ‘,’) & ‘</td><td>’ & replace([Country Average], ‘,’, ‘,’) & ‘</td></tr>’ as [<!–EMailOutput–>] RESIDENT AnnualData ORDER BY Year DESC ;

Aquí estamos construyendo un número de celdas de tabla HTML para contener adecuadamente cada valor en nuestros datos. Tenga en cuenta que se escribirá una fila de texto para cada fila de la tabla.

Tenga en cuenta que debemos reemplazar los valores de la URL. Codifique las comas en los números. Esto no se debe a que las comas no se mostrarán correctamente en HTML, en lugar de cuando se llame a la instrucción STORE más adelante, se colocarán comillas dobles alrededor de los valores que incluyan comas. Esto romperá nuestro HTML. Si no usa comas como miles de separadores, entonces es bueno ir sin los reemplazos.

Adjuntar en la información del pie de página

Al igual que comenzamos con la información del encabezado, ahora necesitamos concatenar en la información del pie de página.

CONCATENATE(EMailOutput) LOAD [<!–EMailOutput–>] INLINE [ <!–EMailOutput–> </table> </body> </html> ];

Probablemente haya notado que simplemente estamos construyendo nuestro código en trozos pequeños. De la misma manera, podríamos construir una serie de tablas y fragmentos de narrativa en un correo electrónico. No estamos limitados a una sola tabla de datos aquí.

Escribir el HTML en un archivo de texto

Ahora tenemos nuestra tabla construida con todo nuestro código HTML que necesitamos para escribir esto en un archivo que el conector SMTP pueda usar. Este es simplemente un caso de uso de la declaración STORE que probablemente haya usado para escribir QVD, pero aquí estamos diciendo que queremos que esto se escriba como un archivo de texto.

STORE EMailOutput INTO [lib://TempData/EmailOutput.html] (txt);

Si su biblioteca se configuró para apuntar a un servidor web, tal vez en una ruta UNC o en el servidor Sense, esta salida se puede publicar en una página web. Esta es una excelente manera de generar datos desde Sense para un tablero de pared. Se puede utilizar una extensión Sense muy simple para convertir Sense en un servidor web para este propósito. Lo escribiré en una futura publicación del blog.

Por ahora, solo estamos usando esta salida en el conector SMTP.

Enviar el correo electrónico

Finalmente solo tenemos que enviar el email. Esto se hace extrayendo datos de una página web (al igual que cualquier otra llamada de Qlik Web Connector), aunque la diferencia es que esta llamada interactúa con un servidor para enviar datos y no solo para recibirlos.

SendEmail: LOAD status as SendEmail_status, result as SendEmail_result, filesattached as SendEmail_filesattached FROM [$(vQwcConnectionName)] (URL IS [$(vConn)&table=SendEmail&SMTPServer=$(vSMTP)&useSSL=$(vUseSSL)&SSLmode=$(vSSLMode) &Port=$(vPort)&Password=$(vPassword)&to=$(vMailRecipients)&subject=$(vSubject)&message=%40file%3d$ (vEmailContent)&fromName=Sense&fromEmail=$(vFromEmail)&appID=], qvx);

Tenga en cuenta que tenemos tres campos que regresan de la consulta. Esto nos confirmará si el envío fue exitoso o no. Si desea a prueba de balas su código, debe usar PEEK para ver estos valores solo para verificar que el proceso haya hecho lo que usted espera.

Verá en la URL todas las variables que hemos configurado. De manera crucial, está el parámetro message =, que luego se apunta a un archivo, y la ubicación del contenido que hemos escrito en el disco.

Tenga en cuenta que puede generar la mayor parte de este código utilizando la interfaz de usuario de Qlik Web Connectors, pero aquí el código hace que todas las partes se muevan hacia las variables, lo que facilita la configuración.

Siempre damos la bienvenida a las personas que comentan o expanden las cosas que hacemos en nuestras publicaciones. Use el campo de comentarios a continuación si tiene algo que quiera compartir.

Author


Avatar

Daniel García Mejia

- Qlik Luminary 2018 - Experiencia en proyectos Business Intelligence con QlikView y Qlik Sense. - Experiencia en Gestión del Servicio TI y Desarrollo de Aplicaciones Web. - Master de 'IT Project Management'​ en la UPC e Ingeniería Informática de Grado en la UPF. - Me considero una persona comunicativa y con facilidad para trabajar en equipo.