Utilizando Decision Services con Process Manager Standard 8 : Decision Tables

En este artículo se presenta cómo se pueden aprovechar los servicios de decisión que incluye IBM Process Manager para trabajar con decisiones en un proceso. En particular, se enfoca en mostrar cómo trabajar con tablas de decisión, para reemplazar el uso de JavaScript.

Pablo Benjamín Sigüenza González, Websphere IT Specialist, IBM México

Pablo es WebSphere IT Specialist en IBM México



04-12-2013

Introducción

Las decisiones son una parte fundamental de todo proceso de negocio. En general, corresponden a reglas de negocio, por lo que es importante que estén implementadas en forma clara para todos los involucrados en el proceso.

Como parte del BPMN, los puntos de decisión se implementan con un gateway y se representan gráficamente con un diamante o rombo. Existen diferentes tipos de gateway, pero vale la pena enfatizar que ahí no se toman las decisiones. Los gateway son solo objetos de flujo, la toma de decisiones ocurre en alguna actividad previa al gateway.

IBM Process Manager Standard 8 incluye varios artefactos que nos ayudan a implementar decisiones dentro de nuestros procesos. En este artículo vamos a trabajar en particular con uno de ellos, las tablas de decisión o decision tables.


Qué son las tablas de decisión

Las tablas de decisión son útiles cuando se evalúan condiciones exclusivas; es decir, se tienen varias condiciones que son independientes entre sí y solo una de ellas puede cumplirse en un momento dado. Este tipo de decisiones se puede escribir como se muestra a continuación:

si (condición 1) entonces Acción 1

sino si (condición 2) entonces Acción 2

...

sino entonces Acción N

Desde el punto de vista técnico, utilizar JavaScript para implementar este tipo de decisiones no es complicado y no es indispensable emplear una tabla de decisión. Sin embargo, conforme el número de condiciones aumenta o se complican las condiciones, el número de líneas de JavaScript también aumenta. El código entonces es propenso a errores y más importante aún, dificulta la lectura e interpretación de las decisiones por parte de los analistas de negocio y demás involucrados en el proceso.

Lo anterior es todavía más crítico si la decisión corresponde a una regla de negocio. Hay que evitar que la regla quede oculta en el código. Lo recomendable es emplear algún BRMS (Business Rule Management System) como IBM Operational Decision Management (ODM) para almacenar todas las reglas de negocio. En caso de no contar con ODM, se pueden aprovechar los diferentes componentes que incluye Process Manager para este efecto.

Una tabla de decisión ofrece una forma más elegante y gráfica de mostrar estas condiciones, como el siguiente ejemplo:

Figura 1.

Resulta claro que esta forma es más fácil a la vista y permite entender rápidamente las consecuencias de cada una de las decisiones, ese es el verdadero valor de las tablas de decisión.


Implementando decisiones mediante JavaScript

Consideremos el siguiente ejemplo de un proceso sencillo. Un administrador de proyectos debe capturar información sobre un proyecto internacional antes de que inicie. Debe indicar la duración del proyecto y si se requiere visa para los participantes del proyecto. Posteriormente el gerente de la cuenta debe autorizar el proyecto y el gerente de personal debe seleccionar a los participantes.

Al final, se deben ejecutar diferentes actividades automáticas que dependen de la duración del proyecto, si es mayor o menor a seis meses y también de la necesidad de visa para los participantes. Precisamente, ahí es donde se emplea un gateway para determinar qué actividades deben ejecutarse durante la ejecución del proceso.

Empleando el Process Designer, creamos el siguiente BPD:

Figura 2.

Con el fin de mantener simple el ejercicio se definen solo las siguientes variables para incluir la información relevante del ejemplo.

Figura 3.

Hemos utilizado un subproceso para modelar las actividades automáticas. Existen tres posibles rutas de ejecución a partir del gateway. La actividad Seleccionar preparativos es donde se toman las decisiones.

Figura 4.

Esta actividad está implementada en un script mediante JavaScript como se muestra en la imagen:

Figura 5.

En el código se puede observar una práctica usual y común, esta es utilizar variables de tipo String para especificar un valor constante a una variable. Esto obliga a que en el gateway se realicen comparaciones del siguiente estilo:

Figura 6.

Lo cual es propenso a errores, es recomendable emplear variables de tipo boolean para mayor claridad. En la siguiente sección veremos un ejemplo de cómo se realiza esto.


Implementando decisiones mediante tablas de decisión

IBM Process Manager ofrece varios tipos de servicios, cada uno especializado para alguna necesidad en particular. Uno de ellos son precisamente los servicios de decisión, estos contienen artefactos exclusivos para implementar la toma de decisiones. En la versión 8.0.1 se incluyen los siguientes:

Tabla 1.
Reglas de negocio con BALBAL es el acrónimo de Business Action Language, es una especie de lenguaje natural enfocado a plasmar en palabras y estructura lo más parecido al que usamos las personas para una regla de negocio.
Tablas de decisiónLas tablas de decisión son precisamente las que discutimos y analizamos en este escrito. En las secciones siguientes daremos más detalle de cómo se implementan en IBM Process Manager.
IBM ILOG JRules Decision ServiceComo se mencionó antes, la opción recomendada para manejar las reglas de negocio es contar con un BRMS. Si se cuenta con IBM ODM, se puede emplear este artefacto para comunicarse en forma directa con el Rule Execution Server y aprovechar las aplicaciones de reglas que estén instaladas.

Los servicios de decisión también se componen de varios pasos, tienen variables de entrada, privadas y de salida.


Creación de un proceso de decisión

Dentro del Process Designer elegimos Decisions y hacemos clic en el símbolo de más (b). A continuación hay que elegir la opción de Decision service. Esto nos va a mostrar un cuadro de diálogo donde hay que elegir el nombre que deseamos darle al servicio.

Figura 7.

Lo primero es definir las variables. En este caso, la decisión se toma en base de la duración y de la necesidad de visa. Siguiendo el principio de solo enviar la información mínima indispensable al servicio, definimos dos variables de entrada, duracionProyecto y seRequiereVisa. Como existen tres posibles resultados, creamos tres variables de tipo boolean, cada una con un nombre suficientemente descriptivo para evitar confusiones. De esta forma es como precisamente evitamos el uso de variables tipo String y tener que realizar comparaciones posteriores en el gateway.

Figura 8.

Paso siguiente hay que agregar la tabla de decisión al servicio. En la paleta de la derecha hay que arrastrar Decision Table al diagrama. Agregamos también un Script para inicializar nuestras variables y mostrar algunos mensajes en el log.

Figura 9.

Un pequeño icono indica si el paso corresponde a una tabla de decisión. Al dar doble clic sobre este, se abre el editor de tablas.

Figura 10.

El editor está dividido en diferentes secciones:

Tabla 2.
1En esta sección se muestran todas las tablas de decisión que conforman el servicio. La que está seleccionada es la que se puede modificar.
2En esta sección se muestra la tabla de condición. Cada columna representa una variable que puede utilizarse (que esté definida como parte del servicio) y cada renglón representa una condición diferente. Como se indica en el infocenter, se debe iniciar con la regla de mayor complejidad hasta la de menor complejidad. Una vez que las condiciones se cumplen, el resto es ignorado.
3Con estos botones se pueden agregar o eliminar columnas de acuerdo con las variables disponibles. Para eliminar una de las columnas, hay que editar la celda correspondiente y elegir el botón de eliminar. Hay que considerar que el orden de las columnas no puede modificarse una vez que se han agregado.
4Con estos botones se puede mover el renglón (condición) seleccionado hacia arriba o hacia abajo. También se puede eliminar una condición (renglón) con el último botón.
5En este espacio se deben escribir el código en JavaScript que se desea ejecutar como resultado de que la condición de cumple. Las variables se pueden obtener mediante el namespace tw.local

Para aquellos que han empleado antes IBM Operational Decision Management (ODM, lo que antes era ILOG JRules) encontrarán que son diferentes las tablas de decisión. Una de las diferencias es que no es posible emplear BAL para definir las condiciones.

Para variables de tipo numérico y String, es posible emplear los siguientes operadores para indicar negaciones o rangos.

Figura 11.

En base a todo lo anterior, la tabla de decisión para nuestro servicio de decisión queda implementada como:

Figura 12.

Obsérvese como en este caso no hay una condición “else”, ya que en el script de inicialización se asignaron como falsas todas las variables de salida del servicio. Siempre hay que asegurarse de considerar el caso cuando ninguna de las condiciones se satisface para evitar comportamientos inesperados en el servicio y por lo tanto en el proceso.


Asociar el servicio de decisión al BPD

Una vez creado el servicio de decisión hay que realizar algunos cambios en el subproceso. Lo primero es eliminar la actividad donde se tomaban las decisiones.

Figura 13.

A continuación debemos asociar el servicio de decisión al gateway. Hay que elegir el gateway y en la pestaña Properties elegimos Decision. Hay que hacer clic en el botón Select y seleccionamos nuestro servicio de decisión.

Figura 14.

En la sección de Inputs debemos indicar de cuáles variables del BPD se toman los valores de entrada del servicio. Nótese que si bien la variable Proyecto podría tener más de dos campos asociados eso no es relevante para la operación del servicio y no es necesaria pasar esta información al servicio.

Como podemos ver, no existe una sección de Outputs. Entonces, ¿cómo se emplea el resultado del servicio de decisión? Para este fin, existe el namespace tw.decision. A través de él podemos tener acceso a las variables de salida del servicio dentro del gateway.

Si se hace clic en Implementation, podemos emplear precisamente estas variables para indicar cuando es valida alguna de las rutas en el proceso.

Figura 15.

Tampoco es necesario emplear expresiones del tipo:

tw.decision.esProyectoCorto == true

Basta que las variables sean de tipo Boolean.

De esa forma, el proceso queda implementado completamente. Empleando el Process Inspector podemos probar el funcionamiento del proceso en algunos casos sencillos.

Figura 16.

En el SystemOut del AppTarget podemos observar el resultado del servicio de decisión según se haya capturado la información en el coach.

Figura 17.

En este caso, basta con esta prueba para validar el proceso. Sin embargo, en un caso real hay que considerar varios casos de prueba de acuerdo a los valores que pueden tomar cada variable y se debe validar que en todos ellos se obtenga el valor esperado por el servicio.


Conclusiones

Las tablas de decisión ofrecen una alternativa más clara y visual a las estructuras de tipo if / elseif / else. Permite apreciar fácilmente cuáles son las condiciones y sus consecuencia favoreciendo la reducción de errores.

Si no se cuenta con IBM ODM, las tablas son una opción viable para utilizar para trabajar con decisiones en IBM Process Manager, no solo cuando corresponden a reglas de negocio.


Agradecimientos

Agradezco a Nathalia Herrera y Juan Montalvo sus comentarios y recomendaciones durante la revisión de este documento.


Recursos

La aplicación de ejemplo se incluye, está construida y probada en IBM Process Manager Standard 8.0.1


Referencias

IBM Process Manager 8.0.1 Infocenter

Building a Decision service

Specifying variable values using JavaScript

Adding a Decision Table component to a service

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere
ArticleID=955951
ArticleTitle=Utilizando Decision Services con Process Manager Standard 8 : Decision Tables
publish-date=12042013