Á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

...

  • Definir uma variável do tipo da classe, que irá representá-la;
  • Instanciar a classe, passando os seguintes parâmetros:
    • pOrigin: Corresponde ao Endpoint/Evento que será tratado dentro da UPC. Ver detalhes a seguir no descritivo da classe: CustomOrig;
    • jsonIO (JsonObject): Informações da /dados recebidas pela UPC (corresponde ao quarto parâmetro recebido pela UPC).
  • Utilizar as funções desejadas;
  • E por final, retirar a classe da memória.

...

Bloco de código
languagetext
titleExemplo utilização da classe CustomFields
linenumberstrue
// Indica a UPC 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 a variável que irá representar a Classe
DEF VAR oCustFields AS CustomFields NO-UNDO.

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

    // Realiza a instância da Classe
    oCustFields = NEW CustomFields(CustomOrig:ORIG_METADATA, jsonIO).

    // Desabilita o campo "Atualizar com erro de duplicata" (nome interno: updatesWithDuplicateError)
    oCustFields:setDisableField("updatesWithDuplicateError").

    // Retira a Classe da memória
    DELETE OBJECT oCustFields NO-ERROR.
END.

...

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:// Retira a Ação Padrão de "Excluir" da Tabela    
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.
// Faz a Ação Padrão de Visualizar abrir a tela de Edição
oCustActions:setAction("detail",
oCustActions:getActionCharacter("edit")).
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.// Retira a Ação Padrão de "Cópia" da Tabela
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 )

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:// 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").

Exemplo2:
oCustActions:setPageCustomActionProperty(2,
"po-icon po-icon po-icon-refresh"). "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.

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.
// Altera o Endereço da primeira Ação Customizada da Pagina
oAction = oCustActions:getPageCustomAction(1).
IF oAction <> ? THEN
oAction:set("action", 
Exemplo1:
ASSIGN vURL =
oCustActions:getPageCustomActionPropertyCharacter("Docto",
"http://newserver:8080/customerurl").
... 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:

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
    • pNumIndex (
    CHARACTER
    • INTEGER):
    Endereço da Ação que será executada;pCodIcon (CHARACTER): Ícone da Ação, é opcional
    • Posição da Ação dentro da Lista de Ações.

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

Incluir Retorna um JsonObject que representa uma nova Ação Customizada na de Página.
Exemplo1:
//DEF IncluiVAR umaoPageCustomAction novaAS Ação Customizada no Pagina chamada "Atz Dados" que chama
// uma EndPoint
oCustActions:addPageCustomAction(CustomActions:TYPE_ENDPOINT, JsonObject NO-UNDO.
oPageCustomAction = oCustActions:getPageCustomAction("Docto").
IF oPageCustomAction <> ? THEN
oPageCustomAction:set("action",
"http://server:8080/doc").

Exemplo2:
DEF VAR oPageCustomAction AS "Atz DadosJsonObject NO-UNDO.
oPageCustomAction = oCustActions:getPageCustomAction(1).
IF oPageCustomAction <> ? THEN
oPageCustomAction:set("visible",
"http://server01:3000/atzDados").// Inclui uma nova AçãoFALSE).

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,
Customizada no Pagina chamada "Google" que chama uma
// Rota
oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE,
"Google",
"Atz Dados",
"http://www.google.com",
"http://server01:3000/atzDados").

Exemplo2:
oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE,
"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.
// Elimina a Ação Customizada chamada "Doctos" da Pagina
oCustActions:removePageCustomAction("Doctos").
                             "Google",
"http://www.google.com",
"po-icon po-icon-device-desktop").

removePageCustomAction ( pIdAction )

Parâmetros:

  • pIdAction:

getPageCustomActions ( )

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

Retorna a lista de Ações Customizadas de Página.

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 remover a propriedadeAção.

Altera uma propriedade de Remove uma Ação Customizada de TabelaPá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:

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 (CHARACTER): Propriedade .
Retorno
  • que deve ser alterada;
  • pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL):
Valor da Propriedade.
  • Novo valor.

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

Altera Retorna o valor de uma propriedade de uma Ação Customizada de Tabela.

getTableCustomAction ( pIdAction )

Parâmetros
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, é opcionalpIdAction: 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 Incluída.

Retorna um JsonObject que representa Incluir uma nova Ação Customizada de na Tabela.
Exemplo1:
oCustActions: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.
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:// Inclui uma nova Ação Customizada no Tabela chamada "Bloqueia" que chama
// uma EndPoint
oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT,
"Bloqueia",
"Copiar",
"http://server01server:3000/block/dts/customer/copy",
"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"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:// Elimina a Ação Customizada chamada "Relacto" da Pagina
oCustActions:removeTableCustomAction("Relacto"2).

getTableCustomActions ( )

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

Retorna a lista de Ações Customizadas de Tabela.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.

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

...

MétodoDescriçãoExemplo

getEntityKeyCharacter ( )

getEntityKeyInteger ( )

Retorno (CHARACTER,INTEGER): Chave do registro.

Retorna a chave do Registro na manipulação do Metadata (Alteração, Detalhe).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;
  • 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
    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".

...