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.

Í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

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
effectTypefade
Card
defaulttrue
labelExecuçã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:

Utilize
  1. Utilizar o Dataset customizado LogixExecServiceDS.
  2. Enviar os parâmetros abaixo como constraints para o Dataset:
O código
    • Código da empresa que será utilizado na regra de negócio;
A rotina 4GL
    • Rotina do workflow que será executada; e
Os valores
    • Valores que serão utilizados na execução da rotina*.
  1. Recuperar o resultado
a
  1. da execução da rotina através da
função 
  1. 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
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 = {
        "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);
    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 + ".");
        }
    }
}

 

Execuçã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.

Padrões JSON String de envio
Bloco de código
themeEclipse
languagejavascript
//Para registros mestres (objeto).
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 = {
"componente": {
        "cod_empresa": "24",
        "
componentes
cod_item_compon": 
{
"ITEM-TESTE",
        
"cod
_empresa
_grade_compon_1_orig": 
new String(hAPI.getCardValue("cod_empresa"))
"BRANCO",
        
"
"cod_
item
grade_compon_2_orig":
new
 
String(hAPI.getCardValue(
"
cod_item_compon
"
))
,
        
"cod_grade_
1
compon_3_orig":
new
 
String(hAPI.getCardValue(
"
cod_grade_1_orig
"
))
,
        
"cod_grade_compon_
2
4_orig":
new
 
String(hAPI.getCardValue(
"
cod_grade_2_orig
"
))
,
        
"cod_grade_compon_
3
5_orig": 
new String(hAPI.getCardValue("cod_grade_3_orig"))
"",
        "acao": "1",
        
"cod_
grade
item_
4
compon_
orig
dest": 
new String(hAPI.getCardValue("cod_grade_4_orig"))
"ITEM-TESTE-NOVO",
        
"cod_grade_compon_
5
1_
orig
dest": 
new String(hAPI.getCardValue("cod_grade_5_orig"))
"PRETO",
        
"slct_acao": new String(hAPI.getCardValue("slct_acao"))
"cod_grade_compon_2_dest": "",
        
"cod_
item
grade_compon_3_
novo
dest": 
new String(hAPI.getCardValue(
"
cod_item_compon_novo
"
))
,
        "cod_grade_compon_
1
4_dest": 
new String(hAPI.getCardValue(
"
cod_grade_1_dest
"
))
,
        
"cod_grade_
2
compon_5_dest": 
new String(hAPI.getCardValue("cod_grade_2_dest"))
"",
        "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE 
"cod_grade_3_dest": new String(hAPI.getCardValue("cod_grade_3_dest")),
BRANCO PARA ITEM-TESTE-NOVO PRETO."
    }
}
 
//Para registros de detalhes (listas).
{
    "
cod_grade_4_dest": new String(hAPI.getCardValue("cod_grade_4_dest")),
componentes": [
        {
            "cod_
grade_5_dest
empresa":
new
 
String(hAPI.getCardValue("cod_grade_5_dest"))
"24",
            "
justificativa
cod_item_compon":
new
 
String(hAPI.getCardValue("justificativa"))
"ITEM-TESTE",
        
}
    
};
"cod_grade_compon_1_orig": "BRANCO",
     
//Recupera
 
o
 
valor
 
definido
 
para
 
o
 
código da empresa.
 "cod_grade_compon_2_orig": "",
      
company
 
=
 
values.componentes.cod_empresa;  
    
//Converte o objeto JSON para JSON string.
"cod_grade_compon_3_orig": "",
         
values
 
= JSON.stringify(values);
  "cod_grade_compon_4_orig": "",
    
log.info("[LOGIX][WFMAN002]
 
Valores
 
do
 
formulario
 
recuperados:
 
"
 
+
 
values +
 "cod_grade_compon_5_orig": "
.
"
);
,
    
log.info("[LOGIX][WFMAN002]
 
Iniciando
 
execucao
 
da
 
rotina
 
WFMAN002.");
   
c1 = DatasetFactory.createConstraint("company", company, null, ConstraintType.MUST);
"acao": "1",
         
c2
 
=
 
DatasetFactory.createConstraint("fn",
 "
wfman002
cod_item_
process
compon_
finish
dest"
, null, ConstraintType.MUST); c3 = DatasetFactory.createConstraint("values", values, null, ConstraintType.MUST);
: "ITEM-TESTE-NOVO",
          
dataset
 
=
 
DatasetFactory.getDataset("LogixExecServiceDS", null, [c1, c2, c3], null);
"cod_grade_compon_1_dest": "PRETO",
          
result
 
= service.getValue(0, "result"); log.info("[LOGIX][WFMAN002] Rotina WFMAN002 executada, resultado enviado: " + result + ".");
 "cod_grade_compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
    
//Converte
 
o
 
JSON
 
string
 
para
 
objeto JSON.
   
result = JSON.parse(result);
"cod_grade_compon_4_dest": "",
      
if
 
(result)
 
{
    "cod_grade_compon_5_dest": "",
   
if
 
(result.status)
 
{
       "justificativa": "ALTERACAO DO COMPONENTE 
log.info("[LOGIX][WFMAN002] " + result.msg);
ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
        }
else
,
 
{
       {
     
log.error("[LOGIX][WFMAN002]
 
Nao
 
foi
 
possivel
 
concluir
 
o
 
processo:
 
" + result.msg + ".");
"cod_empresa": "24",
        
}
    
} }

Padrão JSON String de envio

...

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_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",
            
status SMALLINT
"cod_item_compon_dest": "ITEM-TESTE",
            "cod_grade_compon_1_dest": "BRANCO",
            
msg CHAR(300)
"cod_grade_compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
        
END
 
RECORD
   
DEFINE lr_comp_orig,
"cod_grade_compon_4_dest": "",
            
lr_comp_dest RECORD
"cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA 
cod_item_compon LIKE estrut_grade.cod_item_compon,
ITEM-TESTE BRANCO."
        }
    
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,
]
}
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
                     
num_sequencia
    
LIKE estrut_grade.num_sequencia
status SMALLINT,
                       
END
 
RECORD
 msg   
DEFINE l_justificativa
 CHAR(300)
,

             
l_acao
        END RECORD

    
CHAR(001)
DEFINE lr_comp_orig,
           
l
lr_
altera
comp_
item CHAR(001)
dest RECORD
    
DEFINE
 
l_ind,
            
l_item_ind,
           
l
cod_item_
count SMALLINT
compon  LIKE estrut_grade.cod_item_compon,
     
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."
cod_grade_comp_1 LIKE estrut_grade.cod_grade_comp_1,
                 
RETURN
 
lr_return
    
END
 
IF
    
LET
 
lr
cod_grade_comp_
orig.cod_item_compon = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_orig")
2 LIKE estrut_grade.cod_grade_comp_2,
                          
LET lr_comp_orig.
  cod_grade_comp_
1
3 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_
1_orig")
3,
                           
LET
 
lr_comp_orig.
cod_grade_comp_
2
4 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp_
2_orig")
4,
                           
LET
 
lr_comp_orig.
cod_grade_comp_
3
5 
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_grade_comp
_3_orig")
_5
                        END RECORD

    DEFINE la_item_pai ARRAY[100] OF RECORD
        
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
pai     
=
LIKE 
_ADVPL_WfGetParameterValue("componentes","
estrut_grade.cod_item_
compon_dest")
pai,
             
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")
1      
LET
LIKE 
lr
estrut_
comp_dest
grade.cod_grade_
comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_dest")
1,
                      
LET lr_comp_dest.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("componentes","
     cod_grade_
comp_4_dest")
2      
LET
LIKE 
lr
estrut_
comp_dest
grade.cod_grade_
comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_dest")
2,
            
LET
 
l_justificativa
 
= _ADVPL_WfGetParameterValue("componentes","justificativa")
        
LET
 
l_acao
    cod_grade_3      
=
LIKE estrut_grade.cod_
ADVPL_WfGetParameterValue("componentes","slct_acao")
grade_3,
          
#Verifica
 
os
 
códigos
 
da
 
grade
 
de
 
origem.
    
IF
  
lr_comp_orig.cod_grade_comp_1
 
IS
 
NULL
 
THEN
  cod_grade_4      
LET
LIKE 
lr
estrut_
comp_orig
grade.cod_grade_
comp_1 = " "
4,
        
END
 
IF
    
IF
  
lr_comp_orig.cod_grade_comp_2
 
IS
 
NULL
 
THEN
        
LET
 
lr_comp_orig
cod_grade_5      LIKE estrut_grade.cod_grade_
comp_2 = " "
5,
             
END
 
IF
    
IF
  
lr_comp_orig.cod_grade_comp_3
 
IS
 
NULL
 
THEN
    qtd_necessaria   LIKE 
LET lr_comp_orig.cod_grade_comp_3 = " "
estrut_grade.qtd_necessaria,
        
END
 
IF
    
IF
  
lr_comp_orig.cod_grade_comp_4
 
IS
 
NULL
 
THEN
        
LET
 
lr
dat_
comp_orig.cod
validade_ini LIKE estrut_grade.dat_
comp
validade_
4
ini,
 
=
 
"
 
"
    
END
 
IF
   
IF
  
lr_comp_orig.cod_grade_comp_5 IS NULL THEN
             
LET
 
lr
dat_
comp_orig.cod
validade_fim LIKE estrut_grade.dat_
comp_5 = " "
validade_fim,
          
END
 
IF
    
#Verifica
 
os
 
códigos
 
da
 
grade
 
de
 
destino.
    
IF
  
lr_comp_dest.cod_grade_comp_1 IS NULL THEN
num_sequencia    LIKE estrut_grade.num_sequencia
            
LET lr_comp_dest.cod_grade_comp_1 = " "
           END 
IF
RECORD

    
IF
DEFINE 
lr_comp_dest.cod_grade_comp_2 IS NULL THEN
l_justificativa CHAR(300),
          
LET
 
lr_comp_dest.cod_grade_comp_2 = " "
l_acao          CHAR(001),
    
END
 
IF
    
IF
  
lr
l_
comp_dest.cod_grade_comp_3 IS NULL THEN
altera_item   CHAR(001)

    DEFINE 
l_ind,
  
LET
 
lr_comp_dest.cod_grade_comp_3
 
=
 
"
 
"
    
END IF
 l_item_ind,
    
IF
  
lr_comp_dest.cod_grade_comp_4
 
IS
 
NULL
 
THEN
  l_item_count SMALLINT

    IF 
LET
 
lr_comp_dest.cod_grade_comp_4 = " " END IF
LOG_initApp("MANENG") > 0 THEN
       
IF
 LET lr_
comp_dest.cod_grade_comp_5 IS NULL THEN
return.status = FALSE
        LET lr_
comp_dest.cod_grade_comp_5
return.msg    = "Usuário ",p_user CLIPPED,"
 sem permissão para 
END IF
acessar a rotina."

     
LET l_item_ind
   RETURN lr_return
    
=
END 
0
IF

    LET 
l
lr_comp_orig.cod_item_
count
compon  = _ADVPL_
WfGetParameterLength
WfGetParameterValue("componentes","cod_item_
pai
compon_orig")
    
FOR l_ind = 1 TO l_item_count
LET lr_comp_orig.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_orig")
    LET 
l_altera_item
lr_comp_orig.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
altera_item",l_ind)
cod_grade_comp_2_orig")
    
IF l_altera_item = "S" THEN LET l_item_ind = l_item_ind + 1 LET la_item_pai[l_item_ind].cod_item_pai
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("
item_pai
componentes","cod_grade_comp_
item
4_
pai
orig"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_
1
5 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_5_
1
orig"
,l_ind
)

    
LET 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_
grade
item_
2
compon  
= _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_item_
grade
compon_
2
dest"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_comp_
3
1 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_1_
3
dest"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_comp_
4
2 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_2_
4
dest"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_comp_
5
3 = _ADVPL_WfGetParameterValue("
item_pai
componentes","cod_grade_comp_3_
5
dest"
,l_ind
)
    
LET 
la
lr_
item_pai[l_item_ind].qtd_necessaria
comp_dest.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
qtd_necessaria",l_ind)
cod_grade_comp_4_dest")
    LET 
la
lr_
item_pai[l_item_ind].dat_validade_ini
comp_dest.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat_validade_ini",l_ind)
cod_grade_comp_5_dest")

    LET 
la_item_pai[
l_
item_ind].dat_validade_fim
justificativa = _ADVPL_WfGetParameterValue("
item_pai
componentes","
dat_validade_fim",l_ind
justificativa")
    LET l_acao      
LET la_item_pai[l_item_ind].num_sequencia
    = _ADVPL_WfGetParameterValue("
item_pai
componentes","
num
slct_
sequencia
acao"
,l_ind
)

    #Verifica os códigos da grade 
do
de 
item pai
origem.
    IF  lr_comp_orig.cod_grade_comp_1 IS NULL THEN
       
IF
 LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_1
IS NULL THEN
 = " "
    END IF

    IF  lr_comp_orig.cod_grade_comp_2 IS NULL THEN
        LET 
la_item_pai[l_item_ind]
lr_comp_orig.cod_grade_
1
comp_2 = " "
    
END IF

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

    
IF  
la_item_pai[l_item_ind]
lr_comp_orig.cod_grade_
3
comp_4 IS NULL THEN
        
LET 
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_
3
4 = " "
    END IF

    
IF  
la
lr_
item_pai[l_item_ind]
comp_orig.cod_grade_comp_
4
5 IS NULL THEN
        LET 
la_item_pai[l_item_ind]
lr_comp_orig.cod_grade_comp_
4
5 = " "
    END IF

    #Verifica os códigos da grade de destino.
    IF  
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_
5
comp_1 IS NULL THEN
        LET lr_comp_dest.cod_grade_comp_1 = " "
    END IF

    IF 
LET
 
la
lr_
item_pai[l_item_ind]
comp_dest.cod_grade_comp_
5
2 
=
IS 
"
NULL 
"
THEN
        LET lr_comp_dest.cod_grade_comp_2 = " 
END IF
"
    
END IF

    
END
IF 
FOR {
 lr_comp_dest.cod_grade_comp_3 IS NULL THEN
        
Regra de negócio 4GL. }
LET lr_comp_dest.cod_grade_comp_3 = " "
   
LET lr_return.status = TRUE
 END IF

    
LET
IF  lr_comp_
return.msg = "Item componente alterado com sucesso."
dest.cod_grade_comp_4 IS NULL THEN
        
RETURN
LET 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": {
_comp_dest.cod_grade_comp_4 = " "
    END IF

    IF  lr_comp_dest.cod_grade_comp_5 
"cod_empresa": "24",
IS NULL THEN
        
"
LET lr_comp_dest.cod_
item_compon": "ITEM-TESTE",
grade_comp_5 = " "
    END IF

    
"cod_grade_1_orig": "BRANCO",
LET l_item_ind   = 0
    
"cod_grade_2_orig": "",
LET l_item_count = _ADVPL_WfGetParameterLength("item_pai")

    FOR l_ind = 1 TO 
"cod
l_
grade_3_orig": "",
item_count
        LET l_altera_item = 
"cod
_
grade_4_orig": "",
ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)

        IF  
"cod
l_
grade_5_orig":
altera_item = "S"
,
 THEN
       
"slct_acao": "1",
     LET l_item_ind = 
"cod
l_item_
compon_novo": "ITEM-TESTE-NOVO",
ind + 1

            LET 
"cod_grade_1_dest": "PRETO",
la_item_pai[l_item_ind].cod_item_pai     
= 
"cod
_
grade_2_dest": "",
ADVPL_WfGetParameterValue("item_pai","cod_item_pai",l_ind)
    
"cod_grade_3_dest":
 
"",
       
"
LET la_item_pai[l_item_ind].cod_grade_
4_dest": "",
1      
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_
5_dest": "
1",l_ind)
       
"justificativa": "ALTERACAO
 
DO
 
COMPONENTE
 
ITEM-TESTE
 
BRANCO
 
PARA ITEM-TESTE-NOVO PRETO." } }   //Para registros de detalhes (listas). { "componentes": [
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("
cod
item_
empresa
pai"
: "24
,"cod_grade_3",l_ind)
            
"cod_item_compon": "ITEM-TESTE",
LET la_item_pai[l_item_ind].cod_grade_4      
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_
1_orig": "BRANCO",
4",l_ind)
            
"
LET la_item_pai[l_item_ind].cod_grade_
2_orig": "",
5      
= _ADVPL_WfGetParameterValue("item_pai","cod_grade_
3_orig": "",
5",l_ind)
            LET la_item_pai[l_item_ind].qtd_necessaria   = 
"cod
_
grade_4_orig": "",
ADVPL_WfGetParameterValue("item_pai","qtd_necessaria",l_ind)
            LET la_item_pai[l_item_ind].dat_validade_ini = _ADVPL_WfGetParameterValue("
cod_grade_5_orig": "",
item_pai","dat_validade_ini",l_ind)
            LET la_item_pai[l_item_ind].dat_validade_fim = _ADVPL_WfGetParameterValue("
slct
item_
acao
pai"
: "1
,"dat_validade_fim",l_ind)
            
"cod
LET la_item_pai[l_item_
compon_novo": "ITEM-TESTE-NOVO",
ind].num_sequencia    = 
"cod
_
grade_1_dest": "PRETO",
ADVPL_WfGetParameterValue("item_pai","num_sequencia",l_ind)

            
"cod_grade_2_dest": "",
#Verifica os códigos da grade do item pai.
            
"
IF  la_item_pai[l_item_ind].cod_grade_
3_dest": "",
1 IS NULL THEN
    
"cod_grade_4_dest":
 
"",
           
"
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
     
{
           
"cod_empresa": "24",
LET la_item_pai[l_item_ind].cod_grade_2 = " "
            
"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

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