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.

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.

 

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
  2. Execução da rotina no Logix

...

Deck of Cards
idEXECUCAO
historyfalse
effectTypefade
Card
defaulttrue
label

...

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

...

  1. 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*.
  1. Recuperar o resultado

...

  1. da execução da rotina através da função padrão getValue

...

Exemplo de execução de uma rotina no Fluig
  1.  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
title
linenumberstrue
function afterProcessFinish(processId) {
    var values, company, c1, c2, c3, dataset, result;

    //Recupera os valores do processo.
    values = {
        "
componentes
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")),
            "
slct_
acao": new String(hAPI.getCardValue("
slct_
acao")),
            "cod_item_compon_
novo
dest": new String(hAPI.getCardValue("cod_item_compon_
novo
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.
componentes
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
Bloco de código
themeEclipse
languagejavascript
//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": "",

...

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

        "acao": "1",
        
status SMALLINT
"cod_item_compon_dest": "ITEM-TESTE-NOVO",
        "cod_grade_compon_1_dest": "PRETO",
        "cod_grade_compon_2_dest": "",
       
msg CHAR(300)
 "cod_grade_compon_3_dest": "",
        "cod_grade_compon_4_dest": "",
        
"cod_grade_compon_5_dest": "",
  
END
 
RECORD
    
DEFINE lr_comp_orig, lr_comp_dest RECORD
 "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
    }
}
 
//Para registros de detalhes (listas).
{
    "componentes": [
        {
            "cod_
item_compon LIKE estrut_grade.cod_item_compon
empresa": "24",
            "cod_item_compon": "ITEM-TESTE",
            
"cod_grade_
comp
compon_1
LIKE estrut_grade.cod_grade_comp_1
_orig": "BRANCO",
            "cod_grade_compon_2_orig": "",
            
"cod_grade_
comp_2 LIKE estrut_grade.cod_grade_comp_2
compon_3_orig": "",
            "cod_grade_compon_4_orig": "",
            
"cod_grade_compon_
comp
5_
3 LIKE estrut_grade.cod_grade_comp_3
orig": "",
            "acao": "1",
            
"cod_
grade
item_
comp
compon_
4 LIKE estrut_grade.cod_grade_comp_4
dest": "ITEM-TESTE-NOVO",
            "cod_grade_compon_1_dest": "PRETO",
            
"cod_grade_compon_
comp
2_
5 LIKE estrut_grade.cod_grade_comp_5
dest": "",
            "cod_grade_compon_3_dest": "",
           
END RECORD
 "cod_grade_compon_4_dest": "",
    
DEFINE
 
la_item_pai
 
ARRAY[100]
 
OF
 
RECORD
    "cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
  
cod_item_pai
     
LIKE estrut_grade.cod_item_pai
 },
        {
            "cod_empresa": "24",
     
cod_grade_1
      
LIKE
 
estrut_grade.
"cod_
grade_1
item_compon": "ITEM-TESTE-NOVO",
            "cod_grade_compon_1_orig": "PRETO",
            
"cod_grade_compon_2
LIKE estrut_grade.cod_grade_2
_orig": "",
            
"cod_grade_compon_3_orig": "",
            
"cod_grade
_3
_compon_4_orig": "",
           
LIKE
 
estrut
"cod_grade
.cod
_compon_
grade_3
5_orig": "",
            "acao": "1",
            
"cod_item_
grade_4
compon_dest": "ITEM-TESTE",
       
LIKE estrut_grade.
     "cod_grade_
4
compon_1_dest": "BRANCO",
            "cod_grade_compon_2_dest": "",
            
"cod_grade_
5 LIKE estrut_grade.cod_grade_5
compon_3_dest": "",
            "cod_grade_compon_4_dest": "",
            
qtd_necessaria LIKE estrut_grade.qtd_necessaria
"cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA 
dat_validade_ini LIKE estrut_grade.dat_validade_ini,
ITEM-TESTE BRANCO."
        }
    
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.
]
}
Card
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
#-------------------------------------#
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 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp
_1_dest")
_1,
                           
LET
 
lr_comp_dest.
cod_grade_comp_2 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_2
_dest")
,
                           
LET
 
lr_comp_dest.
cod_grade_comp_3 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_3
_dest")
,
                        
LET lr_comp_dest.
    cod_grade_comp_4 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_4
_dest")
,
                 
LET lr_comp_dest.
           cod_grade_comp_5 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_5
_dest")

           
LET
 
l_justificativa
 
=
 
_ADVPL_WfGetParameterValue("componentes","justificativa")
    
LET
 
l_acao
     END RECORD

    
=
DEFINE la_
ADVPL_WfGetParameterValue("componentes","slct_acao")
item_pai ARRAY[100] OF RECORD
         
#Verifica
 
os
 
códigos
 
da
 
grade
 
de
 
origem.
    
IF
  
lr_comp_orig.cod_grade_comp_1
 
IS
 
NULL
 
THEN
   cod_item_pai     
LET
LIKE 
lr
estrut_
comp_orig
grade.cod_
grade_comp_1 = " "
item_pai,
               
END
 
IF
    
IF
  
lr_comp_orig.cod_grade_comp_2
 
IS
 
NULL
 
THEN
  cod_grade_1      
LET
LIKE 
lr
estrut_
comp_orig
grade.cod_grade_
comp_2 = " "
1,
        
END
 
IF
    
IF
  
lr_comp_orig.cod_grade_comp_3
 
IS
 
NULL
 
THEN
        
LET
 
lr_comp_orig.
cod_grade_
comp_3
2 
=
 
"
 
"
   
END IF IF lr_comp_orig
LIKE estrut_grade.cod_grade_
comp_4 IS NULL THEN
2,
            
LET
 
lr_comp_orig.cod_grade_comp_4
 
=
 
"
 
"
    
END
 
IF
    
IF
  
lr_comp_orig
cod_grade_3      LIKE estrut_grade.cod_grade_
comp_5 IS NULL THEN
3,
          
LET
 
lr_comp_orig.cod_grade_comp_5
 
=
 
"
 
"
    
END
 
IF
    
#Verifica
 
os
 
códigos
 
da
 cod_grade_4 
de
 
destino.
    
IF
LIKE 
lr_comp_dest
estrut_grade.cod_grade_
comp_1 IS NULL THEN
4,
            
LET
 
lr_comp_dest.cod_grade_comp_1
 
=
 
"
 
"
    
END
 
IF
    
IF
  
lr_comp_dest.
cod_grade_
comp_2 IS NULL THEN
5      LIKE 
LET lr_comp_dest
estrut_grade.cod_grade_
comp_2 = " "
5,
        
END
 
IF
    
IF
  
lr_comp_dest.cod_grade_comp_3
 
IS
 
NULL
 
THEN
        
LET
 
lr_comp_dest.cod_grade_comp_3 = " "
qtd_necessaria   LIKE estrut_grade.qtd_necessaria,
          
END
 
IF
    
IF
  
lr_comp_dest.cod_grade_comp_4
 
IS
 
NULL
 
THEN
       dat_validade_ini 
LET
LIKE 
lr
estrut_
comp_dest
grade.
cod
dat_
grade_comp_4 = " "
validade_ini,
        
END
 
IF
    
IF
  
lr_comp_dest.cod_grade_comp_5
 
IS
 
NULL
 
THEN
        
LET
 
lr
dat_
comp_dest.cod
validade_fim LIKE estrut_grade.dat_
comp
validade_
5
fim,
 
=
 
"
 
"
    
END
 
IF
    
LET l_item_ind
   
= 0
    
LET
 
l_item_count
 
=
 
_ADVPL_WfGetParameterLength("item_pai")
    
FOR
 
l
num_
ind
sequencia  
=
 
1
 
TO
LIKE 
l
estrut_
item
grade.num_
count
sequencia
        
LET
  
l_altera_item
 
=
 
_ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)
        
IF
  
l_altera_item
 
= "S" THEN
END RECORD

    DEFINE l_justificativa CHAR(300),
       
LET
  
l_item_ind
 
=
 l_
item_ind
acao 
+
 
1
        CHAR(001),
    
LET
 
la_item_pai[l_item_ind].cod_item_pai
     
=
 
_ADVPL_WfGetParameterValue("item_pai","cod_item_pai",l_ind)
l_altera_item   CHAR(001)

    DEFINE l_ind,
   
LET
 
la_item_pai[l_item_ind].cod_grade_1
      
=
 l_
ADVPL_WfGetParameterValue("
item_
pai","cod_grade_1",l_ind)
ind,
           
LET la_item_pai[
l_item_
ind].cod_grade_2
count SMALLINT

    IF 
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_2",l_ind)
 LOG_initApp("MANENG") > 0 THEN
        LET lr_return.status = FALSE
        LET 
la_item_pai[l_item_ind].cod_grade_3
lr_return.msg    = 
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_3",l_ind)
"Usuário ",p_user CLIPPED," sem permissão para acessar a rotina."

        RETURN lr_return
    END IF

    LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_
grade_4
item_compon  = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_
grade
item_compon_
4
orig"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_
grade_5
grade_comp_1 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_1_
5
orig"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind].qtd_necessaria
comp_orig.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
qtd_necessaria",l_ind
cod_grade_comp_2_orig")
    
LET 
la_item_pai[l_item_ind].dat_validade_ini
lr_comp_orig.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat_validade_ini",l_ind
cod_grade_comp_3_orig")
    
LET 
la
lr_
item_pai[l_item_ind].dat_validade_fim
comp_orig.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat
cod_grade_
validade_fim",l_ind)
comp_4_orig")
    
LET 
la
lr_
item_pai[l_item_ind].num_sequencia
comp_orig.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
num_sequencia",l_ind
cod_grade_comp_5_orig")

    
#Verifica os códigos da grade do item pai.
LET lr_comp_dest.cod_item_compon  = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_dest")
    LET 
IF la_item_pai[l_item_ind]
lr_comp_dest.cod_grade_comp_1 
IS NULL THEN
= _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_dest")
    
LET la_item_pai[l_item_ind]
LET lr_comp_dest.cod_grade_
1
comp_2 = 
" "
_ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_dest")
    LET lr_comp_dest.cod_grade_comp_3 
END IF
= _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_dest")
    LET 
IF la_item_pai[l_item_ind]
lr_comp_dest.cod_grade_comp_
2
4 
IS NULL THEN
= _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 
la_item_pai[
l_
item_ind].cod_grade_2
justificativa = 
" "
_ADVPL_WfGetParameterValue("componentes","justificativa")
    LET l_acao          
END IF
= _ADVPL_WfGetParameterValue("componentes","slct_acao")

    #Verifica os códigos da grade de origem.
    IF  
la_item_pai[l_item_ind]
lr_comp_orig.cod_grade_comp_
3
1 IS NULL THEN
        
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
3
comp_1 = " "
    
END IF

    
IF  
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
4
comp_2 IS NULL THEN
        
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_
4
2 = " "
    
END IF

    IF  
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
5
comp_3 IS NULL THEN
        LET lr_comp_orig.cod_grade_comp_3 = " "
    END IF

    IF 
LET
 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
5
comp_4 
=
IS 
"
NULL 
"
THEN
        LET lr_comp_orig.cod_grade_comp_4 = " 
END IF
"
    
END IF
END FOR

    
{
IF  lr_comp_orig.cod_grade_comp_5 IS 
Regra de negócio 4GL.
NULL THEN
    
}
    LET lr_
return.status
comp_orig.cod_grade_comp_5 = " 
TRUE
"
    
LET lr_return.msg
END IF

    #Verifica 
=
os 
"Item
códigos 
componente
da 
alterado
grade 
com
de 
sucesso
destino.
"

   
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:

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 + ']');
	}
}

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": {
 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
        
"cod_empresa": "24",
LET lr_comp_dest.cod_grade_comp_3 = " "
    
"cod_item_compon": "ITEM-TESTE",
END IF

    IF  
"
lr_comp_dest.cod_grade_
1_orig": "BRANCO",
comp_4 IS NULL THEN
        
"
LET lr_comp_dest.cod_grade_
2_orig":
comp_4 = " "
",

    END IF

  
"
  IF  lr_comp_dest.cod_grade_
3_orig": "",
comp_5 IS NULL THEN
        
"
LET lr_comp_dest.cod_grade_
4_orig":
comp_5 = " "
",

    END IF

    LET 
"cod
l_
grade_5_orig": "",
item_ind   = 0
    LET 
"slct_acao": "1",
l_item_count = _ADVPL_WfGetParameterLength("item_pai")

    FOR l_ind = 1 
"cod
TO l_item_
compon_novo": "ITEM-TESTE-NOVO",
count
        LET l_altera_item = 
"cod
_
grade_1_dest": "PRETO",
ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)

        IF  
"cod
l_
grade_2_dest":
altera_item = "
",
S" THEN
            LET 
"cod_grade_3_dest": "",
l_item_ind = l_item_ind + 1

        
"
    LET la_item_pai[l_item_ind].cod_
grade_4_dest": "",
item_pai     
= _ADVPL_WfGetParameterValue("item_pai","cod_
grade_5_dest": "",
item_pai",l_ind)
        
"justificativa":
 
"ALTERACAO
 
DO
 
COMPONENTE
 
ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
LET la_item_pai[l_item_ind].cod_grade_1    
} }   //Para
 
registros
 
de detalhes (listas). { "componentes": [
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_1",l_ind)
        
{
    LET la_item_pai[l_item_ind].cod_grade_2      = _ADVPL_WfGetParameterValue("
cod
item_
empresa
pai"
: "24
,"cod_grade_2",l_ind)
            LET la_item_pai[l_item_ind].cod_grade_3      
"cod_item_compon": "ITEM-TESTE",
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_3",l_ind)
            
"
LET la_item_pai[l_item_ind].cod_grade_
1_orig": "BRANCO",
4      
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_
2_orig": "
4",l_ind)
            
"
LET la_item_pai[l_item_ind].cod_grade_
3_orig": "",
5      
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_
4_orig": "",
5",l_ind)
            
"cod_grade_5_orig": "",
LET la_item_pai[l_item_ind].qtd_necessaria   
"slct_acao": "1",
= _ADVPL_WfGetParameterValue("item_pai","qtd_necessaria",l_ind)
            
"cod
LET la_item_pai[l_item
_compon_novo": "ITEM-TESTE-NOVO",
_ind].dat_validade_ini = _ADVPL_WfGetParameterValue("item_pai","dat_validade_ini",l_ind)
            LET la_item_pai[l_item_ind].dat_validade_fim = 
"cod
_
grade_1_dest": "PRETO",
ADVPL_WfGetParameterValue("item_pai","dat_validade_fim",l_ind)
            LET la_item_pai[l_item_ind].num_sequencia    = 
"cod
_
grade_2_dest": "",
ADVPL_WfGetParameterValue("item_pai","num_sequencia",l_ind)

            
"cod_grade_3_dest": "",
#Verifica os códigos da grade do item pai.
            IF  
"
la_item_pai[l_item_ind].cod_grade_
4_dest": "",
1 IS NULL THEN
              
"
  LET la_item_pai[l_item_ind].cod_grade_
5_dest":
1 = " "
",

            
"justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO." },
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 = 
"cod_empresa
"
:
 "
24",

            
"cod_item_compon": "ITEM-TESTE-NOVO",
END IF

            
"
IF  la_item_pai[l_item_ind].cod_grade_
1_orig": "PRETO",
3 IS NULL THEN
                
"
LET la_item_pai[l_item_ind].cod_grade_
2_orig":
3 = " "
",

            
"cod_grade_3_orig": "",
END IF

            IF  
"
la_item_pai[l_item_ind].cod_grade_4
_orig": "",
 IS NULL THEN
            
"
    LET la_item_pai[l_item_ind].cod_grade_
5_orig":
4 = " "
",

            
"slct_acao": "1",
END IF

            
"cod
IF  la_item_pai[l_item_
compon_novo": "ITEM-TESTE",
ind].cod_grade_5 IS NULL THEN
             
"
   LET la_item_pai[l_item_ind].cod_grade_
1_dest":
5 = " "
BRANCO",

          
"cod_grade_2_dest": "",
  END IF
        END IF
   
"cod_grade_3_dest": "",
 END FOR

    {
       
"cod_grade_4_dest": "",
 Regra de negócio 4GL.
    }

    LET lr_return.status = TRUE
  
"cod_grade_5_dest":
 
"",
 LET lr_return.msg    = "Item componente alterado com 
"justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA ITEM-TESTE BRANCO." } ]
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."
}