Árvore de páginas

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.
  • Sem rótulos