Á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

...

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.
//
DEF 
Valida
VAR 
se
vName 
o
AS 
campo "Caminho completo do executável GZIP" foi
// informado, se não foi, retorna uma mensagem de Erro
ASSIGN vValorAtual
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
"Nome OBRIGATÓRIO",

"O
 
campo
 
'Caminho
 
completo
 
do
 
executável
 
GZIP'
"O 
deve
nome 
ser
do 
informado,
cliente 
não pode ser branco
é obrigatório !").

// Indica que não deve ser Salvo a Alteração do Registro

IF
 
vValorAtual
 
=
 
"" 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",
                                     "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".

...