7.1. Objetivo
Permitir que un formulario Metadatos pueda interactuar con el engine de workflow del Fluig, realizando operaciones tales como:
Iniciar un nuevo proceso (iniciar solicitud)
Cancelar una solicitud
Cambiar la fecha de plazo de una tarea
Cambiar los comentarios de la tarea
Devolver el valor de un campo de formulario de workflow
Mover una solicitud a la próxima actividad
Seleccionar usuario(s) y promover la actividad automática
Asumir una tarea
Obtener los anexos de una solicitud
Responder el número de la actividad en que se encuentra una solicitud
Responder el número de la próxima actividad de una solicitud
Responder con detalles de las actividades disponibles para la selección
Responder con los colaboradores que pueden ejecutar la tarea relativa a una solicitud
Responder con los procesos para que el colaborador pueda iniciar una solicitud
Responder con los colaboradores disponibles en la apertura de una solicitud
Busca procesos disponibles para inicialización
La interacción con la engine de wokflow se hará a través de códigos ABLScript utilizando el comando ECM-REQUEST-SERVICE(). Este comando realizará llamadas al WorkflowEngineService, como se muestra en el diagrama siguiente:
Gráfico 6.1.a
7.2. Guía de Programación
Sintaxis del comando ECM-petición-SERVICE:
variable = ECM-REQUEST-SERVICE(serviceID, operationId, [param1, param2, param3, ...]).
Donde:
variable: variable de tipo CHARACTER que recibirá la respuesta de la ejecución del comando. La respuesta puede llegar como un character simple, que se podrá convertir a otro tipo a través de las funciones DECIMAL(), INTEGER() o DATE(). O podrá ser un character JSON que se convertirá en una TEMP-TABLE a través del a función JSON-DECODE ().
serviceID: character con el ID del servicio a ejecutar en Fluig. Para cumplir con los requisitos definidos en este documento, deberá usarse el serviceId= "WORKFLOW". En el futuro se implementarán métodos para tener acceso a otros servicios de Fluig, como por ejemplo DocumentService o FolderService.
operationID: identifica la operación (método) a ejecutar en el WorkflowEngineService. Ejemplo: “START-PROCESS”.
param1, param2, ...: lista de parámetros a enviar al servicio.
Operações
Operación ID: START-PROCESS
Descripción: Inicia umnproceso.
Volver:TempTable
Parámetros:
Nombre | Tipo | Descripción | Detalles |
---|---|---|---|
processId | character | Código del proceso | |
colleagueIds | character | Empleados que recibirán la tarea | usar character en el formato: "colab1,colab2,colab3" |
activityNumber | int | Número de la actividad | |
comments | character | Comentarios | |
completeTask | logical | Indica si debe completar la tarea (true) o sólamente guardarla (false) | |
ttAttachments | TempTable | Adjuntos de la solicitud | DEFINE TEMP-TABLE ttAttach FIELD documentId AS INTEGER FIELD documentVersion AS INTEGER FIELD description AS CHARACTER FIELD filename AS CHARACTER FIELD filepath AS CHARACTER FIELD principal AS LOGICAL. |
ttCardData | TempTable | Datos del formulario | DEFINE TEMP-TABLE ttUsers FIELD fieldName AS CHARACTER FIELD fieldName AS CHARACTER. |
ttAppointment | TempTable | Nombramientos de la tarea | DEFINE TEMP-TABLE ttAppointment FIELD appointmentDate AS CHARACTER FIELD appointmentSeconds AS INTEGER FIELD appointmentSequence AS INTEGER. |
managerMode | logical | Indica si el empleado se encuentra iniciando la solicitud como gestor del proceso. |
Operation ID: CANCEL-PROCESS
Descripción: Cancela un proceso.
Volver: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
cancelText | character |
Comentarios de la cancelación |
Operación ID: SET-DUE-DATE
Descripción: Cambia la fecha de plazo de la tarea.
Respuesta: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. Si no existe el valor es 0 (cero), Si está disponible, este valor puede ser desde 1 hasta infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
newDueDate | character | Nueva fecha de plazo de la tarea. |
timeInSeconds | Integer | Tiempo de la tarea en segundos. |
Operación ID: SET-TASK-COMMENTS
Descripción: Cambia los resultados de la tarea.
Retorno: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. Si no existe el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
comments | character | Comentario |
Operación ID: GET-CARD-VALUE
Descripción: Devuelve el valor de un campo del formulario.
Respuesta: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
fieldName | character | Nombre del campo del formulario |
Operación ID: SAVE-AND-SEND-TASK
Descripción: Mueve solicitudes hacia la próxima
actividad.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción | Detalles |
---|---|---|---|
processInstanceId | Integer | Código del proceso | |
colleagueIds | character | Empleados que recibirán la tarea | usar character en el formato: "colab1,colab2,colab3" |
activityNumber | Integer | Número de la actividad | |
comments | character | Comentarios | |
completeTask | logical | Indica si debe completar la tarea (true) o sólamente guardarla (false) | |
ttAttachments | TempTable | Adjuntos de la solicitud | DEFINE TEMP-TABLE ttAttach FIELD documentId AS INTEGER FIELD documentVersion AS INTEGER FIELD description AS CHARACTER FIELD filename AS CHARACTER FIELD filepath AS CHARACTER FIELD principal AS LOGICAL. |
ttCardData | TempTable | Datos del formulario | DEFINE TEMP-TABLE ttUsers FIELD fieldName AS CHARACTER FIELD fieldName AS CHARACTER. |
ttAppointment | TempTable | Nombramientos de la tarea | DEFINE TEMP-TABLE ttAppointment FIELD appointmentDate AS CHARACTER FIELD appointmentSeconds AS INTEGER FIELD appointmentSequence AS INTEGER. |
managerMode | logical | Indica si el empleado está iniciando la solicitud como gestor del proceso. |
|
threadSequence | Integer | Indica si existe actividad paralela en el proceso. Si no existe el valor es 0 (cero). Si está disponible, este valor puede ser desde 1 hasta el infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: SAVE-AND-SEND-TASK-BY-REPLACEMENT
Descripción: Mueve solicitudes hacia la próxima
actividad utilizando usuario sustituto.
Respuesta TempTable
Parámetros:
Nombre | Tipo | Descripción | Detalles |
---|---|---|---|
processInstanceId | Integer | Código del proceso | |
colleagueIds | character | Empleados que recibirán la tarea | usar character en el formato: "colab1,colab2,colab3" |
activityNumber | Integer | Número de la actividad | |
comments | character | Comentarios | |
completeTask | logical | Indica si debe completar la tarea (true) o sólamente guardarla (false) | |
ttAttachments | TempTable | Adjuntos de la solicitud | DEFINE TEMP-TABLE ttAttach FIELD documentId AS INTEGER FIELD documentVersion AS INTEGER FIELD description AS CHARACTER FIELD filename AS CHARACTER FIELD filepath AS CHARACTER FIELD principal AS LOGICAL. |
ttCardData | TempTable | Datos del formulario | DEFINE TEMP-TABLE ttUsers FIELD fieldName AS CHARACTER FIELD fieldName AS CHARACTER. |
ttAppointment | TempTable | Nombramientos de la tarea | DEFINE TEMP-TABLE ttAppointment FIELD appointmentDate AS CHARACTER FIELD appointmentSeconds AS INTEGER FIELD appointmentSequence AS INTEGER. |
managerMode | logical | Indica si el empleado está iniciando la solicitud como gestor del proceso. |
|
threadSequence | Integer | Indica si existe actividad paralela en el proceso. Si no es el caso, el valor es 0 (cero). Si sí, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
|
replacementId | character | Matrícula del empleado sustituto |
Operación ID: SET-AUTOMATIC-DECISION
Descripción: Selecciona usuario(s) y promueve la
actividad automática.
Respuesta TempTable
Parámetros:
Nombre | Tipo | Descripción | Detalles |
---|---|---|---|
processInstanceId | Integer | Código del proceso | |
autoTaskNum | Integer | Número de actividad automática | |
taskNum | Integer | Número de la actividad actual | |
condition | Integer | Número de la condición de la actividad automática | |
colleagueIds | character | Empleados que recibirán la tarea | usar character en el formato: "colab1,colab2,colab3" |
comments | character | Comentarios | |
managerMode | logical | Indica si el empleado está ejecutando la tarea como gestor del proceso | |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: TAKE-PROCESS-TASK
Descripción: Asume una tarea.
Respuesta: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: TAKE-PROCESS-TASK-BY-REPLACEMENT
Descripción: Asume una tarea utilizando un usuario
sustituto.
Respuesta: character
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
replacementId | character | Matrícula del empleado sustituto. |
Operación ID: GET-ATTACHMENTS
Descripción: Devuelve los anexos de una solicitud
Respuesta TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
Operación ID: GET-ALL-ACTIVE-STATES
Descripción: Devuelve el número de la actividad está una solicitud.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
Operación ID: GET-ACTUAL-THREAD
Descripción: Responde con la secuencia de la thread de una solicitud.
Respuesta TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
stateSequence | Integer | Secuencia del estado |
Operación ID: GET-AVAILABLE-STATES
Descripción: Responde con el número de la próxima
actividad de una solicitud.
Respuesta TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processId | character | Código del proceso |
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: GET-AVAILABLE-STATES-DETAIL
Descripción: Responde con detalles de las actividades disponibles para la selección.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processId | character | Código del proceso |
processInstanceId | Integer | Código del proceso |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: GET-AVAILABLE-USERS
Descripción: Responde con los empleados que pueden
ejecutar la tarea corriente de una solicitud.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
taskNumber | Integer | Número de la actividad |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: GET-INSTANCE-CARD-DATA
Descripción: Devuelve el valor de los campos de un
formulario.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processInstanceId | Integer | Código del proceso |
Operación ID: GET-AVAILABLE-PROCESS
Descripción: Responde con los procesos para que el empleado pueda iniciar una solicitud.
Respuesta: TempTable
Operación ID: GET-AVAILABLE-USERS-START
Descripción: Responde con los empleados disponibles
en la apertura de una solicitud.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
processId | character | Código del proceso |
taskNum | Integer | Número de la actividad |
threadSequence | Integer | Indica si existe actividad paralela en el proceso. De no haber, el valor es 0 (cero), si está disponible, este valor puede ser desde 1 a infinito dependiendo de la cantidad de actividades paralelas existentes en el proceso. |
Operación ID: SEARCH-PROCESS
Descripción: Busca procesos disponibles para la
inicialización.
Respuesta: TempTable
Parámetros:
Nombre | Tipo | Descripción |
---|---|---|
content | character | Nome do processo a ser pesquisado |
favorite | logical | Búsqueda de la lista de favoritos o de la lista predeterminada. |
Ejemplo de Uso
A continuación veremos un ejemplo de formulario Freeform del Metadatos Datasul que realiza algunas operaciones con el comando ECM-REQUEST-SERVICE.
Gráfico 6.2.a
El gráfico 6.2.a muestra un formulario que al cargarse realiza la búsqueda de los procesos disponibles para el usuario registrado y presenta los mismos en un grid. En el Gráfico 6.2.a se seleccionó el proceso "Proc3" que posee un formulario asociado. Se informaron los campos del formulario y datos de nombramiento. Finalmente el usuario hizo clic en el botón START-PROCESS que creó una nueva instancia del proceso, resultando en el process ID 119.
A continuación se presentarán los diversos scripts del formulario.
varDefinition
/* Inicio WIDGET-HANDLE - No editar, utilice CTRL + SHIFT + H */ DEFINE VARIABLE txtComment AS WIDGET-HANDLE. DEFINE VARIABLE txtDescricao AS WIDGET-HANDLE. DEFINE VARIABLE canvasCard AS WIDGET-HANDLE. DEFINE VARIABLE txtCodigo AS WIDGET-HANDLE. DEFINE VARIABLE lblProcList AS WIDGET-HANDLE. DEFINE VARIABLE canvasAppointment AS WIDGET-HANDLE. DEFINE VARIABLE lblProcInstId AS WIDGET-HANDLE. DEFINE VARIABLE lblAttach AS WIDGET-HANDLE. DEFINE VARIABLE txtProcInstId AS WIDGET-HANDLE. DEFINE VARIABLE lblApp AS WIDGET-HANDLE. DEFINE VARIABLE gridProcess AS WIDGET-HANDLE. DEFINE VARIABLE dtf AS WIDGET-HANDLE. DEFINE VARIABLE canvasAttach AS WIDGET-HANDLE. DEFINE VARIABLE txtSec AS WIDGET-HANDLE. DEFINE VARIABLE lblForm AS WIDGET-HANDLE. /* Fim WIDGET-HANDLE */ DEFINE VARIABLE resp AS CHARACTER. DEFINE VARIABLE ttResult AS TEMP-TABLE.
Canvas.creationComplete
PROCESS-WAIT(TRUE). /* Seta estilos de alguns componentes */ CALLFUNCTION(lblProcList, "setStyle", "fontSize", 11). CALLFUNCTION(lblProcList, "setStyle", "fontWeight", "bold"). CALLFUNCTION(lblProcInstId, "setStyle", "fontSize", 11). CALLFUNCTION(lblProcInstId, "setStyle", "fontWeight", "bold"). CALLFUNCTION(canvasAttach, "setStyle", "backgroundColor", "#d9dbe1"). CALLFUNCTION(lblAttach, "setStyle", "fontSize", 11). CALLFUNCTION(lblAttach, "setStyle", "fontWeight", "bold"). CALLFUNCTION(canvasCard, "setStyle", "backgroundColor", "#d9dbe1"). CALLFUNCTION(lblForm, "setStyle", "fontWeight", "bold"). CALLFUNCTION(canvasAppointment, "setStyle", "backgroundColor", "#d9dbe1"). CALLFUNCTION(lblApp, "setStyle", "fontWeight", "bold"). /* Obtiene los procesos disponibles para el usuario */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "GET-AVAILABLE-PROCESSES"). if RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-AVAILABLE-PROCESS". ELSE DO: ttResult = JSON-DECODE(resp). gridProcess:QUERY-OPEN(ttResult). END. PROCESS-WAIT(FALSE).
btoStartProcess.click
DEFINE VARIABLE idx AS INTEGER. DEFINE VARIABLE processId AS CHARACTER. DEFINE VARIABLE procComment AS CHARACTER. DEFINE VARIABLE aux AS CHARACTER. DEFINE VARIABLE once AS LOGICAL INITIAL true. DEFINE VARIABLE dt AS DATE. DEFINE VARIABLE iaux AS INTEGER. /* Obtiene el proceso seleccionado en el Grid */ idx = GETPROPERTY(gridProcess, "selectedIndex"). ttResult:SET-CURRENT(idx). processId = ttResult.processId. /* Obtiene el comentario */ procComment = txtComment:SCREEN-VALUE. /* Obtiene archivos a adjuntar del componente de upload*/ DEFINE VARIABLE upload AS WIDGET-HANDLE. DEFINE TEMP-TABLE ttFiles FIELD name AS CHARACTER FIELD type AS CHARACTER FIELD appServerPath AS CHARACTER FIELD jbossPath AS CHARACTER FIELD size AS DECIMAL. ttFiles = GETPROPERTY(upload,"files"). /* Prepara Temp-Table de archivos adjuntos */ DEFINE TEMP-TABLE ttAttach FIELD documentId AS INTEGER FIELD documentVersion AS INTEGER FIELD description AS CHARACTER FIELD filename AS CHARACTER FIELD filepath AS CHARACTER FIELD principal AS LOGICAL. FOR EACH ttFiles: CREATE ttAttach. ttAttach.documentVersion = 1000. ttAttach.description = ttFiles.name. ttAttach.filename = ttFiles.name. ttAttach.filepath = ttFiles.jbossPath. IF once THEN DO: ttAttach.principal = true. once = false. END. END. /* Prepara Temp-Table con valores del formulario */ DEFINE TEMP-TABLE ttUsers FIELD fieldName AS CHARACTER FIELD fieldName AS CHARACTER. CREATE ttCard. ttCard.fieldName = "A1_CODIGO". aux = txtCodigo:SCREEN-VALUE. ttCard.fieldValue = aux. CREATE ttCard. ttCard.fieldName = "A1_DESCRICAO". aux = txtDescripción:SCREEN-VALUE. ttCard.fieldValue = aux. /* Prepara Temp-Table con valores de Nombramiento */ DEFINE TEMP-TABLE ttAppointment FIELD appointmentDate AS CHARACTER FIELD appointmentSeconds AS INTEGER FIELD appointmentSequence AS INTEGER. aux = txtSec:SCREEN-VALUE. IF aux <> "" THEN DO: CREATE ttAppointment. dt = GETPROPERTY(dtf, "selectedDate"). aux = STRING(dt, "99/99/9999"). aux = aux + " 00:00:00". ttAppointment.appointmentDate = aux. iaux = INTEGER(txtSec:SCREEN-VALUE). ttAppointment.appointmentSeconds = iaux. ttAppointment.appointmentSequence = 1. END. /* Inicia el proceso */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "START-PROCESS", processId, "framework", 2, procComment, true, ttAttach, ttCard, ttAppointment, false). IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar START-PROCESS". ELSE DO: txtProcInstId:SCREEN-VALUE = resp. END.
btoCancelProcess.click
DEFINE VARIABLE processInstId AS INTEGER. processInstId = INTEGER(txtProcInstId:SCREEN-VALUE). /* Si la cancelación estuvo Ok regresa a 'true', sino vuelve el mensaje de error */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "CANCEL-PROCESS", processInstId, "¡Finaliza proceso!"). IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-AVAILABLE-PROCESS". ELSE DO: MESSAGE "¡Proceso cancelado con éxito!" VIEW-AS ALERT-BOX INFORMATION TITLE "CANCEL-PROCESS". txtProcInstId:SCREEN-VALUE = "". END.
btoGetCardData.click
DEFINE VARIABLE procInstId AS INTEGER. procInstId = INTEGER(txtProcInstId:SCREEN-VALUE). /* Obtiene un campo por vez: GET-CARD-VALUE resp = ECM-REQUEST-SERVICE("WORKFLOW", "GET-CARD-VALUE", procInstId, "A1_CODIGO"). IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-CARD-VALUE". ELSE DO: txtCodigo:SCREEN-VALUE = resp. END. resp = ECM-REQUEST-SERVICE("WORKFLOW", "GET-CARD-VALUE", procInstId, "A1_DESCRICAO"). IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-CARD-VALUE". ELSE DO: txtDescricao:SCREEN-VALUE = resp. END. */ /* Obtiene todos los campos del formulario: GET-INSTANCE-CARD-DATA */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "GET-INSTANCE-CARD-DATA", procInstId). DEFINE VARIABLE ttCard AS TEMP-TABLE. DEFINE VARIABLE fieldName AS CHARACTER. DEFINE VARIABLE fieldValue AS CHARACTER. IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-INSTANCE-CARD-DATA". ELSE DO: ttCard = JSON-DECODE(resp). FOR EACH ttCard: fieldName = ttCard.fieldName. fieldValue = ttCard.fieldValue. IF fieldName = "A1_CODIGO" THEN DO: txtCodigo:SCREEN-VALUE = fieldValue. END. IF fieldName = "A1_DESCRICAO" THEN DO: txtDescricao:SCREEN-VALUE = fieldValue. END. END. END.
btoAvailableUsers.click
DEFINE VARIABLE procInstId AS INTEGER. procInstId = INTEGER(txtProcInstId:SCREEN-VALUE). /* Obtiene lista de usuarios para tarea */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "GET-AVAILABLE-USERS", procInstId, 2, 0). DEFINE VARIABLE ttUsers AS TEMP-TABLE. IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar GET-AVAILABLE-USERS". ELSE DO: ttUsers = JSON-DECODE(resp). FOR EACH ttUsers: DISPLAY ttUsers.user. END. END.
btoTakeTask.click
DEFINE VARIABLE procInstId AS INTEGER. /* Obtiene el process instance Id */ procInstId = INTEGER(txtProcInstId:SCREEN-VALUE). /* Asume tarea corriente */ resp = ECM-REQUEST-SERVICE("WORKFLOW", "TAKE-PROCESS-TASK", procInstId, 0). IF RESULT-WITH-ERROR(resp) THEN DO: MESSAGE resp VIEW-AS ALERT-BOX ERROR TITLE "Error al ejecutar TAKE-PROCESS-TASK". ELSE DO: DISPLAY resp. END.