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_
alterar
process_
componentes
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": "",

...

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

        "cod_grade_compon_5_orig": "",
        "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_compon_
comp
3_
2 LIKE estrut_grade.cod_grade_comp_2
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_
comp_5 LIKE estrut_grade.cod_grade_comp_5
compon_2_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_orig": "",
       
LIKE estrut_grade.
     "cod_grade_
2
compon_3_orig": "",
            "cod_grade_compon_4_orig": "",
            
"cod_grade_
3 LIKE estrut_grade.cod_grade_3
compon_5_orig": "",
            "acao": "1",
            
"cod_
grade_4 LIKE estrut_grade.cod_grade_4
item_compon_dest": "ITEM-TESTE",
            "cod_grade_compon_1_dest": "BRANCO",
            
"cod_grade_
5 LIKE estrut_grade.cod_grade_5
compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
            
qtd_necessaria LIKE estrut_grade.qtd_necessaria
"cod_grade_compon_4_dest": "",
            "cod_grade_compon_5_dest": "",
            "justificativa": 
dat_validade_ini LIKE estrut_grade.dat_validade_ini,
"ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA 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
]
}
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
       
LET
 
lr_return.msg
    
=
 
"Usuário
 
",p_user
 
CLIPPED,"
 
sem
 
permissão
 
para
 
acessar
 
a
 
rotina."
    status SMALLINT,
   
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"
msg    CHAR(300)
   
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")
 END RECORD

    
LET
DEFINE lr_comp_orig
.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_orig")
,
          
LET
 lr_comp_dest
.
 RECORD
                            cod_item_compon  
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_item_compon
_dest")
,
                      
LET lr_comp_dest.
      cod_grade_comp_1 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_1
_dest")
,
               
LET lr_comp_dest.
             cod_grade_comp_2 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_2
_dest")
,
                          
LET
  
lr
cod_grade_comp_
dest
3 LIKE estrut_grade.cod_grade_comp_3
= _ADVPL_WfGetParameterValue("componentes","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
        
LET
 
lr_comp_orig.
cod_
grade
item_
comp_1
pai 
=
 
"
 
"
  LIKE 
END IF
estrut_grade.cod_item_pai,
      
IF
  
lr_comp_orig.cod_grade_comp_2
 
IS
 
NULL
 
THEN
        
LET
 
lr_comp_orig.cod_grade_comp_2
 
=
 
"
 
"
    
END IF
cod_grade_1     
IF
 LIKE 
lr
estrut_
comp_orig
grade.cod_grade_
comp_3 IS NULL THEN
1,
            
LET
 
lr_comp_orig.cod_grade_comp_3
 
=
 
"
 
"
    
END
 
IF
    
IF
  
lr_comp_orig
cod_grade_2      LIKE estrut_grade.cod_grade_
comp_4 IS NULL THEN
2,
                   
LET
 
lr_comp_orig.cod_grade_comp_4
 
=
 
"
 
"
    
END IF
cod_grade_3     
IF
 LIKE 
lr
estrut_
comp_orig
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_5 = " "
validade_fim,
           
END
 
IF
    
LET
 
l_item_ind
    
=
 
0
    
LET
 
l_item_count = _ADVPL_WfGetParameterLength("item_pai") FOR l_ind = 1 TO l_item_count
num_sequencia    LIKE estrut_grade.num_sequencia
                
LET
 
l_altera_item
 
=
 
_ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)
    END RECORD

   
IF
 DEFINE l_
altera_item = "S" THEN
justificativa CHAR(300),
           l_acao   
LET
 
l_item_ind
 
=
 
l_item_ind
 
+
 
1
  CHAR(001),
          
LET
 
la_item_pai[
l_
item
altera_
ind].cod_
item
_pai
   
= _ADVPL_WfGetParameterValue("item_pai","cod_item_pai",
CHAR(001)

    DEFINE l_ind
)
,
           
LET la
l_item_
pai[
ind,
           l_item_
ind].cod_grade_1
count SMALLINT

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

        RETURN lr_return
   
LET la_item_pai[l_item_ind]
 END IF

    LET lr_comp_orig.cod_
grade_3
item_compon  
= _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_item_
grade
compon_
3
orig"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
4
comp_1 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_
4",l_ind)
1_orig")
    LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
5
comp_2 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_
5",l_ind)
comp_2_orig")
    
LET 
la
lr_
item_pai[l_item_ind].qtd_necessaria
comp_orig.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
qtd_necessaria",l_ind)
cod_grade_comp_3_orig")
    
LET 
la
lr_
item_pai[l_item_ind].dat_validade_ini
comp_orig.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat_validade_ini",l_ind
cod_grade_comp_4_orig")
    
LET 
la
lr_
item_pai[l_item_ind].dat_validade_fim
comp_orig.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat_validade_fim",l_ind)
cod_grade_comp_5_orig")

    LET 
la
lr_
item_pai[l
comp_dest.cod_item_
ind].num_sequencia
compon  
= _ADVPL_WfGetParameterValue("
item_pai
componentes","
num_sequencia",l_ind) #Verifica os códigos da grade do item pai.
cod_item_compon_dest")
    LET lr_comp_dest.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_dest")
    LET 
IF la_item_pai[l_item_ind]
lr_comp_dest.cod_grade_
1
comp_2 
IS NULL THEN
= _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_dest")
    
LET 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_
1
comp_3 = 
" "
_ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_dest")
    
END IF IF la_item_pai[l_item_ind]
LET lr_comp_dest.cod_grade_
2
comp_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
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_
3
comp_1 IS NULL THEN
        
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_
3
1 = " "
    
END IF

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

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

    IF  lr_comp_orig.cod_grade_comp_4 IS NULL THEN
      
END
 
IF
 LET lr_comp_orig.cod_grade_comp_4 = 
END IF
" "
    END 
FOR
IF

    
{
IF  lr_comp_orig.cod_grade_comp_5 IS 
Regra de negócio 4GL.
NULL THEN
    
}
    LET lr_
return.status = TRUE
comp_orig.cod_grade_comp_5 = " "
    END 
LET lr_return.msg
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."
}