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

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

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.
 

Nota

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

Índice

  1. Execução da rotina no Fluig
    1. Padrão JSON String de envio
  2. Execução da rotina no Logix
    1. Padrão JSON String de retorno
Deck of Cards
idEXECUCAO
historyfalse
effectTypefade
Card
defaulttrue
labelExecução da rotina no Fluig

Para realizar a execução de uma rotina Logix a partir de um evento:

  • Utilize o Dataset customizado LogixExecServiceDS
  • Enviar como constraints para o Dataset:
    1. O código da empresa que será utilizado na regra de negócio;
    2. A rotina 4GL do workflow que será executada; e
    3. Os valores que serão utilizados na rotina*.
  • Recuperar o resultado a execução da rotina através da função getValue do Dataset*.

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


Bloco de código
themeEclipse
languagejavascript
titleExemplo de execução de uma rotina no Fluig
linenumberstrue
function afterProcessFinish(processId) {
    var values, company, c1, c2, c3, dataset, result;

    //Recupera os valores do processo.
    values = {
        "componentes": {
            "cod_empresa": new String(hAPI.getCardValue("cod_empresa")),
            "cod_item_compon": new String(hAPI.getCardValue("cod_item_compon")),
            "cod_grade_1_orig": new String(hAPI.getCardValue("cod_grade_1_orig")),
            "cod_grade_2_orig": new String(hAPI.getCardValue("cod_grade_2_orig")),
            "cod_grade_3_orig": new String(hAPI.getCardValue("cod_grade_3_orig")),
            "cod_grade_4_orig": new String(hAPI.getCardValue("cod_grade_4_orig")),
            "cod_grade_5_orig": new String(hAPI.getCardValue("cod_grade_5_orig")),
            "slct_acao": new String(hAPI.getCardValue("slct_acao")),
            "cod_item_compon_novo": new String(hAPI.getCardValue("cod_item_compon_novo")),
            "cod_grade_1_dest": new String(hAPI.getCardValue("cod_grade_1_dest")),
            "cod_grade_2_dest": new String(hAPI.getCardValue("cod_grade_2_dest")),
            "cod_grade_3_dest": new String(hAPI.getCardValue("cod_grade_3_dest")),
            "cod_grade_4_dest": new String(hAPI.getCardValue("cod_grade_4_dest")),
            "cod_grade_5_dest": new String(hAPI.getCardValue("cod_grade_5_dest")),
            "justificativa": new String(hAPI.getCardValue("justificativa"))
        }
    };

    //Recupera o valor definido para o código da empresa.
    company = values.componentes.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 + ".");
        }
    }
}
Card
labelExecução da Rotina no Logix

Para que seja possível a execução da rotina no Logix algumas regras devem ser seguidas:

  1. A função 4GL não poderá receber parâmetros.
  2. Os valores do processo devem ser recuperados através da função _ADVPL_WfGetParameterValue.
  3. A função deve retornar uma RECORD com no mínimo 2 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.

 

Bloco de código
themeEclipse
languagenone
titleExemplo de execução de uma rotina no Logix
linenumberstrue
#-------------------------------------#
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

O JSON string enviado para a o Dataset deve seguir os padrões abaixo:

Bloco de código
themeEclipse
languagejavascript
//Para registros mestres (objeto).
{
    "componentes": {
        "cod_empresa": "24",
        "cod_item_compon": "ITEM-TESTE",
        "cod_grade_1_orig": "BRANCO",
        "cod_grade_2_orig": "",
        "cod_grade_3_orig": "",
        "cod_grade_4_orig": "",
        "cod_grade_5_orig": "",
        "slct_acao": "1",
        "cod_item_compon_novo": "ITEM-TESTE-NOVO",
        "cod_grade_1_dest": "PRETO",
        "cod_grade_2_dest": "",
        "cod_grade_3_dest": "",
        "cod_grade_4_dest": "",
        "cod_grade_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_1_orig": "BRANCO",
            "cod_grade_2_orig": "",
            "cod_grade_3_orig": "",
            "cod_grade_4_orig": "",
            "cod_grade_5_orig": "",
            "slct_acao": "1",
            "cod_item_compon_novo": "ITEM-TESTE-NOVO",
            "cod_grade_1_dest": "PRETO",
            "cod_grade_2_dest": "",
            "cod_grade_3_dest": "",
            "cod_grade_4_dest": "",
            "cod_grade_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_1_orig": "PRETO",
            "cod_grade_2_orig": "",
            "cod_grade_3_orig": "",
            "cod_grade_4_orig": "",
            "cod_grade_5_orig": "",
            "slct_acao": "1",
            "cod_item_compon_novo": "ITEM-TESTE",
            "cod_grade_1_dest": "BRANCO",
            "cod_grade_2_dest": "",
            "cod_grade_3_dest": "",
            "cod_grade_4_dest": "",
            "cod_grade_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA ITEM-TESTE BRANCO."
        }
    ]
}