Bonita Studio hace muchas cosas automáticamente. Entre ellas, definir el trasvase de datos entre los formularios y las variables del proceso. Vamos a examinar con más detalle qué hace y cómo.
No siempre utilizaremos tareas de intervención humana —con formulario—, a veces necesitamos o podemos utilizar tareas automáticas que el sistema ejecuta sin esperar acción ninguna de un usuario. Esas son las tareas de servicio y las de script. En Bonita, la diferencia entre unas y otras es prácticamente nula, pero se supone que las tareas de servicio están enfocadas a la comunicación con sistemas externos —un servidor SMTP o un servicio web, por poner dos ejemplos—, y las de script a la programación. En cualquier caso, y para lo que las vamos a utilizar aquí, ambas nos sirven.
Supongamos este proceso. Lo que pretendemos es instanciarlo con 2 enteros y que nos calcule el resultado de multiplicar ambos.
Crea un diagrama como el mostrado. El proceso se llamará CALCULAR.
Crea el BDM Calculo con los siguientes atributos:
dato1 INTEGER
dato2 INTEGER
resultado INTEGER
Con el proceso seleccionado, en el panel de configuración, Datos/Variables de proceso/Agregar desde datos, declara la variable vnCalculo (com.company.model.Calculo)
Selecciona únicamente dato1 y dato2.
Como siempre que definimos un contrato de instanciación, Bonita genera las operaciones necesarias para trasvasar los datos del formulario a la variable de negocio. Compruébalo, vete a la pestaña Datos y edita la variable de negocio. Verás que ha actulizado el "valor predeterminado": edítalo.
Observarás que se ha creado un script como este:
def calculoVar = new com.company.model.Calculo()
calculoVar.dato1 = vnCalculoInput?.dato1
calculoVar.dato2 = vnCalculoInput?.dato2
return calculoVar
Está instanciando la variable de negocio con los datos que le van a venir desde el formulario —todavía no definido—, y se corresponde con lo que hemos especificado en el contrato de instanciación. El formulario va a devolver la variable vnCalculoInput y con ello ya tendremos lo necesario para iniciar el proceso.
Solo queríamos examinar este código, cancela hasta volver al diagrama.
No modifiques nada, se quedará con la opción "UI Designer" marcada, y el "formulario de destino" vacío. Bonita nos generará el formulario básico en cuanto ejecutemos.
Selecciona la tarea en el diagrama y examina el panel de configuración. Lo primero que podrás ver es que no hay definición de contrato ni de formulario. Es una tarea automática. Pero sí hay operaciones.
Añadimos una operación. Empezamos, de izquierda a derecha, indicando dónde vamos a guardar el resultado de la misma. Abre el primer desplegable y selecciona la variable de negocio.
A continuación debemos definir el tipo de operación que vamos a usar. Al definir el BDM, Bonita ha generado varios métodos Java para actualizar datos en las variables de negocio que se definan. Pincha en el enlace que está descrito como "Tomar valor de", y seleccion "usar un método Java".
Recuerda, estamos en la tarea, en el formulario inicial se han introducido vnCalculo.dato1 y vnCalculo.dato2: nos falta almacenar el resultado de la multiplicación de los dos anteriores, y lo vamos a hacer en vnResultado. Por eso elegimos el método setResultado(Integer).
De acuerdo, pero ¿qué valor vamos a almacenar? Necesitamos definir ese valor editándolo
En el asistente que nos aparece a continuación elegimos la pestaña "Script" para escribir nuestro código. Podemos darle el nombre que queramos a nuestro script.
Si no estás muy seguro del nombre de la variable de negocio y de sus atributos, siempre puedes acceder al panel izquierdo y seleccionarlo para que se escriba correctamente en el panel de edición.
Evidentemente lo que queremos es que nos devuelva el entero resultado de multiplicar dato1 por dato2, por eso el código debe ser:
vnCalculo.dato1 * vnCalculo.dato2
Con esto tenemos configurado completamente el proceso. Solo nos queda ejecutar.
Tras enviar el formulario inicial no hay ninguna tarea en la que tengamos que intervenir, así que nos vamos directamente al resumen del caso, y comprobamos que todo ha ido bien.
Vamos a hacer una pequeña modificación que consiste en transformar la tarea automática en una tarea de intervención humana. La idea es realizar tanto la captura de datos como la operación en la tarea.
Pincha con el botón derecho del ratón en el diagrama recién desarrollado en el explorador de proyectos. Elige la opción "duplicar...". Cambia el nombre del diagrama y del pool a CALCULARform.
Con la tarea calcular seleccionada, vete al panel inferior de configuración, a la pestaña General, y abre el desplegable del tipo de actividad. Elige "tarea humana".
Nuestro proceso va a cambiar radicalmente. Lo más práctico es eliminar todo aquello que ya no hace falta o que puede interferir con la nueva configuración.
El proceso no va a tener contrato de instanciación. Como ya hemos visto, asociado a este contrato está el valor inicial de la variable de negocio. Comenzaremos por eliminar este último. Con el proceso seleccionado, ve a la pestaña Datos y edita la variable de negocio. Elimina el valor prederteminado, y ese dato quedará en blanco.
Ahora podemos eliminar el contrato de instanciación sin ningún problema. Nos vamos a la pestaña Ejecución/Contrato, seleccionamos el contrato y lo eliminamos.
Especificamos que el proceso se iniciará sin formulario de instanciación. En Ejecución/Formulario de instanciación seleccionamos esa opción.
Elimina la operación de la tarea "calcular". Esto no es estrictamente necesario, podríamos editarla puesto que debemos cambiarla pero, para ver la secuencia de acciones que lleva a cabo Bonita, nos interesa dejarlo limpio.
Puesto que ya no tendremos formulario inicial, ese formulario debe rellenarse desde la tarea, al tiempo que añadiremos la operación que obtendrá el resultado de la multiplicación de los valores.
Añade el contrato
Como antes, con la tarea seleccionada, y tras pulsar "agregar desde datos", seleccionamos dato1 y dato2 de la variable de negocio
La consecuencia, al definir el contrato, es que Bonita añade 2 operaciones a la tarea. Fíjate que a la izquierda tenemos a nuestra variable de negocio; en medio, el método utilizado para actualizar la variable; y a la derecha la expresión que devuelve el valor a almacenar. En breve examinaremos en detalle cómo ha de ser esta expresión
Sin entrar en mucho detalle, fíjate que estamos trabajando con la entrada de contrato y la variable allí definida. En el código del script devolvemos una parte de ese contrato:
vnCalculoInput?.dato1
Dicho de otra forma, en esta variable se almacena el valor introducido en el formulario. Pero este valor solo tiene vida mientras la tarea termina de ejecutarse. De hecho, la ejecución de las operaciones es lo último que hará esta tarea nuestras. Mediante la operación trasvasamos ese valor a la variable de negocio para que se haga persistente y podamos utilizarlo en el resto del proceso.
Por lo general, para cada dato en el contrato necesitamos una operación que lo almacene en la variable de negocio.
Añade un formulario
Crea un formulario, edítalo, y nómbralo como fCalculo.
Queremos obtener esta apariencia. Para ello vamos a tener que hacer varias cosas.
Esto es lo que te vas a encontrar nada más entrar a editar.
El formulario lo define Bonita a partir de la variable de negocio y el contrato. La variable de negocio tiene 3 atributos, dato1, dato2 y resultado, pero el contrato dice que solo utilizamos los dos primeros. Bonita, si no le decimos lo contrario, utiliza todos los atributos de la variable de negocio, los que están en el contrato permiten edición, y los que no se muestran con "solo lectura".
Eso se traduce en 2 widgets INPUT, los que nos sirven para dar valor a dato1 y dato2, y un tercero TEXT de solo lectura que muestra el valor de resultado. Aunque resulta evidente que cuando se lance este formulario aún no tendremos resultado, sí lo vamos a reutilizar con una pequeña modificación.
Si, por lo que fuera, no te aparece ese tercer widget TEXT, el de "resultado", añádelo.
Echemos un vistazo a las variables del formulario. Sin entrar en más detalles, destacamos 3 de ellas:
context nos permite acceder al contexto del caso en ejecución, esto es, a sus variables de proceso
vnCalculo precisamente se define usando context, y nos permite utilizar los valores de la variable de negocio vnCalculo. No entiendas esto como que desde aquí se puede actualizar la variable de negocio a nuestro antojo; es, por así decirlo, una copia de de la variable de negocio del proceso
formOutput es donde realmente se devuelven datos al proceso, en concreto a las entradas de contrato. Si la editáramos, veríamos el siguiente código.
if( $data.vnCalculo ){
return {
//map vnCalculo variable to expected task contract input
vnCalculoInput: {
dato1: $data.vnCalculo.dato1 !== undefined ? $data.vnCalculo.dato1 : null,
dato2: $data.vnCalculo.dato2 !== undefined ? $data.vnCalculo.dato2 : null
}
}
}
Aparte del código necesario para asegurar que trabajamos con los valores esperados, lo importante de este código es que te des cuenta de que está diciendo qué se debe almacenar ($data.vnCalculo, la variable del formulario) en qué entrada del contrato (vnCalculoInput).
A continuación sí vamos a trabajar con variables de formulario.
Definir una variable de formulario
Añade una variable al formulario con nombre calculo y tipo javascript expression. En el valor has de escribir este código:
return $data.vnCalculo.dato1 * $data.vnCalculo.dato2;
Cuando estamos en formularios, el lenguaje es Javascript, y del código anterior sabemos cómo acceder las variables del formulario, esto es, con $data.vnCalculo. Los atributos de esta variable son los que queremos, finalmente, multiplicar.
Dicho de otra forma, cuando introduzcamos valores en los INPUT de dato1 y dato2, la variable cálculo tendrá el resultado de la multiplicación. Esto antes de enviar el formulario, de hecho podrás cambiar los valores y este resultado se irá actualizando en el propio formulario sin necesidad de pulsar el botón "enviar".
Al final deberías ver algo parecido a esto:
Reconfigurar el widget TEXT de vnResultado
Como hemos dicho, vnResultado no nos sirve de nada puesto que este es el primer formulario. No obstante, sí podemos utilizar la variable calculo que acabamos de crear. Selecciona el widget TEXT de vnResultado para que aparezca, en el panel de la derecha, toda la configuración del widget.
Lo primero es quitar la condición de "oculto" en el panel derecho de configuración. Simplemente, pincha en el aspa, y asegúrate de que la opción elegida es "no".
En la parte inferior del mismo panel de configuración modificamos el texto con
= {{calculo}}
La forma de acceder a las variables del formulario desde los widgets es utilizan dos pares de corchetes. Estamos diciendo que el texto que se vea en el formulario sea, en realidad, el valor de la variable calculo. El signo igual (=) es meramente decorativo, es texto que veremos tal cual.
Aparte de que recoloques o no los elementos del formulario, si guardas el formulario, y puesto que todo depende de lo que se introduzca en él, la vista previa es totalmente operativa y puedes probar con distintos valores de dato1 y dato2.
Nos queda un último paso. Recuerda que el formulario, a pesar de lo que hemos hecho, solo devuelve vnCalculoInput.dato1 y vnCalculoInput.dato2. Si queremos almacenar el resultado de la multiplicación definitivamente en la variable de negocio vnCalculo.resultado, necesitamos una operación de tarea. Añade una nueva operación.
Como se explicaba en el ejercicio anterior, el de la tarea automática, necesitamos el método Java apropiado, que en este caso es setResultado().
Sin embargo, el código es ligeramente diferente, ahora no estamos trabajando con la variable de negocio sino con las entradas de contrato. Por eso, nuestra línea de código ha de ser
vnCalculoInput.dato1 * vnCalculoInput.dato2
Cuando ejecutemos el proceso, es posible que tengamos que ir nosotros a la pestaña Tareas porque el proceso no tiene formulario de inicio. Pero allí tendremos la tarea. La tomamos, rellenamos el formulario, y enviamos. Ya podemos examinar el caso archivado.
Vamos a duplicar el diagrama anterior y realizar una modificación al formulario para ver una forma alternativa de hacer lo mismo. Todo lo que estás viendo puede serte útil en futuros ejercicios, y tú decidirás cómo hacerlo en ese momento.
Pincha con el botón derecho del ratón en el diagrama recién desarrollado en el explorador de proyectos. Elige la opción "duplicar...". En este caso no cambiamos el nombre, pero sí las versiones a 1.1.
Y en ese orden.
Seleccionando todos los atributos de la variable de negocio. Por lo tanto, 3 operaciones nos han de aparecer en la opción operaciones:
Las dejamos tal cual nos las ha generado Bonita, no editamos nada.
Con el nombre fCalculo2.
Como era de esperar, el formulario es coherente con la definición de nuestro contrato. No obstante, no nos sirve de nada puesto que no va a realizar lo que queremos, la multiplicación.
Lo que pretendemos es algo parecido a lo hecho en el ejercicio anterior, pero de otra forma. Para ello tenemos que modificar el widget INPUT de "resultado", y modificar la variable de formulario formOutput.
Aquí pretendemos que se muestre la multiplicación dato1 * dato2 cada vez que actualizamos uno de esos dos datos. Lo primero es hacerlo de "solo lectura". Lo siguiente es cambiar el valor mostrado. Para lo primero, ninguna dificultad, seleccionar la opción.
Para lo segundo, recuerda que el formulario tiene una variable —porque así la ha definido Bonita— vnCalculo, que es la que finalmente se devolverá al proceso cuando pulsemos el botón "enviar". Si te fijas en el "valor" del INPUT de dato1, verás que es vnCalculo.dato1. Análogo al de dato2.
Inculso en "resultado" ahora mismo ves vnCalculo.resultado. Pero lo hemos hecho de solo lectura, no podemos escribir nada en él, no hay forma de darle valor. La solución es modificar ese "valor":
vnCalculo.resultado = vnCalculo.dato1*vnCalculo.dato2
Puesto que nosotros no estamos escribiendo ese valor en el formulario, le asignamos el resultado de una expresión aritmética.
Y ahora sí obtenemos el resultado esperado.
Un método alternativo
Independientemente de que utilicemos la expresión previa vnCalculo.dato1*vnCalculo.dato2 en el INPUT "resultado", podríamos haber modificado la variable formOutput para que nos devolviera el cálculo. Sería de esta forma:
if( $data.vnCalculo ){
return {
//map vnCalculo variable to expected task contract input
vnCalculoInput: {
dato1: $data.vnCalculo.dato1 !== undefined ? $data.vnCalculo.dato1 : null,
dato2: $data.vnCalculo.dato2 !== undefined ? $data.vnCalculo.dato2 : null,
resultado: ($data.vnCalculo.dato1 !== undefined
&& $data.vnCalculo.dato2 !== undefined)
? $data.vnCalculo.dato1*$data.vnCalculo.dato2 : null
}
}
}
Tan solo pretendemos que veas las opciones que tienes para futuros usos.