Árvore de páginas

Versões comparadas

Chave

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

CONTEÚDO

  1. INTRDUÇÃO / OBJETIVO
  2. XXXXX
    1. Xxxxxx
    2. Xxxxxx
  3. XXXX
    1. Xxxxx
    2. Xxxxxx
  4. XXXXXXX

01. INTRODUÇÃO / OBJETIVO 

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, sendo possível pegar o que deseja e fazer as alterações necessária. Por exemplo, para desabilitar o 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 debilita-lo.  

O objeto deste utilitário e facilitar a manipulação destas informações que são recebidas pela EPC. 


02.XXXXXXXXXXXXXXXXX 

Xxxxxxxx

03.XXXXXXXXXXXXXXX 

Xxxxxxxx

04.XXXXXXXXXXXXXXXXXXXX 

Xxxxxxxx


---------------------
Construção das Classe
---------------------
CONSTRUCTOR CustomXXXX ( pOrigin, pObjParam ) - Purpose: Construtor da Classe 
Parameters:
- pOrigin: Local/Origem onde está sendo utilizado a Classe (usar a classe CustomOrig, ex: CustomOrig:ORIG_METADATA).
- pObjParam (JsonObject): JsonObeject de Parâmetros recebido pela UPC 
Retorno (CustomXXX): Instancia da Classe

------------------
CLASSE: CustomOrig - Purpose: Informar o Local/Origem onde está sendo utilizado a Classe
------------------
  - CustomOrig:ORIG_METADATA - Método de manipulação do Metadata
  - CustomOrig:ORIG_VLD_FORM - Método de manipulação do validateForm
  - CustomOrig:ORIG_VLD_FIELD - Método de manipulação do validateField
  - CustomOrig:ORIG_GET_RECORD - Método de manipulação na busca de um registro
  - CustomOrig:ORIG_GET_ALL - Método de manipulação na busca de vários registros
  - CustomOrig:ORIG_CREATE_RECORD - Método de criação de um registro
  - CustomOrig:ORIG_UPDATE_RECORD - Método de alteração de um registro
  - CustomOrig:ORIG_DELETE_RECORD - Método de eliminação de um registro

------------------
CLASSE: CustomPage - Purpose: Customizações da Página
------------------

MétodoDescriçãoExemplo
setPageTitle ( pCodTitle )
Parameters:
- pCodTitle (CHARACTER): Novo Titulo da Page 
Retorno (LOGICAL): Indicativo se foi possível alterar o Título
 - Purpose: Altera o Titulo da Page 
getPageTitle ( )
Retorno (CHARACTER): Título da Página
 - Purpose: Retorna o Titulo da Page 
setPageProperty ( pCodProperty, pCodValue )
Parameters:
- pCodProperty (CHARACTER): Propriedade que deve ser alterada
- pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor
Retorno (LOGICAL): Indicativo se foi possível alterar a Propriedade
 - Purpose: Altera uma propriedade da Tela
getPagePropertyCharacter ( pCodProperty )
getPagePropertyInteger ( pCodProperty )
getPagePropertyDecimal ( pCodProperty )
getPagePropertyLogical ( pCodProperty )
Parameters:
- pCodProperty (CHARACTER): Propriedade
Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade
 - Purpose: Retorna o valor de uma propriedade da Tela


--------------------
CLASSE: CustomFields - Purpose: Customizações de Campos
--------------------

MétodoDescriçãoExemplo
setFieldLabel ( pCodField, pCodLabel [, pGroupId] ) 
Parameters:
- pCodField (CHARACTER): Código do atributo
- pCodLabel (CHARACTER): Novo label do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível alterar o Label
 - Purpose: Altera o Label de um Atributo
setDisableField ( pCodField [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível desabilitar o atributo
 - Purpose: Desabilita um Atributo
setEnableField ( pCodField [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível habilitar o atributo
 - Purpose: Habilita um Atributo
setHideField ( pCodField [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível esconder o atributo
 - Purpose: Esconde um Atributo
setShowField ( pCodField [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível apresentar o atributo
 - Purpose: Mostra um Atributo
setFieldProperty ( pCodField, pCodProperty, pCodValue [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pCodProperty (CHARACTER): Propriedade que deve ser alterada
- pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor
- pGroupId (CHARACTER): Agrupador onde o atributo está contido
Retorno (LOGICAL): Indicativo se foi possível alterar a propriedade
 - Purpose: Altera uma propriedade de um Atributo
getFieldPropertyCharacter ( pCodField, pCodProperty [, pGroupId] )
getFieldPropertyInteger ( pCodField, pCodProperty [, pGroupId] )
getFieldPropertyDecimal ( pCodField, pCodProperty [, pGroupId] )
getFieldPropertyLogical ( pCodField, pCodProperty [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pCodProperty (CHARACTER): Propriedade
- pGroupId (CHARACTER): Agrupador onde o atributo está contido
Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade
 - Purpose: Retorna o valor de uma propriedade de um Atributo
getFields ( [pGroupId] )
Parameters:
- pGroupId (CHARACTER): Agrupador onde o atributo está contido
Retorno (JsonArray): Lista de Atributos
 - Purpose: Retorna um JsonArray que representa a lista de Atributos
getField ( pCodField [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (JsonObject): Um atributo
 - Purpose: Retorna um JsonObject que representa um Atributo
addField ( pCodField, pCodLabel, pCodType [, pPosition] [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do Atributo
- pCodLabel (CHARACTER): Label do Atributo
- pCodType (CHARACTER): Tipo do Atributo (usar a classe FieldType, ex: FieldType:STRING)
- pPosition: Posição onde o campo irá ficar no Formulário, usar uma da opções:
  - pIsFirst (LOGICAL): O Atributo será o Primeiro do Formulário (valor: YES) ou o Útimo (valor: NO)
  - pReferenceField (CHARACTER): Código de um Atributo já existente, onde o atributo ficará DEPOIS dele
  - Se não informado valor, o atributo será o Último do Formulário
- pGroupId (CHARACTER): Agrupador onde o atributo está contido
Retorno (JsonObject): Atributo Incluído
 - Purpose: Incluir um novo Atributo
changeFieldOrder ( pCodField [, pPosition] [, pGroupId] ) 
Parameters:
- pCodField (CHARACTER): Código do Atributo
- pPosition: Posição onde o campo irá ficar no Formulário, usar uma da opções:
  - pIsFirst (LOGICAL): O Atributo será o Primeiro do Formulário (valor: YES) ou o Útimo (valor: NO)
  - pReferenceField (CHARACTER): Código de um Atributo já existente, onde o atributo ficará DEPOIS dele
  - Se não informado valor, o atributo será o Último do Formulário
- pGroupId (CHARACTER): Agrupador onde o atributo está contido
Retorno (LOGICAL): Indicativo se foi possível alterar a ordem
 - Purpose: Altera a Ordem de um Atributo
setFieldValidate ( pCodField, pCodProg [, pGroupId] ) 
setFieldValidateCustom ( pCodField, pEndpoint [, pGroupId] )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pCodProg (CHARACTER): API-REST de Produto (deve ser enviado o terceiro parâmetro recebido pela UPC). Quando o atributo for alterado, será executado o Endpoint 'validateField' da API-REST do Produto
- pEndpoint (CHARACTER): Endpoint (método POST) que será executado quando o atributo for alterado. O caminho do Endpoint pode ser relativo (API-REST dentro do datasul) ou completo
- pGroupId (CHARACTER): Agrupador onde o atributo está contido 
Retorno (LOGICAL): Indicativo se foi possível incluir a propriedade no atributo
 - Purpose: Incluir a propriedade 'validate' no atributo (monitora a alterado do campo - evento validateField)
addValidateFields ( pCodField )
Parameters:
- pCodField (CHARACTER): Código do atributo
Retorno (LOGICAL): Lógico indicativo se foi possível incluir o atributo
Nota: Utilizar este método para tela que implementam o componente DynamicForm
 - Purpose: Inclui um atributo no ValidateFields do Formulário (evento validateForm) 
isChangedField ( pCodField )
Parameters:
- pCodField (CHARACTER): Código do atributo
Retorno (LOGICAL): Lógico indicativo se o atributo teve seu valor alterado
 - Purpose: Verifica se um Atributo foi alterado (eventos ValidateForm e ValidateField)
getReturnRoot ( )
Retorno (JsonObject): Root de retorno
 - Purpose: Retorno um JsonOject que representa o Root de retorno (eventos ValidateForm e ValidateField)
getFieldValueCharacter ( pCodField )
getFieldValueInteger ( pCodField )
getFieldValueDecimal ( pCodField )
getFieldValueLogical ( pCodField )
getFieldValueDate ( pCodField )
getFieldValueJsonObject ( pCodField )
getFieldValueJsonArray ( pCodField )
Parameters:
- pCodField (CHARACTER): Código do atributo
Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL,DATE,JsonObject,JsonArray): Valor do atributo
 - Purpose: Retorna o valor de um atributo

setFieldValue ( pCodField, pCodValue )
Parameters:
- pCodField (CHARACTER): Código do atributo
- pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL,DATE): Novo valor
Retorno (LOGICAL): Indicativo se foi possível alterar o atributo

 - Purpose: Altera o valor de um Atributo

getFieldValues ( )
Retorno (JsonObject): Valores do registro

 - Purpose: Retorno um JsonOject que representa os Valores do registro ou retorno(eventos ValidateForm e ValidateField)


---------------------
CLASSE: CustomActions - Purpose: Customizações de Ações da Página e da Tabela
---------------------

MétodoDescriçãoExemplo
setAction ( pCodAction, pCodValue )
Parameters:
- pCodAction (CHARACTER): Código da Action
- pCodValue: Valor da Action, usar uma das opções:
  - pCodURL (CHARACTER): Valor da URL a ser executada pela Action
  - pCodValue (LOGICAL): Valor da Action
Retorno (LOGICAL): Indicativo se foi possível incluir/alterar a Action
 - Purpose: Inclui ou Altera uma Action Padrão
getActionCharacter ( pCodAction )
getActionLogical ( pCodAction )
Parameters:
- pCodAction (CHARACTER): Código da Action
Retorno (CHARACTER,LOGICAL): Valor da Action
 - Purpose: Retorna o valor de uma Action Padrão
removeAction ( pCodAction )
Parameters:
- pCodAction (CHARACTER): Código da Action
Retorno (LOGICAL): Indicativo se foi possível remover a Action
 - Purpose: Remove uma Action Padrão
getActions ( )
Retorno (JsonObject): Actions padrões
 - Purpose: retorna um JsonObject que representa as Actions Padrão
setPageCustomActionProperty ( pIdAction, pCodProperty, pCodValue )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
- pCodProperty (CHARACTER): Propriedade que deve ser alterada
- pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor
Retorno (LOGICAL): Indicativo se foi possível alterar a propriedade
 - Purpose: Altera uma propriedade de uma Action Customizada de Página 
getPageCustomActionPropertyCharacter ( pIdAction, pCodProperty )
getPageCustomActionPropertyInteger ( pIdAction, pCodProperty )
getPageCustomActionPropertyDecimal ( pIdAction, pCodProperty )
getPageCustomActionPropertyLogical ( pIdAction, pCodProperty )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
- pCodProperty (CHARACTER): Propriedade
Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade
 - Purpose: Retorna o valor de uma propriedade de uma Action Customizada de Página
getPageCustomAction ( pIdAction ) 
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
Retorno (JsonObject): Uma Action Customizada de Página
 - Purpose: Retorna um JsonObject que representa uma Action Customizada de Página
addPageCustomAction ( pNumType, pCodLabel, pCodAddress [, pCodIcon] )
Parameters:
- pNumType: Tipo da Action, 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 Action
- pCodAddress (CHARACTER): Endereço da Action que será executada
- pCodIcon (CHARACTER): Ícone da Action
Retorno (JsonObject): Action Customizada de Página Incluída
 - Purpose: Incluir uma nova Action Customizada na Página
removePageCustomAction ( pIdAction )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
Retorno (LOGICAL): Indicativo se foi posssível remover a Action
 - Purpose: Remove uma Action Customizada de Página
getPageCustomActions ( )
Retorno (JsonArray): Actions Customizadas de Página
 - Purpose: Retorna a lista de Actions Customizadas de Página
setTableCustomActionProperty ( pIdAction, pCodProperty , pCodValue )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
- pCodProperty (CHARACTER): Propriedade que deve ser alterada
- pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor
Retorno (LOGICAL): Indicativo se foi possível alterar a propriedade
 - Purpose: Altera uma propriedade de uma Action Customizada de Tabela 
getTableCustomActionPropertyCharacter ( pIdAction, pCodProperty )
getTableCustomActionPropertyInteger ( pIdAction, pCodProperty )
getTableCustomActionPropertyDecimal ( pIdAction, pCodProperty )
getTableCustomActionPropertyLogical ( pIdAction, pCodProperty )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
- pCodProperty: Propriedade
Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL): Valor da Propriedade
 - Purpose: Retorna o valor de uma propriedade de uma Action Customizada de Tabela
getTableCustomAction ( pIdAction )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
Retorno (JsonObject): Uma Action Customizada de Tabela
 - Purpose: Retorna um JsonObject que representa uma Action Customizada de Tabela 
addTableCustomAction ( pNumType, pCodLabel, pCodAddress [, pCodIcon] [, pConcatKeys] )
Parameters:
- pNumType: Tipo da Action, 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 Action
- pCodAddress (CHARACTER): Endereço da Action que será executada
- pCodIcon (CHARACTER): Ícone da Action
- pConcatKeys (LOGICAL): Indica se deve ser acrescentada a propriedade "concatKeys" na Action
Retorno (JsonObject): Action Customizada de Tabela Incluída
 - Purpose: Incluir uma nova Action Customizada na Tabela
removeTableCustomAction ( pIdAction )
Parameters:
- pIdAction: Identificador da Action, usar uma das opções:
  - pCodLabel (CHARACTER): Label da Action
  - pNumIndex (INTEGER): Posição da Action dentro da Lista de Actions
Retorno (LOGICAL): Indicativo se foi posssível remover a Action
 - Purpose: Remove uma Action Customizada de Tabela
getTableCustomActions ( )
Retorno (JsonArray): Actions Customizadas de Tabela
 - Purpose: Retorna a lista de Actions Customizadas de Tabela
getServerAddress ( pIsExt )
Parameters:
- 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
 - Purpose: Retorna o Endereço onde o Datasul está hospedado


--------------------
CLASSE: CustomRecord - Purpose: Customizações de Registros
--------------------

MétodoDescriçãoExemplo
getEntityKeyCharacter ( )
getEntityKeyInteger ( )
Retorno (CHARACTER,INTEGER): Chave do registro
 - Purpose: Retorna a chave do Registro na manipulação do Metadata (alteração, detalhe) 
updateRecords ( pProg, pPiName )
Parameters:
- pProg (HANDLE): Handle do programa UPC
- pPiName (CHARACTER): Nome da PI que será executada a cada registro dos dados
Retorno (LOGICAL): Indicativo se é possível alterar o registro
Nota: A PI deve receber como parâmetro um JsonObject que representa o registro, ex:
      DEF INPUT PARAM oItem AS JsonObject NO-UNDO.
 - Purpose: Navega nos registros e executa uma PI interna da UPC para customização dos dados


----------------------
CLASSE: CustomMessages - Purpose: Geração de Mensagens
----------------------

MétodoDescriçãoExemplo
createMessageError ( pMsgNumber, pMsgDescription, pMsgHelp )
Parameters:
- 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
 - Purpose: Cria uma mensagem do tipo ERROR para enviar ao FrontEnd


---------------------------------------------------------------------------

UPC - EXEMPLOS


USING com.totvs.framework.po.*.


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.

DEF VAR oFields AS JsonArray  NO-UNDO.
DEF VAR oField  AS JsonObject NO-UNDO.
DEF VAR oAction AS JsonObject NO-UNDO.

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

    oCustPages   = NEW CustomPages(CustomOrig:ORIG_METADATA,   jsonIO).
    oCustFields  = NEW CustomFields(CustomOrig:ORIG_METADATA,  jsonIO).
    oCustActions = NEW CustomActions(CustomOrig:ORIG_METADATA, jsonIO).

    // Tela de Lista: Alterar o Título da Página
    oCustPages:setPageTitle(oCustPages:getPageTitle() + " - ALTERADO").
   
    // Tela de Lista: Se estiver salvando o Filtro, esconde o geranciador de Colunas
    IF oCustPages:getPagePropertyLogical("keepfilters") THEN
        oCustPages:setPageProperty("hideColumnsManager", TRUE).
        
    // Tela de Lista: Alterar o label da coluna "FIFO" para "FIFO-ALT"
    oCustFields:setFieldLabel("enableFIFOInPurchaseReq", "FIFO-ALT").
        
    // Tela de Lista: Incluir uma coluna chamada: "Cópia Usuário" com o valor da coluna "Usuário"
    ASSIGN oField = oCustFields:addField("userCopy", "Cópia Usuário", FieldType:STRING).
    IF oField <> ? THEN
        oField:ADD("allowColumnsManager", TRUE).
        
    // Tela e Lista: Retira a o Ação de "Excluir" da Tabela    
    oCustActions:setAction("remove", FALSE).
      
    // Tela de Lista: Retira a Ação de "Cópia"
    oCustActions:removeAction("duplicate").
    
    // Tela de Lista: Faz o Ação de Visualizar abrir a tela de Edição
    oCustActions:setAction("detail", oCustActions:getActionCharacter("edit")).
    
    // Tela de Lista: Incluir uma nova opção no Pagina chamada "EndPoint" que chama uma EndPoint
    oCustActions:addPageCustomAction(CustomActions:TYPE_ENDPOINT, "Endpoint", "http://localhost:3000/page").
    
    // Tela de Lista: Incluir uma nova opção no Pagina chamada "Rota" que chama uma Rota
    oCustActions:addPageCustomAction(CustomActions:TYPE_ROUTE, "Rota", "http://www.google.com", "po-icon po-icon-device-desktop").
    
    // Tela de Lista: Incluir o icone de Monitor na Ação "Endpoint" da Pagina
    oCustActions:setPageCustomActionProperty("Endpoint", "icon", "po-icon po-icon-device-desktop").
    
    // Tela de Lista: Alterar o Endereço da Ação "Endpoint" da Pagina, incluíndo um "2" no final
    oAction = oCustActions:getPageCustomAction(1).
    IF oAction <> ? THEN
        oAction:set("action", oCustActions:getPageCustomActionPropertyCharacter("Endpoint", "action") + "2").
    
    // Testa de Lista: Elimina a Ação de Rota da Pagina
    oCustActions:removePageCustomAction("ROTA").

    // Tela de Lista: Incluir uma nova opção no Tabela chamada "EndPoint" que chama uma EndPoint
    oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT, "Endpoint", "http://localhost:3000/table").
    
    // Tela de Lista: Incluir uma nova opção no Tabela chamada "EndPoint2" que chama uma EndPoint do Datasul
    oCustActions:addTableCustomAction(CustomActions:TYPE_ENDPOINT, "Endpoint2", oCustActions:getServerAddress(FALSE) + "\api\fin\v1\customer").
    
    // Tela de Lista: Incluir uma nova opção no Tabela chamada "Rota" que chama uma Rota
    oCustActions:addTableCustomAction(CustomActions:TYPE_ROUTE, "Rota", "http://www.google.com").
    
    // Tela de Lista: Incluir uma nova opção no Tabela chamada "Rota2" que chama uma Rota
    oCustActions:addTableCustomAction(CustomActions:TYPE_ROUTE, "Rota2", "http://www.google.com", "po-icon po-icon-device-desktop").
    
    // Tela de Lista: Incluir o icone de Monitor na Ação "Endpoint" da Tabela
    oCustActions:setTableCustomActionProperty("Endpoint", "icon", "po-icon po-icon-device-desktop").
    
    // Tela de Lista: Alterar o Endereço da Ação "Endpoint" da Table, incluíndo um "2" no final
    oAction = oCustActions:getTableCustomAction(1).
    IF oAction <> ? THEN
        oAction:set("action", oCustActions:getTableCustomActionPropertyCharacter("Endpoint", "action") + "2").
    
    // Testa de Lista: Elimina a Ação de Rota2 da Pagina
    oCustActions:removeTableCustomAction("Rota2").

    // oCustActions:getActions()
    // oCustActions:getPageCustomActions()
    // oCustActions:getTableCustomActions()
    
    // oCustRecords:getEntityKeyCharacter()
    // oCustRecords:getEntityKeyInteger()
    
    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:

    oCustFields = NEW CustomFields(CustomOrig:ORIG_METADATA, jsonIO).

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

    // Tela Novo/Editar: Esconder o campo "Desconto item" (Aba: Digitação/Geração)
    oCustFields:setHideField("itemDiscount", "fieldsTypingEnableDisable").

    // Tela Novo/Editar: Mostrar um campo "Geração nota crédito a pagar" (Aba: Digitação/Geração)
    oCustFields:setShowField("creditNoteGeneration", "fieldsTypingEnableDisable").

    // Tela Novo/Editar: 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.
    
    // Tela Novo/Editar: Pegua a quantidades de campos do agrupador "Habitar/Desabilitar Campos" e joga no label o campo "Sequência dos itens"
    ASSIGN oFields = oCustFields:getFields("fieldsTypingEnableDisable").
    IF oFields <> ? THEN DO:
        oField = oCustFields:getField("enableSequence", "fieldsTypingEnableDisable").
        IF oField <> ? THEN
            oField:SET("label", "Sequência dos itens (" + string(oFields:LENGTH) + ")").
    END.
 
    // Tela Novo/Editar: Colocar o Campo "Estado (UF)" depois do campo "Baixa estoque" (Aba: Digitação/Geração)
    oCustFields:changeFieldOrder("enableState", "enableStockMovement", "fieldsTypingEnableDisable").
    //oCustFields:changeFieldOrder("enableState", YES, "fieldsTypingEnableDisable"). // primeiro
    //oCustFields:changeFieldOrder("enableState",  NO, "fieldsTypingEnableDisable"). // último
 
    // Tela Novo/Editar: Ao 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)"
    oCustFields:setFieldValidate("execGZIPProgram", pAPI, "fieldsTypingConfigurations").
    //oCustFields:setFieldValidateCustom("execGZIPProgram", "/api/rep/v1/userParameters/validateField", "fieldsTypingConfigurations").
 
    // Tela Novo/Editar: Ao 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
    oCustFields:addValidateFields("enableICMSTaxationCode").

    DELETE OBJECT oCustFields NO-ERROR.
END.

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

    oCustRecords = NEW CustomRecords(CustomOrig:ORIG_GET_ALL, jsonIO).
    
    // Tela de Lista: Incluir uma coluna chamada: "Cópia Usuário" com o valor da coluna "Usuário"
    // Tela de Lista: Alterar o conteúdo da coluna "Nome", concatenado: "- Alterado"
    oCustRecords:updateRecords(THIS-PROCEDURE, "pi_altera_registros").

    DELETE OBJECT oCustRecords NO-ERROR.
END.

PROCEDURE pi_altera_registros:
    DEF INPUT PARAM oItem AS JsonObject NO-UNDO.

    oItem:ADD("userCopy", oItem:getCharacter("userCode")).
    
    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:

    oCustFields = NEW CustomFields(CustomOrig:ORIG_GET_RECORD, jsonIO).

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

    DELETE OBJECT oCustFields NO-ERROR.
END.

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

    oCustFields = NEW CustomFields(CustomOrig:ORIG_VLD_FORM, jsonIO).

    // Tela Novo/Editar: Ao 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 v_log_mark = oCustFields:getFieldValueLogical("enableICMSTaxationCode").
        
        IF v_log_mark <> ? THEN DO:
            oCustFields:setFieldProperty("enableICMSReductionPercentage", "disabled", v_log_mark).
              
            oCustFields:setFieldValue("enableICMSRate", v_log_mark).
        END.
    END.

    // oCustFields:getReturnRoot().
    // oCustFields:getFieldValues().
    
    DELETE OBJECT oCustFields NO-ERROR.
END.

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

    oCustFields = NEW CustomFields(CustomOrig:ORIG_VLD_FIELD, jsonIO).

    // Tela Novo/Editar: Ao 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 v_cod_caminho = oCustFields:getFieldValueCharacter("execGZIPProgram").

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

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

            oCustFields:setFieldValue("execGZIPProgram", v_cod_cam_ajust).
        END.
    END.

    DELETE OBJECT oCustFields NO-ERROR.
END.

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

    oCustFields = NEW CustomFields(CustomOrig:ORIG_UPDATE_RECORD, jsonIO).
    oCustMsgs   = NEW CustomMessages(CustomOrig:ORIG_UPDATE_RECORD, jsonIO).

    // Tela Editar: Valida se o campo "Caminho completo do executável GZIP" foi informado, se não foi, apresenta uma mensagem de Erro
    IF oCustFields:getFieldValueCharacter("execGZIPProgram") = "" OR oCustFields:getFieldValueCharacter("execGZIPProgram") = ? 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 !!!!").
        DELETE OBJECT oCustFields NO-ERROR.
        DELETE OBJECT oCustMsgs   NO-ERROR.
        RETURN "NOK".
    END.
    
    DELETE OBJECT oCustFields NO-ERROR.
    DELETE OBJECT oCustMsgs   NO-ERROR.
END.

RETURN "OK".