Trabajar con EDX: Qué son, para que sirven y como se hacen?

En varios lugares de la documentación de QlikView se encuentran referencias a los EDX. También hay muchas entradas en la comunidad de QlikView y otras pero para alguien novato en el tema es bastante complejo aclararse los conceptos necesarios para trabajar con esta funcionalidad.

En primer lugar les voy a dar algunas definiciones en base a mi propia experiencia de haber usado esto.

¿Que es un EDX? En pocas palabras claras y simples es una tarea que está programada del lado del servidor de QlikView (a través de alguna de las dos consolas del Servidor de QlikView) para ser disparada ante un Evento Externo. Este evento externo es ni mas ni menos que la invocación programática de dicho servicio haciendo uso del protocolo HTTP Post.

Ahora bien, cuando decimos “una tarea del lado del servidor” ¿ de que estamos hablando exáctamente ? Bueno esto depende de si nuestro servidor cuenta con la licencia de Publisher o no.

Si no contamos con Publisher la única tarea que se podrá ejecutar será la recarga de un (o varios) qvw’s programada del lado del server para ser disparada ante un evento externo, por ejemplo el click de un botón de la aplicación por parte de un usuario.

Por otro lado en caso de tener Publisher a lo anterior dicho  se suma que la tarea puede ser cualquier cosa que se pueda ejecutar: por ejemplo un comando isql de SQL Server para operar una base de datos, un programa de SendMail, o un comando del tipo “cmd” con cualquier comando del sistema operativo: copy, delete, ftp, etc.

Para aquellos que no cuentan con Publisher hay un consuelo y camino alternativo que consiste en que el qvw que se recarga cuente con un script y dentro de él una o más instrucciones EXECUTE con las cuales podremos ejecutar cualquier cosa, tal como muestra la ayuda  (algo antigua….) de dicha instrucción en QlikView.HLP:

Execute C:\MSOffice95\Excel\Excel.exe;

Execute winword macro.doc;

Execute cmd.exe /C C:\BatFiles\Log.bat

El ejemplo que les voy a mostrar y especialmente las pantallas son de un QVS (QlikView Server) con Publisher, pero también aplicables a un server que no lo tiene.

Primero vamos a crear la tarea del lado del servidor que recargaremos programaticamente on-demand.

Para ello vamos a la Enterprise Management Console y dentro de “Source Documents” buscamos la tarea (archivo qvw) que queremos convertir en un  EDX (si alguien sabe que significa el acrónimo lo agradeceré!) y en lugar de programarlo para que se ejecute en determinado día/hora o luego de la ejecución de una tarea previa (ejecución encadenada) indicamos que será ejecutada “On External Event”:

O también puede presentarse como:

Si contamos con Publisher nuestra consola tendrá una solapa mas donde podremos crear tareas basadas en la ejecución de cualquier cosa y no solo una recarga de un archivo qvw:

Es importante notar el nombre que obtiene la tarea EDX: en este último caso el nombre de la tarea se la podemos dar nosotros en el edit box señalado con la flecha en la imagen anterior. Pero en el caso que lo que queramos convertir en EDX sea un documento qvw (Source Document si tenemos Publisher o User Document en caso contrario) no podemos asignarle el nombre a la tarea y debemos tomar el que le da QlikView. Aqui va un pequeño secreto: este nombre es la cadena completa (generalmente muy extensa) que aparece al comienzo de la solapa “Status” que está en la Management Console (NO Enterprise):

En este caso la tarea se va a llamar “Aplicaciones/Monitoreo Servidor/WebServerPerformance.qvw” literalmente.

Una vez que el EDX está creado del lado del servidor podemos trabajar del lado de la aplicación cliente para disparar esta tarea.

Para ello vamos a crear un botón (Recargar) en la aplicación y asociarle una macro del siguiente modo:

– Primero crear el botón y luego ir a propiedades del mismo,

– Luego seleccionar el tab “Acciones”

– Seleccionar el tipo de acción “Externa” y a la derecha elegir “Ejecutar Macro”

– Completar el cuadro de “Nombre de Macro” con el nombre del Sub que le daremos al punto de entrada del código.

– Finalmente aceptar la creación de la acción y cliquear el botón “Editor de Módulo” donde copiaremos el código de más abajo, con las adaptaciones que se requieran para cada caso:

Aquí va el código completo de la macro necesaria para invocar la recarga de “Aplicaciones/Monitoreo Servidor/WebServerPerformance.qvw“. Prestar atención a los comentarios:

Sub CargoEDX()

	url = "http://SERVIDOR _QLIKVIEW:4720/qtxs.asmx"     'Direccion del servidor de QV y URL del servicio de EDX
	userID = "LOGIN"				'login del usuario en el systema destino. Debe pertenecer al grupo "QlikView Administrators"
	pass = "PASSWORD" 				'clave del usuario
	doc = "Aplicaciones/Monitoreo Servidor/WebServerPerformance.qvw" 'Nombre de la tarea que se quiere ejecutar

	MsgBox "La recarga/ejecución comenzó. Por favor presione <Aceptar> y espere un par de minutos"
	MsgBox ReloadEDX(url, doc, userID, pass) 'Se invoca la ejecucución

End Sub

Function ReloadEDX(dsURL, document, userID, pass)

  ' Obtiene un ticket para invocar al EDX debido a un esquema de doble request
  ' implementado a partir de QV 8.6 por cuestiones de seguridad
  Dim requestKey, xmlhttp, requestData, httpResult
  Set xmlhttp = CreateObject("msxml2.xmlhttp.3.0")
  xmlhttp.Open "post", dsURL, False, userID, pass
  requestData = "<Global method=""GetTimeLimitedRequestKey"" />" '& vbCrLf
  xmlhttp.send requestData
  Set oDOM = CreateObject("MSXML2.DOMDocument.3.0")
  oDOM.LoadXML xmlhttp.responseText

  ' Extrae el ticket de la respuesta
  requestKey = oDOM.SelectSingleNode("//GetTimeLimitedRequestKeyResult").Text

  ' Llama a la tarea (EDX) que queremos ejecutar
  rtaExec =  CallTask(requestKey, document, dsURL, userID, pass)
  If rtaExec = Null Then
    ReloadEDX = httpResult
  Else
    If rtaExec = "Success" Then
        ReloadEDX = "La recarga finalizó."
    Else
        ReloadEDX = httpResult
    End If
  End If

End Function

'Llama al EDX mediante un HTTP POST
Function CallTask(llave,tarea,url, usr, pasw)

  Set xmlhttp2 = CreateObject("msxml2.xmlhttp.3.0")
  requestData = "<Global method=""RequestEDX"" key=""" & llave & """><i_TaskIDOrTaskName>" & tarea & "</i_TaskIDOrTaskName><i_Password /><i_VariableName /><i_VariableValueList /></Global>" & vbCrLf
  xmlhttp2.Open "post", url, False, usr, pasw
  xmlhttp2.send requestData ' Envía el XML con los datos requeridos por el servicio qtxs.asmx
  Set oDOM2 = CreateObject("MSXML2.DOMDocument.3.0")
  oDOM2.LoadXML xmlhttp2.responseText

  set CallTask2 = oDOM2.SelectSingleNode("//TaskStartResult")
  CallTask = "Success"

End Function


Para que este script (VBS) funcione deben setearse algunas configuraciones de seguridad de la forma adecuada: 1-En el Editor del Módulo (macro) se debe setear " Seguridad del Módulo Requerida: Acceso al Sistema" y "Seguridad Local Actual: Permitir Acceso al Sistema".

2- Antes de ejecutar el QVW desde el access point se debe abrir localmente en el servidor y aparecerá un pop-up advirtiendo que el documento contiene macros a lo que se debe contestar “Permitir Cualquier Macro (solo para documentos de confianza)”

3- En caso que al usuario se le presente un mensaje de error indicando que se intentó ejecutar una instrucción “Activex.xxxx” u otro similar, lo que se debe a un problema de seguridad especialmente si se está ejecutando desde el plugin Activex de IExplorer, o en modo “Open in Server” se deben pulsar simultáneamente las teclas CTRL+ Shift + M y en el pop-up que aparecerá contestar “Permitir Acceso al Sistema en el Script de Módulo”:

Por último: ¿Para qué sirve y/o se usa esta compleja técnica?¿Vale la pena?

Definitivamente SÍ vale la pena porque extiende el campo de acción de QlikView a casi cualquier cosa que querramos hacer. A continuación menciono algunos escenarios donde yo lo he usado:

– Armado de Cuadro de Resultados: En el cierre contable mensual de las empresas se procesa la contabilidad, se controla, se corrige y se repite éste proceso hasta que todo cuadre y entonces se prepara el cuadro de resultados (P&L). Esta actividad tiene dos características: se hace solo una vez al mes (aunque varias veces durante pocos días) y luego que se corrige la contabilidad no se puede esperar a que QlikView recargue por “Schedule”. Por otro lado no es conveniente programar una recarga continua todo el tiempo cuando esta actividad se realiza solo una vez al mes. Mediante este método el usuario corrige la contabilidad y presiona un botón para que QV recargue y arme el Cuadro de Resultados (P&L) y al cabo de pocos segundos ya puede ver el resultado.

– Otro caso es el envío de mails con datos de QV adjuntos desde el servidor y no desde la PC del usuario, ya sea por razones de seguridad, auditoría, completitud y/o robustez de la aplicación. Para ello se pone a disposición del usuario un botón de “Enviar Mail” y entonces el cliente de QV graba los datos adjuntos del lado del servidor (explicaré esto en futuro post) y dispara una tarea del lado del server que recoge dichos datos y envía el correo.

– Otro uso poco difundido está muy ligado a lo que se llama Enterprise Performance Management donde el mejor ejemplo es el proceso presupuestario de la empresa donde cada participante responsable lee ciertos datos (metas actuales, proyecciones, datos históricos, etc) e ingresa los nuevos objetivos propuestos para el ejercicio en curso. El ingreso de datos se hace mediante “INPUT FIELD” (nuevamente tema de futuro post), pero luego estos datos se deben grabar en el servidor y muchas veces los usuarios requieren que los datos lleguen inmediatamente al siguiente actor del proceso, para lo cual forzamos una recarga on-demand con los datos tipeados por el usuario.

Como estos hay muchos otros escenarios que pueden presentarse donde sea necesario ejecutar tareas del lado del servidor, sean de recarga o sean otros programas / comandos.

Espero les sirva.

Saludos !!!


		

Acerca de pparnisari
Casi 44 vueltas al sol. Licenciado en sistemas. Curioso, investigador, excelente para resolver problemas prácticos. Casado, 2 hijos, cada vez con mas preguntas y respuestas mas en duda. Almost 44 laps to the sun. System engineer. Curious, researcher, great for solving practical problems. Married, 2 children, each time with more questions and more answers in doubt.

4 Responses to Trabajar con EDX: Qué son, para que sirven y como se hacen?

  1. Cristina de la Fuente dice:

    Hola Pablo,

    Tengo entendido que en la versión 11 ya no se puede utilizar el protocolo http para realizar las recargas edx. ¿Sabes como se pueden hacer?

    Muchas Gracias

    • pparnisari dice:

      Cristina: La verdad es que no he tenido contacto con QV 11. No obstante lo que decís suena similar a lo que paso de la versión 8 a 9. En la 8 se invocaba el edx desde un simple llama.do http (una url). Para darle mas seguridad en la 9 cambiaron a un http request: en lugar de get (vía url) fue necesario un post (por eso se requiere un script) y además implementaron el uso del ticket para invocar el servicio (doble llamado). Quizás alguien más pueda ayudarte. Slds.

  2. Carlos dice:

    Hola,
    estamos pensando implementar QVServer 11. Tengo una tesitura particular, a la que busco solución, y me gustaría preguntarte si se podría hacer. El caso es que tendreomos Document CAL, y como su propio nombre indica solo podré abrir un único documento. El caso es que tengo un CM que está agrupado a cierto nivel, y cuando los usuarios quieren exportar un excel con datos que están fuera de la agrupación, hasta ahora lo que hacemos es abrir otro documento QV con los datos sin agregar, mantener las selecciones, generar el excel desde allí y cerrarlo. Con las Doc CAL entiendo que perderé esta posibilidad, y me gustaría saber si con EDX se podría hacer…

    Muchas gracias de antemano y un cordial saludos.
    Carlos

    • pparnisari dice:

      Carlos:

      La verdad es que aunque no estoy seguro y requeriría hacer algunas pruebas lo más factible es que no se pueda hacer. Por ejemplo: para realizar el ejemplo presentado en el post se requiere el uso de una licencia de usuario adicional para que el EDX funcione.
      En tu caso necesitarías otra “document CAL”, o en su defecto intentar reasignar por un breve momento (mientras el EDX abre el detalle y genera el excell) la licencia del usuario y luego volverla a asignar….. cosa seguramente imposible y muy precaria.

      Saludos!
      Pablo

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: