Páginas filhas
  • 4.2. Execução de rotinas

As rotinas são executadas via Web Services, portanto é necessário que estas execuções estejam ligadas e configuradas no servidor TOTVS Tec.

Objetivo

A partir dos eventos de workflow do Fluig é possível efetuar a execução de rotinas no Logix permitindo envio de parâmetros e retornos da regra de negócio para o processo.

 

    Para realizar a execução de uma rotina Logix a partir de um evento é necessário seguir os passos abaixo:

    1. Utilizar o Dataset customizado LogixExecServiceDS.
    2. Enviar os parâmetros abaixo como constraints para o Dataset:
      • Código da empresa que será utilizado na regra de negócio;
      • Rotina do workflow que será executada; e
      • Valores que serão utilizados na execução da rotina*.
    3. Recuperar o resultado da execução da rotina através da função padrão getValue do objeto Dataset*.

    * Os valores que devem ser enviados e o resultado da rotina obedecem o formato JSON string.

    Exemplo
    function afterProcessFinish(processId) {
        var values, company, c1, c2, c3, dataset, result;
    
        //Recupera os valores do processo.
        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 o valor definido para o código da empresa.
        company = values.componente.cod_empresa;
     
        //Converte o objeto JSON para JSON string.
        values = JSON.stringify(values);
    
        log.info("[LOGIX][WFMAN002] Valores do formulario recuperados: " + values + ".");
        log.info("[LOGIX][WFMAN002] Iniciando execucao da rotina 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 + ".");
    
        //Converte o 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] Nao foi possivel concluir o processo: " + result.msg + ".");
            }
        }
    }
    Padrões JSON String de envio
    //Para registros mestres (objeto).
    {
        "componente": {
            "cod_empresa": "24",
            "cod_item_compon": "ITEM-TESTE",
            "cod_grade_compon_1_orig": "BRANCO",
            "cod_grade_compon_2_orig": "",
            "cod_grade_compon_3_orig": "",
            "cod_grade_compon_4_orig": "",
            "cod_grade_compon_5_orig": "",
            "acao": "1",
            "cod_item_compon_dest": "ITEM-TESTE-NOVO",
            "cod_grade_compon_1_dest": "PRETO",
            "cod_grade_compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
            "cod_grade_compon_4_dest": "",
            "cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
        }
    }
     
    //Para registros de detalhes (listas).
    {
        "componentes": [
            {
                "cod_empresa": "24",
                "cod_item_compon": "ITEM-TESTE",
                "cod_grade_compon_1_orig": "BRANCO",
                "cod_grade_compon_2_orig": "",
                "cod_grade_compon_3_orig": "",
                "cod_grade_compon_4_orig": "",
                "cod_grade_compon_5_orig": "",
                "acao": "1",
                "cod_item_compon_dest": "ITEM-TESTE-NOVO",
                "cod_grade_compon_1_dest": "PRETO",
                "cod_grade_compon_2_dest": "",
                "cod_grade_compon_3_dest": "",
                "cod_grade_compon_4_dest": "",
                "cod_grade_compon_5_dest": "",
                "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
            },
            {
                "cod_empresa": "24",
                "cod_item_compon": "ITEM-TESTE-NOVO",
                "cod_grade_compon_1_orig": "PRETO",
                "cod_grade_compon_2_orig": "",
                "cod_grade_compon_3_orig": "",
                "cod_grade_compon_4_orig": "",
                "cod_grade_compon_5_orig": "",
                "acao": "1",
                "cod_item_compon_dest": "ITEM-TESTE",
                "cod_grade_compon_1_dest": "BRANCO",
                "cod_grade_compon_2_dest": "",
                "cod_grade_compon_3_dest": "",
                "cod_grade_compon_4_dest": "",
                "cod_grade_compon_5_dest": "",
                "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA ITEM-TESTE BRANCO."
            }
        ]
    }

    Para que seja possível a execução da rotina no Logix é necessário seguir os passos abaixo:

    1. Criar a rotina 4GL sem parâmetros.
    2. Os valores enviados devem ser recuperados através da função _ADVPL_WfGetParameterValue.
    3. Para recuperar a quantidade dos campos filhos nos valores enviados, utilizar a função  _ADVPL_WfGetParameterLength.
    4. A função deve retornar uma variável RECORD com no mínimo dois atributos*:
      • status: do tipo SMALLINT, deverá ter o valor TRUE ou FALSE para indicar se a rotina foi executada com sucesso; e
      • msg: do tipo CHAR, deverá ter uma curta mensagem para que a mesma seja exibida para o usuário no arquivo de LOG do Fluig ou em tela.

    * A variável RECORD de retorno poderá ter outros atributos conforme necessidade do processo.

    Exemplo
    #-------------------------------------#
    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_item_pai ARRAY[100] OF RECORD
                               cod_item_pai     LIKE estrut_grade.cod_item_pai,
                               cod_grade_1      LIKE estrut_grade.cod_grade_1,
                               cod_grade_2      LIKE estrut_grade.cod_grade_2,
                               cod_grade_3      LIKE estrut_grade.cod_grade_3,
                               cod_grade_4      LIKE estrut_grade.cod_grade_4,
                               cod_grade_5      LIKE estrut_grade.cod_grade_5,
                               qtd_necessaria   LIKE estrut_grade.qtd_necessaria,
                               dat_validade_ini LIKE estrut_grade.dat_validade_ini,
                               dat_validade_fim LIKE estrut_grade.dat_validade_fim,
                               num_sequencia    LIKE estrut_grade.num_sequencia
                           END RECORD
    
        DEFINE l_justificativa CHAR(300),
               l_acao          CHAR(001),
               l_altera_item   CHAR(001)
    
        DEFINE l_ind,
               l_item_ind,
               l_item_count SMALLINT
    
        IF  LOG_initApp("MANENG") > 0 THEN
            LET lr_return.status = FALSE
            LET lr_return.msg    = "Usuário ",p_user CLIPPED," sem permissão para acessar a rotina."
    
            RETURN lr_return
        END IF
    
        LET lr_comp_orig.cod_item_compon  = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_orig")
        LET lr_comp_orig.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_orig")
        LET lr_comp_orig.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_orig")
        LET lr_comp_orig.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_orig")
        LET lr_comp_orig.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_4_orig")
        LET lr_comp_orig.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_orig")
    
        LET lr_comp_dest.cod_item_compon  = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_dest")
        LET lr_comp_dest.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_dest")
        LET lr_comp_dest.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_dest")
        LET lr_comp_dest.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_dest")
        LET lr_comp_dest.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_4_dest")
        LET lr_comp_dest.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_dest")
    
        LET l_justificativa = _ADVPL_WfGetParameterValue("componentes","justificativa")
        LET l_acao          = _ADVPL_WfGetParameterValue("componentes","slct_acao")
    
        #Verifica os códigos da grade de origem.
        IF  lr_comp_orig.cod_grade_comp_1 IS NULL THEN
            LET lr_comp_orig.cod_grade_comp_1 = " "
        END IF
    
        IF  lr_comp_orig.cod_grade_comp_2 IS NULL THEN
            LET lr_comp_orig.cod_grade_comp_2 = " "
        END IF
    
        IF  lr_comp_orig.cod_grade_comp_3 IS NULL THEN
            LET lr_comp_orig.cod_grade_comp_3 = " "
        END IF
    
        IF  lr_comp_orig.cod_grade_comp_4 IS NULL THEN
            LET lr_comp_orig.cod_grade_comp_4 = " "
        END IF
    
        IF  lr_comp_orig.cod_grade_comp_5 IS NULL THEN
            LET lr_comp_orig.cod_grade_comp_5 = " "
        END IF
    
        #Verifica os códigos da grade de destino.
        IF  lr_comp_dest.cod_grade_comp_1 IS NULL THEN
            LET lr_comp_dest.cod_grade_comp_1 = " "
        END IF
    
        IF  lr_comp_dest.cod_grade_comp_2 IS NULL THEN
            LET lr_comp_dest.cod_grade_comp_2 = " "
        END IF
    
        IF  lr_comp_dest.cod_grade_comp_3 IS NULL THEN
            LET lr_comp_dest.cod_grade_comp_3 = " "
        END IF
    
        IF  lr_comp_dest.cod_grade_comp_4 IS NULL THEN
            LET lr_comp_dest.cod_grade_comp_4 = " "
        END IF
    
        IF  lr_comp_dest.cod_grade_comp_5 IS NULL THEN
            LET lr_comp_dest.cod_grade_comp_5 = " "
        END IF
    
        LET l_item_ind   = 0
        LET l_item_count = _ADVPL_WfGetParameterLength("item_pai")
    
        FOR l_ind = 1 TO l_item_count
            LET l_altera_item = _ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)
    
            IF  l_altera_item = "S" THEN
                LET l_item_ind = l_item_ind + 1
    
                LET la_item_pai[l_item_ind].cod_item_pai     = _ADVPL_WfGetParameterValue("item_pai","cod_item_pai",l_ind)
                LET la_item_pai[l_item_ind].cod_grade_1      = _ADVPL_WfGetParameterValue("item_pai","cod_grade_1",l_ind)
                LET la_item_pai[l_item_ind].cod_grade_2      = _ADVPL_WfGetParameterValue("item_pai","cod_grade_2",l_ind)
                LET la_item_pai[l_item_ind].cod_grade_3      = _ADVPL_WfGetParameterValue("item_pai","cod_grade_3",l_ind)
                LET la_item_pai[l_item_ind].cod_grade_4      = _ADVPL_WfGetParameterValue("item_pai","cod_grade_4",l_ind)
                LET la_item_pai[l_item_ind].cod_grade_5      = _ADVPL_WfGetParameterValue("item_pai","cod_grade_5",l_ind)
                LET la_item_pai[l_item_ind].qtd_necessaria   = _ADVPL_WfGetParameterValue("item_pai","qtd_necessaria",l_ind)
                LET la_item_pai[l_item_ind].dat_validade_ini = _ADVPL_WfGetParameterValue("item_pai","dat_validade_ini",l_ind)
                LET la_item_pai[l_item_ind].dat_validade_fim = _ADVPL_WfGetParameterValue("item_pai","dat_validade_fim",l_ind)
                LET la_item_pai[l_item_ind].num_sequencia    = _ADVPL_WfGetParameterValue("item_pai","num_sequencia",l_ind)
    
                #Verifica os códigos da grade do item pai.
                IF  la_item_pai[l_item_ind].cod_grade_1 IS NULL THEN
                    LET la_item_pai[l_item_ind].cod_grade_1 = " "
                END IF
    
                IF  la_item_pai[l_item_ind].cod_grade_2 IS NULL THEN
                    LET la_item_pai[l_item_ind].cod_grade_2 = " "
                END IF
    
                IF  la_item_pai[l_item_ind].cod_grade_3 IS NULL THEN
                    LET la_item_pai[l_item_ind].cod_grade_3 = " "
                END IF
    
                IF  la_item_pai[l_item_ind].cod_grade_4 IS NULL THEN
                    LET la_item_pai[l_item_ind].cod_grade_4 = " "
                END IF
    
                IF  la_item_pai[l_item_ind].cod_grade_5 IS NULL THEN
                    LET la_item_pai[l_item_ind].cod_grade_5 = " "
                END IF
            END IF
        END FOR
    
        {
            Regra de negócio 4GL.
        }
    
        LET lr_return.status = TRUE
        LET lr_return.msg    = "Item componente alterado com sucesso."
    
        RETURN lr_return
    END FUNCTION
    Padrão JSON String de retorno
    {
        "success": true|false,
        "msg": "Mensagem retornada pela rotina."
    }
    • Sem rótulos