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
title
themeEclipse
languagejavascriptExemplo 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 + ".");
        }
    }
}
Card
labelExecução da Rotina no Logix
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": "",

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_3_orig": "",
                status SMALLINT"cod_grade_compon_4_orig": "",
        "cod_grade_compon_5_orig": "",
        "acao": "1",
       msg    CHAR(300) "cod_item_compon_dest": "ITEM-TESTE-NOVO",
        "cod_grade_compon_1_dest": "PRETO",
          "cod_grade_compon_2_dest": "",
  END RECORD

    DEFINE lr_comp_orig "cod_grade_compon_3_dest": "",
           lr_comp"cod_grade_compon_4_dest": RECORD"",
        "cod_grade_compon_5_dest": "",
        "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA     cod_item_compon  LIKE estrut_grade.cod_item_compon,
        ITEM-TESTE-NOVO PRETO."
    }
}
 
//Para registros de detalhes (listas).
{
    "componentes": [
        {
            "cod_grade_comp_1 LIKE estrut_grade.cod_grade_comp_1empresa": "24",
                "cod_item_compon": "ITEM-TESTE",
            "cod_grade_comp_2 LIKE estrut_grade.cod_grade_comp_2compon_1_orig": "BRANCO",
            "cod_grade_compon_2_orig": "",
               "cod_grade_compcompon_3 LIKE estrut_grade.cod_grade_comp_3_orig": "",
                "cod_grade_compon_4_orig": "",
            "cod_grade_comp_4 LIKE estrut_grade.cod_grade_comp_4compon_5_orig": "",
            "acao": "1",
               "cod_gradeitem_compcompon_5 LIKE estrut_grade.cod_grade_comp_5dest": "ITEM-TESTE-NOVO",
                "cod_grade_compon_1_dest": "PRETO",
        END RECORD

    DEFINE la_item_pai ARRAY[100] OF RECORD"cod_grade_compon_2_dest": "",
            "cod_grade_compon_3_dest": "",
              cod_item_pai"cod_grade_compon_4_dest": "",
       LIKE estrut_grade.cod_item_pai     "cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
       cod_grade_1  },
     LIKE estrut_grade.cod_grade_1,
  {
            "cod_empresa": "24",
            "cod_gradeitem_2      LIKE estrut_grade.cod_grade_2compon": "ITEM-TESTE-NOVO",
            "cod_grade_compon_1_orig": "PRETO",
              "cod_grade_3      LIKE estrut_grade.cod_grade_3compon_2_orig": "",
            "cod_grade_compon_3_orig": "",
              "cod_grade_compon_4_orig": "",
     LIKE estrut_grade.cod_grade_4       "cod_grade_compon_5_orig": "",
            "acao": "1",
              "cod_item_grade_5compon_dest": "ITEM-TESTE",
           LIKE estrut"cod_grade.cod_compon_grade_51_dest": "BRANCO",
            "cod_grade_compon_2_dest": "",
              qtd_necessaria   LIKE estrut_grade.qtd_necessaria"cod_grade_compon_3_dest": "",
            "cod_grade_compon_4_dest": "",
              dat_validade_ini LIKE estrut_grade.dat_validade_ini"cod_grade_compon_5_dest": "",
            "justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA         dat_validade_fim LIKE estrut_grade.dat_validade_fim,ITEM-TESTE BRANCO."
        }
    ]
}
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
                       END RECORD

    DEFINE l_justificativa CHAR(300),
           l_acao         status CHAR(001)SMALLINT,
           l_altera_item   CHAR(001)

    DEFINE l_ind,
       msg    l_item_ind,CHAR(300)
           l_item_count SMALLINT

    IF  LOG_initApp("MANENG") > 0 THEN
    END RECORD

   LET DEFINE lr_return.status = FALSE
comp_orig,
          LET lr_comp_return.msgdest RECORD
   = "Usuário ",p_user CLIPPED," sem permissão para acessar a rotina."
        RETURN lr_return
    END IF

    LET lr_comp_orig.cod_item_compon  =LIKE _ADVPL_WfGetParameterValue("componentes","estrut_grade.cod_item_compon_orig")
,
                       LET lr_comp_orig.     cod_grade_comp_1 =LIKE _ADVPL_WfGetParameterValue("componentes","estrut_grade.cod_grade_comp_1_orig")
,
                LET lr_comp_orig.            cod_grade_comp_2 =LIKE _ADVPL_WfGetParameterValue("componentes","estrut_grade.cod_grade_comp_2_orig")
,
                           LET lrcod_grade_comp_orig3 LIKE estrut_grade.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_orig")
,
                           LET lr_comp_orig.cod_grade_comp_4 =LIKE _ADVPL_WfGetParameterValue("componentes","estrut_grade.cod_grade_comp_4_orig")
,
                           LET lr_comp_orig.cod_grade_comp_5 =LIKE _ADVPL_WfGetParameterValue("componentes","estrut_grade.cod_grade_comp_5_orig")
                        END RECORD

    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
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,
                          LET lr_comp_orig.cod_grade_comp_2 = " "
qtd_necessaria   LIKE estrut_grade.qtd_necessaria,
        END IF

    IF  lr_comp_orig.cod_grade_comp_3 IS NULL THEN
        LET lrdat_comp_orig.codvalidade_ini LIKE estrut_grade.dat_compvalidade_3ini,
 = " "
    END IF

    IF  lr_comp_orig.cod_grade_comp_4 IS NULL THEN
              LET lrdat_comp_orig.codvalidade_fim LIKE estrut_grade.dat_comp_4 = " "
validade_fim,
        END IF

    IF  lr_comp_orig.cod_grade_comp_5 IS NULL THEN
        LET lr_comp_orig.cod_grade_comp_5 = " "num_sequencia    LIKE estrut_grade.num_sequencia
    END IF

    #Verifica os códigos da grade de destino.
    IF  lr_comp_dest.cod_grade_comp_1 IS NULLEND THENRECORD

    DEFINE l_justificativa CHAR(300),
  LET lr_comp_dest.cod_grade_comp_1 = " "
    END IF

 l_acao    IF  lr_comp_dest.cod_grade_comp_2 IS NULL THEN
    CHAR(001),
    LET lr_comp_dest.cod_grade_comp_2 = " "
    END IF       l_altera_item   CHAR(001)

    IFDEFINE  lr_comp_dest.cod_grade_comp_3 IS NULL THEN
l_ind,
          LET lrl_comp_dest.cod_grade_comp_3 = " "
item_ind,
           END IFl_item_count SMALLINT

    IF  lr_comp_dest.cod_grade_comp_4 IS NULLLOG_initApp("MANENG") > 0 THEN
        LET lr_comp_dest.cod_grade_comp_4return.status = " "
 FALSE
        LET lr_return.msg   END IF

= "Usuário ",p_user CLIPPED," IFsem  lr_comp_dest.cod_grade_comp_5 IS NULL THENpermissão para acessar a rotina."

        LETRETURN lr_comp_dest.cod_grade_comp_5 = " "return
    END IF

    LET llr_comp_orig.cod_item_indcompon   = 0_ADVPL_WfGetParameterValue("componentes","cod_item_compon_orig")
    LET l_item_countlr_comp_orig.cod_grade_comp_1 = _ADVPL_WfGetParameterLengthWfGetParameterValue("item_paicomponentes","cod_grade_comp_1_orig")

    FORLET l_ind = 1 TO l_item_count
        LET l_altera_itemlr_comp_orig.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("item_paicomponentes","altera_item",l_ind)

        IF  l_altera_item = "S" THEN
        cod_grade_comp_2_orig")
    LET l_item_ind = l_item_ind + 1

    lr_comp_orig.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_orig")
        LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_itemcomp_pai4     = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_grade_comp_item4_paiorig",l_ind)
            LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_1      comp_5 = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_grade_comp_5_1orig",l_ind)

            LET la_item_pai[l_item_ind]LET lr_comp_dest.cod_grade_2   item_compon   = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_item_gradecompon_2dest",l_ind)
            LET lalr_item_pai[l_item_ind]comp_dest.cod_grade_3      comp_1 = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_grade_comp_3",l_ind)
        1_dest")
    LET lalr_item_pai[l_item_ind]comp_dest.cod_grade_4      comp_2 = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_grade_4",l_ind)
      comp_2_dest")
      LET lalr_item_pai[l_item_ind]comp_dest.cod_grade_comp_5      3 = _ADVPL_WfGetParameterValue("item_paicomponentes","cod_grade_5",l_ind)
    comp_3_dest")
        LET lalr_item_pai[l_item_ind].qtd_necessaria   comp_dest.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("item_paicomponentes","qtd_necessaria",l_indcod_grade_comp_4_dest")
            LET lalr_item_pai[l_item_ind].dat_validade_inicomp_dest.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("item_paicomponentes","dat_validade_ini",l_ind)
cod_grade_comp_5_dest")

            LET la_item_pai[l_item_ind].dat_validade_fimjustificativa = _ADVPL_WfGetParameterValue("item_paicomponentes","dat_validade_fim",l_indjustificativa")
    LET l_acao       LET la_item_pai[l_item_ind].num_sequencia    = _ADVPL_WfGetParameterValue("item_paicomponentes","num_sequencia",l_indslct_acao")

            #Verifica os códigos da grade dode item paiorigem.
            IF  lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_1 IS NULL THEN
                LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_1 = " "
            END IF

            IF  la_item_pai[l_item_ind]IF  lr_comp_orig.cod_grade_comp_2 IS NULL THEN
                LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_2 = " "
            END IF

            IF  lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_3 IS NULL THEN
                LET la_item_pai[l_item_ind]lr_comp_orig.cod_grade_comp_3 = " "
            END IF

            IF  lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_4 IS NULL THEN
                LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_4 = " "
            END IF

            IF  la_item_pai[l_item_ind]lr_comp_orig.cod_grade_comp_5 IS NULL THEN
                LET lalr_item_pai[l_item_ind]comp_orig.cod_grade_comp_5 = " "
            END IF

    #Verifica os códigos da ENDgrade IF
    END FOR
de destino.
    {
IF  lr_comp_dest.cod_grade_comp_1      Regra de negócio 4GL.IS NULL THEN
    }

    LET lr_return.status = TRUEcomp_dest.cod_grade_comp_1 = " "
    END IF

    LETIF  lr_comp_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": {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 "codl_grade_5_orig": "",
item_ind   = 0
    LET "slct_acao": "1",l_item_count = _ADVPL_WfGetParameterLength("item_pai")

    FOR l_ind = 1 "codTO 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  "codl_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("coditem_empresapai": "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)
            "codLET 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

            "codIF  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."
}