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.
Composition Setup
import.css=/download/attachments/108660318/wfLogixStyles.css

...

Nota

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

Funcionamento

Para realizar a execução de uma rotina é necessário utilizar o Dataset customizado LogixExecServiceDS passando como constraints o código da empresa que será utilizado na regra de negócio, a rotina 4GL do workflow que será executada e os valores que serão utilizados na rotina. Tanto os valores a serem enviados quanto o retorna da execução da rotina devem estar no formato JSON string.

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.

 

Deck of Cards
idEXECUCAO
historyfalse
Deck of Cards
idExemplos
effectTypefade
Card
defaulttrueidCARD_1
labelExemplo de Execução da rotina no Fluig

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
Bloco de código
themeEclipse
languagejavascript
Bloco de código
themeEclipse
languagejavascript
linenumberstrue
function afterProcessFinish(processId) {
    var values, company, c1, c2, c3, dataset, result;

    //Recupera os valores do formulárioprocesso.
    values = {
        "componentescomponente": {
            "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")),
            "slct_acao": new String(hAPI.getCardValue("slct_acao")),
            "cod_item_compon_novodest": new String(hAPI.getCardValue("cod_item_compon_novodest")),
            "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.componentescomponente.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); //Código da empresa.
    c2 = DatasetFactory.createConstraint("fn", "wfman002_alterarprocess_componentesfinish", null, ConstraintType.MUST); //Rotina 4GL.
    c3 = DatasetFactory.createConstraint("values", values, null, ConstraintType.MUST); //Valores do formulário.

    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 + ".");
        }
    }
}

Abaixo segue um evento JavaScript de exemplo para execuções de rotinas Logix.

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

Padrões JSON String de envio
Bloco de código
themeEclipse
languagejavascript
//Para registros mestres (objeto).
{
    "
componentes
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": "",
        "
slct_
acao": "1",
        "cod_item_compon_
novo
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": "",
            "
slct_
acao": "1",
            "cod_item_compon_
novo
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": "",
            "
slct_
acao": "1",
            "cod_item_compon_
novo
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."
        }
    ]
}
Card

 

A função 4gl do Logix deve ter o sufixo _wfprocess e não deve receber parâmetros. Para recuperar os valores informados deve-se utilizar a função WfGetParameterValue e o retorno deve ser uma variável RECORD com no mínimo dois atributos: status com a situação da execução da regra de negócio (verdadeiro ou falso) e msg com uma mensagem genérica. Abaixo segue um exemplo de código de uma função 4gl utilizada em um processo workflow:

labelExecução da Rotina no Logix

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
Bloco de código
themeEclipse
languagenone
#-----
Bloco de código
languagenone
linenumberstrue
#------------------
--------------------
-----# FUNCTION vdp10000_create_clientes_wfprocess() #-------------------------------------------# DEFINE lr_return RECORD
------------#
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 = 
status SMALLINT,
" "
            END IF

            
msg CHAR(300)
IF  la_item_pai[l_item_ind].cod_grade_3 IS NULL THEN
                
END RECORD   DEFINE lr_clientes RECORD
LET la_item_pai[l_item_ind].cod_grade_3 = " "
            END IF

            IF  
num
la_
cgc_cpf LIKE clientes.num_cgc_cpf,
item_pai[l_item_ind].cod_grade_4 IS NULL THEN
                
cod_cliente LIKE clientes.cod_cliente,
LET la_item_pai[l_item_ind].cod_grade_4 = " "
            END IF

           
numero
 
INTEGER
IF  la_item_pai[l_item_ind].cod_grade_5 IS NULL THEN
              
END
 
RECORD  
 
LET 
lr
la_
clientes.num_cgc_cpf = _AdvPL_WfGetParameterValue('clientes','num_cgc_cpf') LET lr_clientes.cod_cliente = _AdvPL_WfGetParameterValue('clientes','cod_cliente')   ...   LET lr_return.status = TRUE
item_pai[l_item_ind].cod_grade_5 = " "
            END IF
    
LET lr_return.msg
    END IF
   
=
 
'Cliente "',lr_clientes.cod_cliente CLIPPED,'" informado com sucesso.'  
END FOR

    {
       
RETURN
 
lr_return END FUNCTION

É possível incluir mais informações de retorno para o workflow além das duas citadas acima. Este retorno é convertido para Json e utilizado da maneira abaixo:

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
Bloco de código
themeEclipse
languagejavascript
{
    "success": true|false,
    "msg": "Mensagem retornada pela rotina."
Bloco de código
languagejavascript
firstline13
linenumberstrue
result = callLogixFunction('vdp10000_create_clientes', values); if (result) { if (result.status) { log.info('[LOGIX] ' + result.msg); } else { log.info('[LOGIX] Nao foi possivel concluir a criacao de cliente [' + result.msg + ']'); }

}