Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Para que as telas HTML possam ser customizadas, e necessário alterar o Metadata e Dados que são enviados para elas. Para isto, é necessário conhecer a estrutura destas informações, desta forma, assim sendo possível pegar o que se deseja e fazer as alterações necessária. Por exemplo, para desabilitar um campo de um formulário, e necessário encontrar o agrupador de campos, navegar nele até encontrar o campo desejado e depois, incluir a propriedade responsável por debilitadebilitá-lo.  

O objeto deste utilitário é, facilitar a manipulação destas informações, disponibilizando métodos que realizam as ações desejadas, sem a necessidade do profundo conhecimento da estrutura. Além disto, há uma considerável redução nas linhas de código necessárias para executar a mesma ação. Por exemplo, para desabilitar um campo (cenário apresentado anteriormente), é necessário apenas uma linha de código.

Nota
titleNota

Funcionalidade disponível a partir da release 12.1.2411 ou patches: 12.1.2407.5, 12.1.2403.11, 12.1.2311.16.

02.UTILIZAÇÃO DO UTILITÁRIO
Âncora
utilizacao
utilizacao

...

MétodoDescriçãoExemplo

setAction ( pCodAction , pCodValue )

Parâmetros:

  • pCodAction (CHARACTER): Código da Ação;
  • pCodValue: Valor da Ação, usar uma das opções:
    • pCodURL (CHARACTER): Valor da URL a ser executada pela Ação;
    • pCodValue (LOGICAL): Valor da Ação.

Retorno (LOGICAL): Indicativo se foi possível incluir/alterar a Ação.

Inclui ou Altera uma Ação Padrão.
Exemplo1:
oCustActions:setAction("detail",
"/userParameters/newdet/:id").

Exemplo2:
oCustActions:setAction("remove",
FALSE).


getActionCharacter ( pCodAction )

getActionLogical ( pCodAction )

Parâmetros:

  • pCodAction (CHARACTER): Código da Ação.

Retorno (CHARACTER,LOGICAL): Valor da Ação.

Retorna o valor de uma Ação Padrão.
Exemplo1:
ASSIGN vUrlEdit =
oCustActions:getActionCharacter("edit").
... Faz algo com a informação

Exemplo2:
ASSIGN vRemove =
oCustActions:getActionLogical("remove").
... Faz algo com a informação

removeAction ( pCodAction )

Parâmetros:

  • pCodAction (CHARACTER): Código da Ação.

Retorno (LOGICAL): Indicativo se foi possível remover a Ação.

Remove uma Ação Padrão.
oCustActions:removeAction("duplicate").

getActions ( )

Retorno (JsonObject): Ações padrões.

retorna um JsonObject que representa as Ação Padrão.
DEFINE VARIABLE oActions AS JsonObject NO-UNDO.
oActions = oCustActions:getActions().
... Faz algo com a informação

setPageCustomActionProperty ( pIdAction , pCodProperty , pCodValue )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.
  • pCodProperty (CHARACTER): Propriedade que deve ser alterada;
  • pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor.

Retorno (LOGICAL): Indicativo se foi possível alterar a propriedade.

Altera uma propriedade de uma Ação Customizada de Página.
Exemplo1:
oCustActions:setPageCustomActionProperty("Atz Dados",
"icon",
"po-icon po-icon po-icon-refresh").

Exemplo2:
oCustActions:setPageCustomActionProperty(2,
"visible",
FALSE).

getPageCustomActionPropertyCharacter ( pIdAction , pCodProperty )

getPageCustomActionPropertyInteger ( pIdAction , pCodProperty )

getPageCustomActionPropertyDecimal ( pIdAction , pCodProperty )

getPageCustomActionPropertyLogical ( pIdAction , pCodProperty )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.
  • pCodProperty (CHARACTER): Propriedade.

Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade.

Retorna o valor de uma propriedade de uma Ação Customizada de Página.
Exemplo1:
ASSIGN vURL =
oCustActions:getPageCustomActionPropertyCharacter("Docto",
"url").
... Faz algo com a informação

Exemplo2:
ASSIGN vVisible =
oCustActions:getPageCustomActionPropertyLogical(1,
"visible").
... Faz algo com a informação

getPageCustomAction ( pIdAction )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.

Retorno (JsonObject): Uma Ação Customizada de Página.

Retorna um JsonObject que representa uma Ação Customizada de Página.
Exemplo1:
DEF VAR oPageCustomAction AS JsonObject NO-UNDO.
oPageCustomAction = oCustActions:getPageCustomAction("Docto").
IF oPageCustomAction <> ? THEN
oPageCustomAction:set("action",
"http://server:8080/doc").

Exemplo2:
DEF VAR oPageCustomAction AS JsonObject NO-UNDO.
oPageCustomAction = oCustActions:getPageCustomAction(1).
IF oPageCustomAction <> ? THEN
oPageCustomAction:set("visible",
FALSE).

addPageCustomAction ( pNumType , pCodLabel , pCodAddress [ , pCodIcon ] )

Parâmetros:

  • pNumType: Tipo da Ação, usar uma das opções:
    • CustomActions:TYPE_ENDPOINT - para chamada ao BackEnd;
    • CustomActions:TYPE_ROUTE - para chamada de uma Rota (URL).
  • pCodLabel (CHARACTER): Label da Ação;
  • pCodAddress (CHARACTER): Endereço da Ação que será executada;
  • pCodIcon (CHARACTER): Ícone da Ação, é opcional.

Retorno (JsonObject): Ação Customizada de Página Incluída.

Incluir uma nova Ação Customizada na Página.
Exemplo1:
oCustActions:addPageCustomAction(CustomActions:TYPE_ENDPOINT,
"Atz Dados",
"http://server01:3000/atzDados").

Exemplo2:
oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE,
"Google",
"http://www.google.com",
"po-icon po-icon-device-desktop").

removePageCustomAction ( pIdAction )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.

Retorno (LOGICAL): Indicativo se foi possível remover a Ação.

Remove uma Ação Customizada de Página.
Exemplo1:
oCustActions:removePageCustomAction("Doctos").

Exemplo2:
oCustActions:removePageCustomAction(3).

getPageCustomActions ( )

Retorno (JsonArray): Ações Customizadas de Página.

Retorna a lista de Ações Customizadas de Página.
DEFINE VARIABLE oPageCustomActions AS JsonArray NO-UNDO.
oPageCustomActions = oCustActions:getPageCustomActions().
... Faz algo com a informação

setTableCustomActionProperty ( pIdAction , pCodProperty , pCodValue )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.
  • pCodProperty (CHARACTER): Propriedade que deve ser alterada;
  • pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor.

Retorno (LOGICAL): Indicativo se foi possível alterar a propriedade.

Altera uma propriedade de uma Ação Customizada de Tabela.
Exemplo1:
oCustActions:setTableCustomActionProperty("Atz Dados",
"icon",
"po-icon po-icon po-icon-refresh").

Exemplo2:
oCustActions:setTableCustomActionProperty(2,
"visible",
FALSE).

getTableCustomActionPropertyCharacter ( pIdAction , pCodProperty )

getTableCustomActionPropertyInteger ( pIdAction , pCodProperty )

getTableCustomActionPropertyDecimal ( pIdAction , pCodProperty )

getTableCustomActionPropertyLogical ( pIdAction , pCodProperty )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.
  • pCodProperty: Propriedade.

Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade.

Retorna o valor de uma propriedade de uma Ação Customizada de Tabela.
Exemplo1:
ASSIGN vURL =
oCustActions:getTableCustomActionPropertyCharacter("Docto",
"url").
... Faz algo com a informação

Exemplo2:
ASSIGN vVisible =
oCustActions:getTableCustomActionPropertyLogical(1,
"visible").
... Faz algo com a informação

getTableCustomAction ( pIdAction )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.

Retorno (JsonObject): Uma Ação Customizada de Tabela.

Retorna um JsonObject que representa uma Ação Customizada de Tabela.
Exemplo1:
DEF VAR oTableCustomAction AS JsonObject NO-UNDO.
oTableCustomAction =
oCustActions:getTableCustomAction("Docto").
IF oTableCustomAction <> ? THEN
oTableCustomAction:set("action",
"http://server:8080/doc").

Exemplo2:
DEF VAR oTableCustomAction AS JsonObject NO-UNDO.
oTableCustomAction =
oCustActions:getTableCustomAction(1).
IF oTableCustomAction <> ? THEN
oTableCustomAction:set("visible",
FALSE).

addTableCustomAction ( pNumType , pCodLabel , pCodAddress [ , pCodIcon ] [ , pConcatKeys ] )

Parâmetros:

  • pNumType: Tipo da Ação, usar uma das opções:
    • CustomActions:TYPE_ENDPOINT - para chamada ao BackEnd;
    • CustomActions:TYPE_ROUTE - para chamada de uma Rota (URL).
  • pCodLabel (CHARACTER): Label da Ação;
  • pCodAddress (CHARACTER): Endereço da Ação que será executada;
  • pCodIcon (CHARACTER): Ícone da Ação, é opcional;
  • pConcatKeys (LOGICAL): Indica se deve ser acrescentada a propriedade "concatKeys" na Ação, é opcional.

Retorno (JsonObject): Ação Customizada de Tabela Incluída.

Incluir uma nova Ação Customizada na Tabela.
Exemplo1:
oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT,
"Bloqueia",
"http://server01:3000/block").

Exemplo2:
oCustActions:addTableCustomAction(CustomActions:TYPE_ROUTE,
"Det Adicional",
"http://newserver:8080/dts/customer/detail",
"po-icon po-icon po-icon-refresh").

Exemplo3:
oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT,
"Copiar",
"http://server:3000/dts/customer/copy",
"",
TRUE).

removeTableCustomAction ( pIdAction )

Parâmetros:

  • pIdAction: Identificador da Ação, usar uma das opções:
    • pCodLabel (CHARACTER): Label da Ação;
    • pNumIndex (INTEGER): Posição da Ação dentro da Lista de Ações.

Retorno (LOGICAL): Indicativo se foi possível remover a Ação.

Remove uma Ação Customizada de Tabela.
Exemplo1:
oCustActions:removeTableCustomAction("Relacto").

Exemplo2:
oCustActions:removeTableCustomAction(2).

getTableCustomActions ( )

Retorno (JsonArray): Ações Customizadas de Tabela.

Retorna a lista de Ações Customizadas de Tabela.
DEFINE VARIABLE oTableCustomActions AS JsonArray NO-UNDO.
oTableCustomActions = oCustActions:getTableCustomActions().
... Faz algo com a informação

getServerAddress ( pIsExt )

Parâmetros:

  • pIsExt (LOGICAL): Indica se deve ser considerado o Endereço Exerno (Valor: TRUE) ou Interno (Valor:FALSE). Se for solicitado o Externo e ele não existir, será devolvido o interno.

Retorno (CHARACTER): Endereço no formato: http://HOST:PORT.

Retorna o Endereço onde o Datasul está hospedado.
Exemplo1:
DEFINE VARIABLE vServer AS CHARACTER NO-UNDO.
ASSIGN vServer = oCustActions:getServerAddress(FALSE).
... Faz algo com a informação

Exemplo2:
DEFINE VARIABLE vServerExt AS CHARACTER NO-UNDO.
ASSIGN vServerExt = oCustActions:getServerAddress(TRUE).
... Faz algo com a informação

e.CustomRecords
Âncora
CustomRecords
CustomRecords
e.CustomRecords
Âncora
CustomRecordsCustomRecords

Classe utilizada para alterar os registros que estão sendo enviados pela tela HTML. Ela pode ser utlizalida tanto no evento que retornam vários registros, com naqueles que é retornado apenas um.

...

MétodoDescriçãoExemplo

getEntityKeyCharacter ( )

getEntityKeyInteger ( )

Retorno (CHARACTER,INTEGER): Chave do registro.

Retorna a chave do Registro na manipulação do Metadata (Alteração, Detalhe).
Exemplo1:
DEFINE VARIABLE vCodPais AS CHARACTER NO-UNDO.
ASSIGN vCodPais = oCustRecords:getEntityKeyCharacter().
... Faz algo com a informação

Exemplo2:
DEFINE VARIABLE vIdCliente AS INTEGER NO-UNDO.
ASSIGN vIdCliente = oCustRecords:getEntityKeyInteger().
.. Faz algo com a informação

updateRecords ( pProg , pPiName )

Parâmetros:

  • pProg (HANDLE): Handle do programa UPC;

updateRecords ( pProg , pPiName )

Parâmetros:

  • pProg (HANDLE): Handle do programa UPC;
  • pPiName (CHARACTER): Nome da PI que será executada a cada registro dos dados. Ela deve receber como parâmetro um JsonObject que representa o registro, exemplo:

    DEF INPUT PARAM oItem AS JsonObject NO-UNDO.

Retorno (LOGICAL): Indicativo se é possível alterar o registro.

Navega nos registros e executa uma PI interna da UPC para customização dos dados.

// Indica que dever ser executada a PI "pi_altera_registros" para

// realizar a alteração nos registros
oCustRecords:updateRecords(THIS-PROCEDURE, "pi_altera_registros").
// PI que será executada para cada registro da Tabela

PROCEDURE pi_altera_registros:
DEF INPUT PARAM oItem AS JsonObject NO-UNDO.
// Atualiza a coluna "Cópia Usuário" com o valor da coluna "Usuário"
oItem:ADD("userCopy", FIND minha-tabela WHERE
minha-tabela.cod-cliente = oItem:getCharacter("userCode")).
// Altera o conteúdo da coluna "Nome", concatenado: "- Alterado"
oItem:SET("userName", oItem:getCharacter("userName") + " - Alterado"
NO-LOCK NO-ERROR.
IF AVAIL minha-tabela THEN
oItem:ADD("myInform", minha-tabela.cod-minha-info).
END PROCEDURE.

f.CustomMessages
Âncora
CustomMessages
CustomMessages

Classe utilizada para criação de mensagens que de erro que serão enviadas para a tela HTML.


MétodoDescriçãoExemplo

createMessageError ( pMsgNumber , pMsgDescription , pMsgHelp )

Parâmetros:

  • pMsgNumber (INTEGER): Número da Mensagem;
  • pMsgDescription (CHARACTER): Descrição da Mensagem;
  • pMsgHelp (CHARACTER): Help da Mensagem.

Retorno (JsonObject): Mensagem no padrão TOTVS de Mensagem

.Cria uma mensagem do tipo ERROR para enviar ao FrontEnd.// Valida se o campo "Caminho completo do executável GZIP" foi
// informado, se não foi, retorna uma mensagem de Erro
ASSIGN vValorAtual

.

Cria uma mensagem do tipo ERROR para enviar ao FrontEnd.
DEF VAR vName AS CHARACTER NO-UNDO.

ASSIGN vName = oCustFields:getFieldValueCharacter("
execGZIPProgram
customerName").
 


IF
vValorAtual
vName = "" OR 
vValorAtual
vName = ? THEN DO:
jsonIO = oCustMsgs:createMessageError(1,

        
"Caminho
 
completo do executável GZIP
 
OBRIGATÓRIO",
 

"O
 
campo
 
'Caminho
 
completo
 
do
 
executável
 
GZIP'
 
deve
 
ser
 
informado,
 
não
 
pode
 
ser
 
branco
"Nome 
!
OBRIGATÓRIO"
).
,
//
 
Indica
 
que
 
não
 
deve
 
ser
 
Salvo
"O 
a
nome 
Alteração
do 
Registro
IF
cliente 
vValorAtual
é 
=
obrigatório 
"" OR vValorAtual = ? THEN
!").
RETURN "NOK".
END.

04.EXEMPLOS DA UTILIZAÇÃO DAS CLASSES
Âncora
exemplos
exemplos

...

Bloco de código
languagetext
titleExemplo UPC
linenumberstrue
// Indica ao programa onde estão as Classes
USING PROGRESS.json.ObjectModel.*. // Classes da Progress
USING com.totvs.framework.po.*.    // Classes do Utilitário
 
// Parâmetros recebidos pela UPC
DEF INPUT        PARAM pEndPoint AS CHAR       NO-UNDO.
DEF INPUT        PARAM pEvent    AS CHAR       NO-UNDO.
DEF INPUT        PARAM pAPI      AS CHAR       NO-UNDO.
DEF INPUT-OUTPUT PARAM jsonIO    AS JsonObject NO-UNDO.
   
// Define as variáveis que irão representar as Classes
DEF VAR oCustPages   AS CustomPages    NO-UNDO.
DEF VAR oCustFields  AS CustomFields   NO-UNDO.
DEF VAR oCustActions AS CustomActions  NO-UNDO.
DEF VAR oCustRecords AS CustomRecords  NO-UNDO.
DEF VAR oCustMsgs    AS CustomMessages NO-UNDO.

// Variáveis axuliáresauxiliares
DEF VAR oFields     AS JsonArray  NO-UNDO.
DEF VAR oField      AS JsonObject NO-UNDO.
DEF VAR oAction     AS JsonObject NO-UNDO.
DEF VAR vValorAtual AS CHARACTER  NO-UNDO.
DEF VAR vValorAjust AS CHARACTER  NO-UNDO.
DEF VAR vValorMark  AS LOGICAL    NO-UNDO.

// Evento de Busca do Metadata da Tela de Lista
IF pEndPoint = "getMetaData" AND pEvent = "list" THEN DO:

    // Instância as Classes necessárias
    oCustPages   = NEW CustomPages(CustomOrig:ORIG_METADATA,   jsonIO).
    oCustFields  = NEW CustomFields(CustomOrig:ORIG_METADATA,  jsonIO).
    oCustActions = NEW CustomActions(CustomOrig:ORIG_METADATA, jsonIO).

    // Altera o Título da Página
    oCustPages:setPageTitle(oCustPages:getPageTitle() + " - ALTERADO").
   
    // Altera a propriedade para salvar o Filtro da busca Avançada
    oCustPages:setPageProperty("keepfilters", TRUE).
        
    // Altera o label da coluna "FIFO" para "FIFO-ALT"
    oCustFields:setFieldLabel("enableFIFOInPurchaseReq", "FIFO-ALT").
        
    // Inclui uma coluna chamada: "Cópia Usuário"
    ASSIGN oField = oCustFields:addField("userCopy", "Cópia Usuário", FieldType:STRING).
    // Inclui a nova coluna no Gerenciador de Colunas
    IF oField <> ? THEN
        oField:ADD("allowColumnsManager", TRUE).
        
    // Retira a Ação Padrão de "Excluir" da Tabela    
    oCustActions:setAction("remove", FALSE).
      
    // Retira a Ação Padrão de "Cópia" da Tabela
    oCustActions:removeAction("duplicate").
    
    // Faz a Ação Padrão de Visualizar abrir a tela de Edição
    oCustActions:setAction("detail", oCustActions:getActionCharacter("edit")).
    
    // Inclui uma nova Ação Customizada no Pagina chamada "Atz Dados" que chama uma EndPoint
    oCustActions:addPageCustomAction(CustomActions:TYPE_ENDPOINT, "Atz Dados", "http://server01:3000/atzDados").
    
    // Inclui uma nova Ação Customizada no Pagina chamada "Google" que chama uma Rota
 uma Rota
    oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE, "Google", "http://www.google.com",
                                  oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE, "Google", "http://www.google.com", "po-icon po-icon-device-desktop").
    
    // Inclui o icone de Refresh na Ação Customizada "Atz Dados" da Pagina
    oCustActions:setPageCustomActionProperty("Atz Dados", "icon", "po-icon po-icon po-icon-refresh").
    
    // Altera o Endereço da primeira Ação Customizada da Pagina
    oAction = oCustActions:getPageCustomAction(1).
    IF oAction <> ? THEN
        oAction:set("action", "http://newserver:8080/customer").
    
    // Elimina a Ação Customizada chamada "Doctos" da Pagina
    oCustActions:removePageCustomAction("Doctos").

    // Inclui uma nova Ação Customizada no Tabela chamada "Bloqueia" que chama uma EndPoint
    oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT, "Bloqueia", "http://server01:3000/block",
                                      "po-icon po-icon po-icon-refresh").
    
    // Inclui uma nova Ação Customizada no Tabela chamada "Det Adicional" que chama uma Rota
    oCustActions:addTableCustomAction(CustomActions:TYPE_ROUTE, "Det Adicional",
                                      "http://newserver:8080/dts/customer/detail").
    
    // Elimina a Ação Customizada chamada "Relacto" da Pagina
    oCustActions:removeTableCustomAction("Relacto").

    // Retira as Classes da memória
    DELETE OBJECT oCustPages   NO-ERROR.
    DELETE OBJECT oCustFields  NO-ERROR.
    DELETE OBJECT oCustActions NO-ERROR.
END.

// Evento de Busca do Metadados da Tela de Novo/Editar
IF pEndPoint = "getMetaData" AND (pEvent = "new" OR pEvent = "edit") THEN DO:

    // Instância as Classes necessárias
    oCustFields = NEW CustomFields(CustomOrig:ORIG_METADATA, jsonIO).

    // Desabilita o campo "Atualizar com erro de duplicata" (Aba: Atualização recebimento fiscal)
    oCustFields:setDisableField("updatesWithDuplicateError", "fieldsUpdateFiscalConfigurations").
    
    // Habilita o campo "Unidade negócio" (Aba: Digitação/Geração)
    oCustFields:setEnableField("enableBusinessUnit", "fieldsTypingEnableDisable").

    // Esconde o campo "Desconto item"
    oCustFields:setHideField("itemDiscount").

    // Mostra o campo "Geração nota crédito a pagar"
    oCustFields:setShowField("creditNoteGeneration").

    // Para o campo "Sequência dos itens" mostrar "Ligado/Desligado" ao invés de "Ativado/Desativado"
    IF oCustFields:getFieldPropertyCharacter("enableSequence", "type", "fieldsTypingEnableDisable") = "boolean" THEN DO:
        oCustFields:setFieldProperty("enableSequence", "booleanTrue",  "Ligado",    "fieldsTypingEnableDisable").
        oCustFields:setFieldProperty("enableSequence", "booleanFalse", "Desligado", "fieldsTypingEnableDisable").
    END.
    
    // Pegua a quantidades de campos do agrupador "Impostos" e joga no label do campo "Total"
    ASSIGN oFields = oCustFields:getFields("fieldsTax")
           oField  = oCustFields:getField("totalTax", "fieldsTax").
    IF oFields <> ? AND oField <> ? THEN
        oField:SET("label", "Total (" + string(oFields:LENGTH) + ")").
 
    // Colocar o Campo "Estado (UF)" depois do campo "Baixa estoque"
    oCustFields:changeFieldOrder("enableState", "enableStockMovement").
    
    // Coloca o campo "CPF" como sendo o primeiro campo do Formulário
    oCustFields:changeFieldOrder("cpf", YES).
 
    // Indica que, ao alterar o campo "Caminho completo do executável GZIP",
    // deverá chamar o validateField da API-REST do Produto (Aba: Configurações)
    oCustFields:setFieldValidate("execGZIPProgram", pAPI, "fieldsTypingConfigurations").
 
    // Indica que, ao alterar o campo "Código tributação ICMS", 
    // deverá chamar o validateForm da API-REST do Produto (Aba: Digitação/Geração)
    oCustFields:addValidateFields("enableICMSTaxationCode").

    // Retira as Classes da memória
    DELETE OBJECT oCustFields NO-ERROR.
END.

// Evento de Busca dos Registros da Tela de Lista
IF pEndPoint = "findAll" AND pEvent = "findAll" THEN DO:

    // Instância as Classes necessárias
    oCustRecords = NEW CustomRecords(CustomOrig:ORIG_GET_ALL, jsonIO).
    
    // Indica que dever ser executada a PI "pi_altera_registros" para realizar a alteração nos registros
    oCustRecords:updateRecords(THIS-PROCEDURE, "pi_altera_registros").

    // Retira as Classes da memória
    DELETE OBJECT oCustRecords NO-ERROR.
END.

// PI que será executada para cada registro da Tabela
PROCEDURE pi_altera_registros:
    DEF INPUT PARAM oItem AS JsonObject NO-UNDO.

    // Atualiza a coluna "Cópia Usuário" com o valor da coluna "Usuário"
    oItem:ADD("userCopy", oItem:getCharacter("userCode")).

    // Altera o conteúdo da coluna "Nome", concatenado: "- Alterado"
    oItem:SET("userName", oItem:getCharacter("userName") + " - Alterado").
END PROCEDURE.

// Evento de Busca de um Registro da tela de Edição
IF pEndPoint = "findById" AND pEvent = "findById" THEN DO:

    // Instância as Classes necessárias
    oCustFields = NEW CustomFields(CustomOrig:ORIG_GET_RECORD, jsonIO).

    // Altera o valor da coluna "Variação máxima data emissão" para "888" (Aba: Digitação/Geração)
    oCustFields:setFieldValue("variationIssuing", 888).

    // Retira as Classes da memória
    DELETE OBJECT oCustFields NO-ERROR.
END.

// Evento de Alteração de Campo
IF pEndPoint = "validateField" AND pEvent = "validateField" THEN DO:

    // Instância as Classes necessárias
    oCustFields = NEW CustomFields(CustomOrig:ORIG_VLD_FIELD, jsonIO).

    // Se alterar o campo "Caminho completo do executável GZIP" (Aba: Digitação/Geração):
    // - Muda o conteúdo para minísculo
    // - Retira os acentos
    // - Se retirar os acentos, muda o label para "Caminho completo do executável GZIP (AJUST)"
    IF oCustFields:isChangedField("execGZIPProgram") THEN DO:

        ASSIGN vValorAtual = oCustFields:getFieldValueCharacter("execGZIPProgram").

        IF vValorAtual <> ? THEN DO:
            ASSIGN vValorAjust = LC(vValorAtual)
                   vValorAjust = REPLACE(vValorAjust, "á", "a")
                   vValorAjust = REPLACE(vValorAjust, "é", "e")
                   vValorAjust = REPLACE(vValorAjust, "í", "i")
                   vValorAjust = REPLACE(vValorAjust, "ó", "o")
                   vValorAjust = REPLACE(vValorAjust, "ú", "u")
                   vValorAjust = REPLACE(vValorAjust, "ã", "a")
                   vValorAjust = REPLACE(vValorAjust, "õ", "o")
                   vValorAjust = REPLACE(vValorAjust, "ç", "c").

            oCustFields:setFieldValue("execGZIPProgram", vValorAjust).

            IF NOT vValorAjust MATCHES(vValorAtual) THEN
                oCustFields:setFieldLabel("execGZIPProgram", "Caminho completo do executável GZIP (AJUST)").
            ELSE
                oCustFields:setFieldLabel("execGZIPProgram", "Caminho completo do executável GZIP").
        END.
    END.

    // Retira as Classes da memória
    DELETE OBJECT oCustFields NO-ERROR.
END.

// Evento de Alteração de Formulário
IF pEndPoint = "validateForm" AND pEvent = "validateForm" THEN DO:

    // Instância as Classes necessárias
    oCustFields = NEW CustomFields(CustomOrig:ORIG_VLD_FORM, jsonIO).

    // Se alterar o campo “Código tributação ICMS” (Aba: Digitação/Geração): 
    // - Se "sim": desabilita o campo “Percentual redução ICMS” e muda o campo "Alíquota ICMS" para "sim", 
    // - Se "não": faz ao contrário
    IF oCustFields:isChangedField("enableICMSTaxationCode") THEN DO:

        ASSIGN vValorMark = oCustFields:getFieldValueLogical("enableICMSTaxationCode").
        
        IF vValorMark <> ? THEN DO:
            oCustFields:setFieldProperty("enableICMSReductionPercentage", "disabled", vValorMark).
              
            oCustFields:setFieldValue("enableICMSRate", vValorMark).
        END.
    END.

    // Retira as Classes da memória
    DELETE OBJECT oCustFields NO-ERROR.
END.

// Evento de Alteração de Registro
IF pEndPoint = "update" AND pEvent = "beforeUpdate" THEN DO:

    // Instância as Classes necessárias
    oCustFields = NEW CustomFields(CustomOrig:ORIG_UPDATE_RECORD,   jsonIO).
    oCustMsgs   = NEW CustomMessages(CustomOrig:ORIG_UPDATE_RECORD, jsonIO).

    // Valida se o campo "Caminho completo do executável GZIP" foi informado, se não foi, retorna uma mensagem de Erro
    ASSIGN vValorAtual = oCustFields:getFieldValueCharacter("execGZIPProgram"). 
    IF vValorAtual = "" OR vValorAtual = ? THEN
        jsonIO = oCustMsgs:createMessageError(1, "Caminho completo do executável GZIP OBRIGATÓRIO", 
                 "O campo 'Caminho completo do executável GZIP' deve ser informado, não pode ser branco !").
    
    // Retira as Classes da memória
    DELETE OBJECT oCustFields NO-ERROR.
    DELETE OBJECT oCustMsgs   NO-ERROR.
    
    // Indica que não deve ser Salvo a Alteração do Registro
    IF vValorAtual = "" OR vValorAtual = ? THEN
        RETURN "NOK".
END.

RETURN "OK".

...