¿Te falta un gráfico? ¡Constrúyelo!

Los tiempos han cambiado y a nivel gráfico todo lo que antes eran redondeces sombreadas se han transformado en colores planos y normalmente cuadrados. Tendencias simples que exigen en muchos casos que los informes y cuadros de mando que presentamos tengan un importante esfuerzo en cuanto a la parte gráfica. El diseñador gráfico se convierte, si el consultor no tiene tal gusto estético (que suele pasar), en una necesidad en algunos proyectos.

Lo que quería decir es que también hay que plantearse que muchas de estas nuevas visualizaciones que definen los diseñadores gráficos a veces no existen en el producto que tengas que usar en tus informes o cuadros de mando. ¿Qué haces entonces?

Una solución es cambiar la herramienta, cosa que no es siempre (de hecho casi nunca) posible.

Otra opción es la utilización de mashups, que viene a ser cuando la aplicación en cuestión es capaz de pasar una serie de datos a un servicio web que los grafique como queremos. No todas son capaces de ello tampoco.

Y la última opción, si la herramienta lo permite, es engañar a la vista con ciertos toques de prestidigitador para construir un gráfico que de forma natural no existe.

Es este último caso el que quería exponeros hoy. Vamos a hacer un gráfico circular que permita comparar un porcentaje de 0 a 100 con un porcentaje anterior. En concreto, vamos a hacer éste:



En este gráfico, vemos en el sector exterior el dato actual que además aparece en formato numérico en el centro. En el sector interior aparece la comparación con el periodo anterior, cuyo valor aparece en número y en pequeño debajo del  valor numérico actual.

Por último, el nombre del indicador que estamos graficando aparece en texto en la zona inferior, justo donde el gráfico es incompleto.

Este gráfico queda muy bien y da mucha información de forma sencilla, rápida y clara. Si además lo unimos a un selector de fechas y ponemos los márgenes de diferentes productos, podemos ver rápidamente la situación de mejora o empeoramiento de la compañía. Incluso, ya puestos, podríamos poner una pequeña alarma en rojo si no es adecuado.

Ahora bien, ¿cómo hacemos esto?

Pues en el caso que estamos viendo y con arcplan, se construiría fácilmente con unos poquitos objetos tal como indica la siguiente imagen (con fondo negro por razones obvias).



Efectivamente, se trata de un efecto óptico: tres gráficos circulares de 270º y diferentes tamaños con fondo transparente superpuestos, dando ese efecto de gráfico en dos arcos.


La parte numérica/textual son simples objetos de texto en que se muestran los valores. Organizando todos los objetos de forma adecuada, contamos con un gráfico actual y elegante para nuestros cuadros de mando.

arcplan como alternativa a .Net, Java y PHP

No sé si conocéis arcplan pero tal vez os resulte muy curioso el título de este artículo.
¿arcplan? ¿Qué es arcplan?
arcplan es una herramienta de frontend especializada en cuadros de mando y con conectividad a prácticamente cualquier sistema de base de datos que se os pueda pasar por la cabeza, lo que le da una versatilidad en los accesos a información que no tiene ninguna otra.

Aparte de esto, es una herramienta WYSIWYG que permite generar documentos (pantallas) con interactividad simplemente arrastrando y colocando objetos (tablas, gráficos, desplegables) relacionados entre ellos y los datos de la base de datos, con capacidad de personalización de imagen a gusto del consumidor y posibilidad de publicación web estándar y en movilidad.

Personalmente os recomiendo que le podáis echar un vistazo a algunas de las demos reales que podéis encontrar en la web del fabricante. Como dato adicional, comentaros que arcplan tiene una gran base instalada en España y en el mundo, siendo además especialista en conexión a nativa a SAP BW.

El caso es que como especialista en BI muchas veces nos encontramos con necesidades específicas en proyectos que son puramente de BI (informes, cuadros de mando, etc) y otras que son más de aplicaciones a medida porque las aplicaciones clásicas de BI no permiten ciertas cosas que a veces son necesarias como por ejemplo:
- Quiero que me aparezca un menú personalizado con estas imágenes y enlaces a este, este y este documento.
- Quiero conservar la navegación aquí y aquí pero en este documento no.
- Quiero poder grabar una determinada información en la base de datos (configuración, datos de presupuestación, comentarios, etc)
- Quiero poder lanzar procesos en la base de datos (PLSQLs o Stored Procedures, por no hablar de cálculos de Essbase)
- Y quiero hacerlo todo con la misma herramienta, claro.

Como podéis ver, pensando en un BO o en un Microstrategy, estas opciones no son factibles fácilmente y normalmente se resuelven con opciones de rodeo como páginas web de configuración, aplicaciones PHP/.Net/Java que hacen determinadas acciones y otros cambalaches con los SDKs para integrar diferentes tecnologías en el mismo entorno.

Si además pasa que no tenemos BO o Microstrategy y somos pro Microsoft (por ejemplo), la solución pasa por desarrollar aplicaciones .Net que tienen la flexibilidad total pero que carecen en muchos casos de:
- Un mantenimiento ágil y sencillo del código de la aplicación
- Un entorno visual
- Un enlace nativo con la base de datos tipo arrastrar y colocar
- Un sistema sencillo de interacción entre objetos
- Sistemas visuales avanzados (ya desde el punto de análisis de BI).

En estos casos en que tenemos necesidades de BI, de gestión de procesos, de control de los mismos, de ejecuciones en otros entornos, de aplicaciones y configuración de las mismas, arcplan se presenta como una alternativa sólida para cubrir todos los entornos (web / transaccional / control de procesos / BI / Budgeting), consiguiendo una integración máxima entre ellos y con una única herramienta para todo.


Lo que conseguimos con esto es una reducción drástica en el tiempo de desarrollo y de mantenimiento (por su naturaleza wysiwig y su facilidad de uso) comparado con un desarrollo a medida con .Net o Java. Si además tenemos en cuenta de que usuarios de negocio pueden aprender fácilmente su utilización para desarrollos (que no así con otras opciones), se convierte en una alternativa totalmente válida para un alto porcentaje de las necesidades de información de las compañías.

Alternativas de Gestión de Bucles en Informatica PowerCenter

Informatica  Todos los que hemos utilizado la herramienta, Informatica PowerCenter, nos hemos encontrado con la problemática de realizar procesos iterativos basados en datos.

La solución que se suele implementar es utilizar dos WorkFlows, lo que obliga a realizar algunos cambios en los dos WorkFlows en algunas ocasiones, y si existe una dependencia de otro WorkFlow, relacionada con la finalización del bucle, la cosa se complica. En muchas ocasiones nos encontramos con las limitaciones, en muchos casos infundadas, de los clientes que no permiten la utilización de ficheros de control, para los EventWait.
Aquí intentaremos dar soluciones alternativas, que permiten realizar seguimiento y poder controlar las ejecuciones desde el WorkFlow Monitor.

Origen

Se quieren eliminar los controles de finalización (EventWait) basados en ficheros. A partir de ahí hay que analizar un procedimiento que nos permita controlar la ejecución, y finalización correcta, de los bucles y, al mismo tiempo nos, nos facilite la posibilidad de indicar una finalización correcta o incorrecta, al Workflow General, para que continúe, aún que no haya finalizado un bucle o no se haya ejecutado, o forzar una parada controlada.
Problemática

La utilización de EventWait se basa en dos posibilidades:

a) Fichero de sistema
b) Event Raise

El primer caso es el que queremos utilizar, aunque si se fuerza el borrado del fichero al comienzo y se sincronizan correctamente las ejecuciones, en el Workflow General, debería ser igual de fiable.

El segundo caso es el que hemos analizado, para evaluar las alternativas que nos ofrece la herramienta, intentando minimizar la complejidad, maximizando el control y revisando opciones de reducir el desarrollo y la gestión.

Todas las alternativas han de permitir las opciones de controlar la finalización de cada bucle de forma independiente, ejecución asíncrona, o analizar la finalización de todos ellos como bloque, finalización síncrona.

Análisis de soluciones

Tras analizar las posibilidades, de la herramienta, desechamos algunas de las alternativas, al no ser factibles.

1) Ejecutar un EventRaise, desde fuera del Workflow, para activar el EventWait.

a) Definir el Evento en el WorkFlow o WorkLet

b) Definir un EventWait que espere ese evento

c) Definir un EventRaise desconectado, que active el evento

d) Definir un command, en otro WorkFlow que ejecute ese EventRaise

pmcmd starttask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control -wait er_FinalBucle

e) Resultado: Al ejecutar el command nos devuelve un código de retorno que corresponde a que no se ha podido ejecutar la tarea, al estar en ejecución el WorkFlow.


2) Ir finalizando las tareas en el WorkFlow General
a) Realizar las tareas a y b de la opción 1, para preparar el entorno
b) Definir un command, en otro WorkFlow, que finalice el Event Wait
i. Abort

pmcmd aborttask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle

ii. Stop

pmcmd stoptask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle

c) Resultado: Al ir finalizando los EventWait el estado del WorkFlow cambia y el Workflow no continúa con la siguiente tarea.

i. Si todas las tareas acaban como stopped el WorkFlow acaba como stopped
ii. Si alguna de las tareas, o todas, finalizan como aborted, independientemente de si el resto finalizan como stopped, el WorkFlow finaliza como aborted.

Soluciones Propuestas

Existen varias alternativas basadas en el concepto de controlar las ejecuciones en base a un Workflow de Control. En ese Workflow de control podemos tener tantas tareas como bucles, o procesos independientes, que queramos relacionar.

En caso de generar tareas, independientes para cada proceso, tendremos la opción de finalizarlas manualmente, como Stopped o Aborted, e indicar al WorkFlow General si debe parar o continuar, dependiendo de la definición de controla aplicada.

Esta solución nos permite esperar la finalización de todas las tareas y preguntar por el estado final del WorkFlow o preguntar independientemente por cada tarea, y continuar el flujo según esté definido, aunque exista un único WorkFlow de Control.

La solución tiene una aplicación sencilla, y como hemos visto, con varias alternativas de uso y control. A continuación se explicarán la sencilla y la más completa, aunque existen variedades de las mismas.

Vamos a trabajar con:

1) Un WorkFlow, de Inicio de Bucle, que emula la ejecución de 3 bucles y su finalización asíncrona, como stopped, con un minuto de diferencia por cada uno de ellos.

pmcmd stoptask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle
pmcmd stoptask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle1
pmcmd stoptask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle2
En caso de necesidad se podría forzar una finalización con Abort, ejecutando el pmcmd aborttask, utilizando los mismo parámetros.

2) Un WonkFlow, de Control, con 3 eventos separados, uno por cada bucle, el EventRaise no tiene utilidad como hemos visto en el análisis de soluciones.



Con estos WorkFlows como base, vamos a emular los procesos indicados (General y Detallado) para explicar algunas de las posibilidades.

1) Solución General basada en el control de un único WorkFlow

a) Creamos un WorFlow General

Todos los command tienen activado el control de errores.


i. La ejecución del WorkFlow InicioBucle

pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -nowait wf_MGM_Prueba_WF_InicioBucle

ii. La ejecución del WorkFlow de Control, con parámetro –nowait y controlando la finalización errónea, ya que el pmcmd, siempre finalizaría erroneo al cancelar las sesiones si lo ejecutamos con la opción -wait, y de esta forma fallará únicamente en caso de no poder ejecutarlo, al no haber finalizado una ejecución previa o tener algún problema de conexión o configuración.

pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -nowait wf_MGM_Prueba_WF_Control

iii. La verificación del estado de la última ejecución del WorkFlow de Control. Se ejecuta un primer comando WaitWorkFlow, forzando una finalización correcta al asignarle un exit 0, y un segundo para verificar el estado de finalización, que finalizará correctamente si el WorkFlow de control finalizó como stopped. Se puede incluir en el command anterior, se ha hecho así para facilitar la comprensión de los pasos.

pmcmd waitworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> wf_MGM_Prueba_WF_Control | exit 0
pmcmd getworkflowdetails -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> wf_MGM_Prueba_WF_Control | findstr /C:"Workflow run status: [Stopped]" > nul 2>&1 && (exit 0) || (exit 99)

iv. Para que sirva de ejemplo, se ha incluido la ejecución, del propio WorkFlow General, en caso de finalización correcta, de los bucles.

start cmd /C "ping -n 3 localhost && pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -nowait wf_MGM_Prueba_WF_GeneralDeCarga"

2) Solución Detallada basada en el control independiente de cada Bucle

a) Creamos un WorFlow Detallado

Todos los command tienen activado el control de errores.



i. La ejecución del WorkFlow InicioBucle

pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -nowait wf_MGM_Prueba_WF_InicioBucle

ii. La ejecución del WorkFlow de Control, con parámetro –nowait y controlando la finalización errónea, ya que el pmcmd, siempre finalizaría erroneo al cancelar las sesiones si lo ejecutamos con la opción -wait, y de esta forma fallará únicamente en caso de no poder ejecutarlo, al no haber finalizado una ejecución previa o tener algún problema de conexión o configuración.

pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -nowait wf_MGM_Prueba_WF_Control

iii. La verificación del estado de la última ejecución de cada uno de los bucles. Para cada uno de los command, se ejecuta un primer comando WaitTask, forzando una finalización correcta al asignarle un exit 0, y un segundo para verificar el estado de finalización, que finalizará correctamente si la Task del WorkFlow de control finalizó como stopped. En este caso, no tiene sentido incluir estas verificaciones en el command anterior, ya que sería lo mismo que controlar que todo el Workflow de Control finalizara como stopped

pmcmd waittask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle | exit 0
pmcmd gettaskdetails -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle | findstr /C:"Task run status: [Stopped]" > nul 2>&1 && (exit 0) || (exit 99)

iv. Para finalizar, el WorkFlow, se ha incluido un Decision, para que aglutine todas las tareas, igual que si hubiéramos preguntado por la finalización del WorfFlow. Y finalmente un Command con Exit 0. Para que se pueda verificar que únicamente se ejecuta si todos los Bucles acaban correctamente.

Ejemplo de Ejecución: