Árvore de páginas

Icon

Las rutinas son ejecutadas vía Web Services, por lo tanto es necesario que estas ejecuciones estén conectadas y configuradas en el servidor TOTVS Tec.

Objetivo

A partir de los eventos de workflow del Fluig es posible efectuar la ejecución de rutinas en el Logix permitiendo el envío de parámetros y retornos de la regla de negocio para el proceso.

 

    Para realizar la ejecución de una rutina Logix a partir de un evento es necesario seguir los pasos a continuación:

    1. Utilizar el Dataset personalizado LogixExecServiceDS.
    2. Enviar los parámetros a continuación como constraints para el Dataset:
      • El código de la empresa que será utilizado en la regla de negocio;
      • Rutina del workflow que será ejecutada; y
      • Valores que se utilizarán en la ejecución de la rutina*.
    3. Recuperar el resultado de la ejecución de la rutina a través de la función estándar getValue del objeto Dataset*.

    * Los valores que se deben enviar y el resultado de la rutina obedecen el formato JSON string.

    Ejemplo
    function afterProcessFinish(processId) {
        var values, company, c1, c2, c3, dataset, result;
        //Recupera los valores del proceso.
        values = {
            "componente": {
                "cod_empresa": new String(hAPI.getCardValue("cod_empresa")),
                "cod_item_compon": new String(hAPI.getCardValue("cod_item_compon")),
                "cod_grade_compon_1_orig": new String(hAPI.getCardValue("cod_grade_compon_1_orig")),
                "cod_grade_compon_2_orig": new String(hAPI.getCardValue("cod_grade_compon_2_orig")),
                "cod_grade_compon_3_orig": new String(hAPI.getCardValue("cod_grade_compon_3_orig")),
                "cod_grade_compon_4_orig": new String(hAPI.getCardValue("cod_grade_compon_4_orig")),
                "cod_grade_compon_5_orig": new String(hAPI.getCardValue("cod_grade_compon_5_orig")),
                "acao": new String(hAPI.getCardValue("acao")),
                "cod_item_compon_dest": new String(hAPI.getCardValue("cod_item_compon_dest")),
                "cod_grade_compon_1_dest": new String(hAPI.getCardValue("cod_grade_compon_1_dest")),
                "cod_grade_compon_2_dest": new String(hAPI.getCardValue("cod_grade_compon_2_dest")),
                "cod_grade_compon_3_dest": new String(hAPI.getCardValue("cod_grade_compon_3_dest")),
                "cod_grade_compon_4_dest": new String(hAPI.getCardValue("cod_grade_compon_4_dest")),
                "cod_grade_compon_5_dest": new String(hAPI.getCardValue("cod_grade_compon_5_dest")),
                "justificativa": new String(hAPI.getCardValue("justificativa"))
            }
        };
        //Recupera el valor definido para el código de la empresa.
        company = values.componente.cod_empresa;
     
        //Convierte el objeto JSON para JSON string.
        values = JSON.stringify(values);
        log.info("[LOGIX][WFMAN002] Valores del formulario recuperados: " + values + ".");
        log.info("[LOGIX][WFMAN002] Iniciando ejecución de la rutina WFMAN002.");
        c1 = DatasetFactory.createConstraint("company", company, null, ConstraintType.MUST);
        c2 = DatasetFactory.createConstraint("fn", "wfman002_process_finish", null, ConstraintType.MUST);
        c3 = DatasetFactory.createConstraint("values", values, null, ConstraintType.MUST);
        dataset = DatasetFactory.getDataset("LogixExecServiceDS", null, [c1, c2, c3], null);
        result = service.getValue(0, "result");
        log.info("[LOGIX][WFMAN002] Rotina WFMAN002 executada, resultado enviado: " + result + ".");
        //Convierte el JSON string para objeto JSON.
        result = JSON.parse(result);
        if (result) {
            if (result.status) {
                log.info("[LOGIX][WFMAN002] " + result.msg);
            } else {
                log.error("[LOGIX][WFMAN002] No fue posible concluir el proceso: " + result.msg + ".");
            }
        }
    }
    Estándares JSON String de envío
    //Para registros maestros (objeto).
    {
        "componente": {
            "cod_empresa": "24",
            "cod_item_compon": "ÍTEM-PRUEBA",
            "cod_grade_compon_1_orig": "BLANCO",
            "cod_grade_compon_2_orig": "",
            "cod_grade_compon_3_orig": "",
            "cod_grade_compon_4_orig": "",
            "cod_grade_compon_5_orig": "",
            "acción": "1",
            "cod_item_compon_dest": "ÍTEM-PRUEBA-NUEVO",
            "cod_grade_compon_1_dest": "NEGRO",
            "cod_grade_compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
            "cod_grade_compon_4_dest": "",
            "cod_grade_compon_5_dest": "",
            "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA BLANCO PARA ÍTEM-PRUEBA-NUEVO NEGRO."
        }
    }
     
    //Para registros de detalles (listas).
    {
        "componentes": [
            {
                "cod_empresa": "24",
                "cod_item_compon": "ÍTEM-PRUEBA",
                "cod_grade_compon_1_orig": "BLANCO",
                "cod_grade_compon_2_orig": "",
                "cod_grade_compon_3_orig": "",
                "cod_grade_compon_4_orig": "",
                "cod_grade_compon_5_orig": "",
                "acción": "1",
                "cod_item_compon_dest": "ÍTEM-PRUEBA-NUEVO",
                "cod_grade_compon_1_dest": "NEGRO",
                "cod_grade_compon_2_dest": "",
                "cod_grade_compon_3_dest": "",
                "cod_grade_compon_4_dest": "",
                "cod_grade_compon_5_dest": "",
                "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA BLANCO PARA ÍTEM-PRUEBA-NUEVO NEGRO."
            },
            {
                "cod_empresa": "24",
                "cod_item_compon": "ÍTEM-PRUEBA-NUEVO",
                "cod_grade_compon_1_orig": "NEGRO",
                "cod_grade_compon_2_orig": "",
                "cod_grade_compon_3_orig": "",
                "cod_grade_compon_4_orig": "",
                "cod_grade_compon_5_orig": "",
                "acción": "1",
                "cod_item_compon_dest": "ÍTEM-PRUEBA",
                "cod_grade_compon_1_dest": "BLANCO",
                "cod_grade_compon_2_dest": "",
                "cod_grade_compon_3_dest": "",
                "cod_grade_compon_4_dest": "",
                "cod_grade_compon_5_dest": "",
                "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA-NUEVO NEGRO PARA ÍTEM-PRUEBA BLANCO."
            }
        ]
    }

    Para que sea posible la ejecución de la rutina en Logix es necesario seguir los pasos a continuación:

    1. Crear la rutina 4GL sin parámetros.
    2. Los valores enviados deben ser recuperados a través de la función _ADVPL_WfGetParameterValue.
    3. Para recuperar la cantidad de los campos filhos en los valores enviados, utilizar la función  _ADVPL_WfGetParameterLength.
    4. La función debe retornar una variable RECORD con como mínimo dos atributos*:
      • estatus: del tipo SMALLINT, deberá tener el valor TRUE o FALSE para indicar si la rutina fue ejecutada con éxito; y
      • msg: del tipo CHAR, deberá tener un corto mensaje para que la misma sea exhibida para el usuario en el archivo de LOG del Fluig o en pantalla.

    * La variable RECORD de retorno podrá tener otros atributos conforme a la necesidad del proceso.

    Ejemplo
    #-------------------------------------#
    FUNCTION wfman002_alterar_componentes()
    #-------------------------------------#
        DEFINE lr_return RECORD
                             status SMALLINT,
                             msg    CHAR(300)
                         END RECORD
        DEFINE lr_comp_orig,
               lr_comp_dest RECORD
                                cod_item_compon  LIKE estrut_grade.cod_item_compon,
                                cod_grade_comp_1 LIKE estrut_grade.cod_grade_comp_1,
                                cod_grade_comp_2 LIKE estrut_grade.cod_grade_comp_2,
                                cod_grade_comp_3 LIKE estrut_grade.cod_grade_comp_3,
                                cod_grade_comp_4 LIKE estrut_grade.cod_grade_comp_4,
                                cod_grade_comp_5 LIKE estrut_grade.cod_grade_comp_5
                            END RECORD
        DEFINE la_ítem_padre ARRAY[100] OF RECORD
                               cód_ítem_padre     LIKE estruct_grilla.cód_ítem_padre,
                               cód_grilla_1      LIKE estruct_grilla.cód_grilla_1,
                               cód_grilla_2      LIKE estruct_grilla.cód_grilla_2,
                               cód_grilla_3      LIKE estruct_grilla cód_grilla_3,
                               cód_grilla_4      LIKE estruct_grilla.cód_grilla_4,
                               cód_grilla_5      LIKE estruct_grilla.cód_grilla_5,
                               cant_necesaria   LIKE estruct_grilla.cant_necesaria,
                               fecha_validez_ini LIKE estruct_grilla.fecha_validez_ini,
                               fecha_validez_fin LIKE estruct_grilla.fecha_validez_fin,
                               num_secuencia    LIKE estruct_grilla.num_secuencia
                           END RECORD
        DEFINE l_justificación CHAR(300),
               l_acción          CHAR(001),
               l_altera_ítem   CHAR(001)
        DEFINE l_ind,
               l_ítem_ind,
               l_ítem_count SMALLINT
        IF  LOG_initApp("MANENG") > 0 THEN
            LET lr_return.status = FALSE
            LET lr_return.msg    = "Usuario ",p_user CLIPPED," sin permiso para acceder la rutina."
            RETURN lr_return
        END IF
        LET lr_comp_orig.cód_ítem_compon  = _ADVPL_WfGetParameterValue("componentes","cód_ítem_compon_orig")
        LET lr_comp_orig.cód_grilla_comp_1 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_1_orig")
        LET lr_comp_orig.cód_grilla_comp_2 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_2_orig")
        LET lr_comp_orig.cód_grilla_comp_3 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_3_orig")
        LET lr_comp_orig.cód_grilla_comp_4 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_4_orig")
        LET lr_comp_orig.cód_grilla_comp_5 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_5_orig")
        LET lr_comp_dest.cód_ítem_compon  = _ADVPL_WfGetParameterValue("componentes","cód_ítem_compon_dest")
        LET lr_comp_dest.cód_grilla_comp_1 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_1_dest")
        LET lr_comp_dest.cód_grilla_comp_2 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_2_dest")
        LET lr_comp_dest.cód_grilla_comp_3 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_3_dest")
        LET lr_comp_dest.cód_grilla_comp_4 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_4_dest")
        LET lr_comp_dest.cód_grilla_comp_5 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_5_dest")
        LET l_justificación = _ADVPL_WfGetParameterValue("componentes","justificación")
        LET l_acción          = _ADVPL_WfGetParameterValue("componentes","slct_acción")
        #Verifica los códigos de la grilla de origen.
        IF  lr_comp_orig.cód_grilla_comp_1 IS NULL THEN
            LET lr_comp_orig.cód_grade_comp_1 = " "
        END IF
        IF  lr_comp_orig.cód_grilla_comp_2 IS NULL THEN
            LET lr_comp_orig.cód_grilla_comp_2 = " "
        END IF
        IF  lr_comp_orig.cód_grilla_comp_3 IS NULL THEN
            LET lr_comp_orig.cód_grilla_comp_3 = " "
        END IF
        IF  lr_comp_orig.cód_grilla_comp_4 IS NULL THEN
            LET lr_comp_orig.cód_grilla_comp_4 = " "
        END IF
        IF  lr_comp_orig.cód_grilla_comp_5 IS NULL THEN
            LET lr_comp_orig.cód_grilla_comp_5 = " "
        END IF
        #Verifica los códigos de la grilla de destino.
        IF  lr_comp_dest.cód_grilla_comp_1 IS NULL THEN
            LET lr_comp_dest.cód_grilla_comp_1 = " "
        END IF
        IF  lr_comp_dest.cód_grilla_comp_2 IS NULL THEN
            LET lr_comp_dest.cód_grilla_comp_2 = " "
        END IF
        IF  lr_comp_dest.cód_grilla_comp_3 IS NULL THEN
            LET lr_comp_dest.cód_grilla_comp_3 = " "
        END IF
        IF  lr_comp_dest.cód_grilla_comp_4 IS NULL THEN
            LET lr_comp_dest.cód_grilla_comp_4 = " "
        END IF
        IF  lr_comp_dest.cód_grilla_comp_5 IS NULL THEN
            LET lr_comp_dest.cód_grilla_comp_5 = " "
        END IF
        LET l_ítem_ind   = 0
        LET l_ítem_count = _ADVPL_WfGetParameterLength("ítem_pai")
        FOR l_ind = 1 TO l_ítem_count
            LET l_altera_ítem = _ADVPL_WfGetParameterValue("ítem_padre","modif_ítem",l_ind)
            IF  l_modif_ítem = "S" THEN
                LET l_ítem_ind = l_ítem_ind + 1
                LET la_ítem_padre[l_ítem_ind].cód_ítem_padre     = _ADVPL_WfGetParameterValue(ítem_padre","cód_ítem_padre",l_ind)
                LET la_ítem_padre[l_ítem_ind].cód_grilla_1      = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_1",l_ind)
                LET la_ítem_padre[l_ítem_ind].cód_grilla_2      = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_2",l_ind)
                LET la_ítem_padre[l_ítem_ind].cód_grilla_3      = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_3",l_ind)
                LET la_ítem_padre[l_ítem_ind].cód_grilla_4      = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_4",l_ind)
                LET la_ítem_pai[l_ítem_ind].cód_grilla_5      = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_5",l_ind)
                LET la_ítem_padre[l_ítem_ind].cant_necesaria   = _ADVPL_WfGetParameterValue("ítem_padre","cant_necesaria",l_ind)
                LET la_ítem_padre[l_ítem_ind].fecha_validez_ini = _ADVPL_WfGetParameterValue("ítem_padre","fecha_validez_ini",l_ind)
                LET la_ítem_padre[l_ítem_ind].fecha_validez_fin = _ADVPL_WfGetParameterValue("ítem_padre","fecha_validez_fin",l_ind)
                LET la_ítem_padre[l_ítem_ind].num_secuencia    = _ADVPL_WfGetParameterValue("ítem_padre","num_secuencia",l_ind)
                #Verifica los códigos de la grilla del ítem padre.
                IF  la_ítem_padre[l_ítem_ind].cód_grilla_1 IS NULL THEN
                    LET la_ítem_padre[l_ítem_ind].cód_grilla_1 = " "
                END IF
                IF  la_ítem_padre[l_ítem_ind].cód_grilla_2 IS NULL THEN
                    LET la_ítem_padre[l_ítem_ind].cód_grilla_2 = " "
                END IF
                IF  la_ítem_padre[l_ítem_ind].cód_grilla_3 IS NULL THEN
                    LET la_ítem_padre[l_ítem_ind].cód_grilla_3 = " "
                END IF
                IF  la_ítem_padre[l_ítem_ind].cód_grilla_4 IS NULL THEN
                    LET la_ítem_padre[l_ítem_ind].cód_grilla_4 = " "
                END IF
                IF  la_ítem_padre[l_ítem_ind].cód_grilla_5 IS NULL THEN
                    LET la_ítem_padre[l_ítem_ind].cód_grilla_5 = " "
                END IF
            END IF
        END FOR
        {
            Regla de negocio 4GL.
        }
        LET lr_return.status = TRUE
        LET lr_return.msg    = "Ítem componente modificado con éxito."
        RETURN lr_return
    END FUNCTION
    Estándar JSON String de retorno
    {
        "success": true|false,
        "msg": "Mensaje retornada por la rutina."
    }
    • Sem rótulos