Árvore de páginas

CONTEÚDO

  1. INTRDUÇÃO / OBJETIVO
  2. UTILIZAÇÃO DO UTILITÁRIO
  3. CLASSES
    1. CustomOrig
    2. CustomPages
    3. CustomFields
    4. CustomActions
    5. CustomRecords
    6. CustomMessages
  4. EXEMPLOS DA UTILIZAÇÃO DAS CLASSES

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, 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 debilitá-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

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

O utilitário disponibiliza um conjuntos de Classes que podem ser utilizadas diretamente dentro da UPC para executar as ações desejadas.

As classes estão dividas conforme a parte que será customizada, por exemplo, para alterar campos do formulário, deve ser utilizada a classe CustomFields, para alterar as ações, deve ser utilizada a CustomActions, e assim por diante.

Para utilizá-las, é necessário informar o caminho onde estão disponíveis. Portanto, deve ser incluída a linha de comando abaixo no início da UPC:

USING com.totvs.framework.po.*.

Todas as classes seguem o mesmo padrão de utilização e recebem os mesmos parâmetros, conforme descrito abaixo:

  • 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/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.

Abaixo segue um exemplo da utilização da classe "CustomFields", como o objetivo de desabilitar um campo do Formulário de Inclusão/Edição:

Exemplo utilização da classe CustomFields
// 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.

03. CLASSES

Abaixo segue a lista das Classes disponíveis, indicando o objetivo de cada uma delas, juntamente com os Métodos disponíveis.

a. CustomOrig

Este é uma classe auxiliar, que não possui métodos. Ela é utilizada apenas para definir as opções disponíveis de pontos de customização.

No momento em que uma das classes do utilitário é instanciada, é necessário indicar a ela, em que ponto da UPC ela está sendo utilizada. Este ponto corresponde ao Endpoint/Evento que está sendo customizado. Isto é necessário pois, dependendo do Endpoint/Evento, a estrutura das informações recebidas pela UPC é diferente, portanto a classe precisa saber o ponto, para saber onde buscar/alterar a informação desejada.

Abaixo segue a lista da opções disponíveis:

  • CustomOrig:ORIG_METADATA - Utilizar nos pontos relacionados a alterações no Metadata da tela HTML;
  • CustomOrig:ORIG_VLD_FORM - Utilizar nos pontos relacionados ao evento de "validateForm" (quando algum campo do formulário é alterado);
  • CustomOrig:ORIG_VLD_FIELD - Utilizar nos pontos relacionados ao evento de "validateField" (quando um determinado campo é alterado);
  • CustomOrig:ORIG_GET_RECORD - Utilizar nos pontos relacionados a busca de um determinado registro;
  • CustomOrig:ORIG_GET_ALL - Utilizar nos pontos relacionados a busca de várias registros;
  • CustomOrig:ORIG_CREATE_RECORD - Utilizar nos pontos relacionados a criação de um registro;
  • CustomOrig:ORIG_UPDATE_RECORD - Utilizar nos pontos relacionados a alteração de um registro;
  • CustomOrig:ORIG_DELETE_RECORD - Utilizar nos pontos relacionados a exclusão de um registro.

Abaixo segue um exemplo da utilização deste classe, na instancia da classe CustomFields, para o evento de validateForm:

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

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

b. CustomPages

Classe utilizada para manipular as propriedades gerais da Página, como por exemplo o Título dela.


MétodoDescriçãoExemplo

setPageTitle ( pCodTitle )

Parâmetros:

  • pCodTitle (CHARACTER): Novo Titulo da Página.

Retorno (LOGICAL): Indicativo se foi possível alterar o Título.

Altera o Titulo da página.
oCustPages:setPageTitle("Clientes Prime").

getPageTitle ( )

Retorno (CHARACTER): Título da Página.

Retorna o Titulo da página. 
ASSIGN vTitulo = oCustPages:getPageTitle().
... Faz algo com o título

setPageProperty ( pCodProperty , pCodValue )

Parâmetros:

  • 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 da página.
oCustPages:setPageProperty("keepfilters", TRUE).

getPagePropertyCharacter ( pCodProperty )

getPagePropertyInteger ( pCodProperty )

getPagePropertyDecimal ( pCodProperty )

getPagePropertyLogical ( pCodProperty )

Parâmetros:

  • pCodProperty (CHARACTER): Propriedade.

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

Retorna o valor de uma propriedade da página.
ASSIGN vConctFilter =
oCustPages:getPagePropertyLogical("concatFilters").
... Faz algo com a informação

c. CustomFields

Classe utilizada para realizar customizações relacionadas aos campos, tais como: alterar o label, desabilitar, esconder, etc.. Através dela, também é possível incluir campos customizados, assim como atualizar o valor dos mesmos. Ela pode ser utilizada para tratar tanto os campos de Tabelas, como de Formulários.


MétodoDescriçãoExemplo

setFieldLabel ( pCodField , pCodLabel [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodLabel (CHARACTER): Novo label do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível alterar o Label.

Altera o Label de um campo.
Exemplo1:
oCustFields:setFieldLabel("enableFIFOInPurchaseReq",
"FIFO-ALT").

Exemplo2:
oCustFields:setFieldLabel("consistsUnitPrice",
                     "Consistir preço único",
"fieldsTypingValidations").

setDisableField ( pCodField [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível desabilitar o campo.

Desabilita um campo.
Exemplo1:
oCustFields:setDisableField("variationIssuing").

Exemplo2:
oCustFields:setDisableField("updatesWithDuplicateError",
"fieldsUpdateFiscalConfigurations").

setEnableField ( pCodField [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível habilitar o campo.

Habilita um campo.
Exemplo1:
oCustFields:setEnableField("acceptableTaxDifference").

Exemplo2:
oCustFields:setEnableField("enableBusinessUnit",
"fieldsTypingEnableDisable").

setHideField ( pCodField [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível esconder o campo.

Esconde um campo.
Exemplo1:
oCustFields:setHideField("itemDiscount").

Exemplo2:
oCustFields:setHideField("defaultSpeciesExpenses",
"fieldsTypingDuplicates").

setShowField ( pCodField [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível apresentar o campo.

Mostra um campo.
Exemplo1:
oCustFields:setShowField("creditNoteGeneration").

Exemplo2:
oCustFields:setShowField("receiveWithoutOrder",
"fieldsTypingOrders").

setFieldProperty ( pCodField , pCodProperty , pCodValue [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodProperty (CHARACTER): Propriedade que deve ser alterada;
  • pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL): Novo valor;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

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

Altera uma propriedade de um campo.
Exemplo1:
oCustFields:setFieldProperty("itemDiscount",
"required",
TRUE).

Exemplo2:
oCustFields:setFieldProperty("enableSequence",
"booleanTrue",
"Ligado",
  "fieldsTypingEnableDisable").

getFieldPropertyCharacter ( pCodField , pCodProperty [ , pGroupId ] )

getFieldPropertyInteger ( pCodField , pCodProperty [ , pGroupId ] )

getFieldPropertyDecimal ( pCodField , pCodProperty [ , pGroupId ] )

getFieldPropertyLogical ( pCodField , pCodProperty [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodProperty (CHARACTER): Propriedade;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

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

Retorna o valor de uma propriedade de um campo.
Exemplo1:
ASSIGN vOrder =
oCustFields:getFieldPropertyInteger("defaultDuplic",
"order").
... Faz algo com a informação

Exemplo2:
ASSIGN vType =
oCustFields:getFieldPropertyCharacter("enableSequence",
"type",
"fieldsTypingEnableDisable").
... Faz algo com a informação

getFields ( [ pGroupId ] )

Parâmetros:

  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (JsonArray): Lista de campos.

Retorna um JsonArray que representa a lista de campos.
Exemplo1:
DEF VAR oFields AS JsonArray NO-UNDO.
ASSIGN oFields = oCustFields:getFields().
IF oFields <> ? AND oFields:LENGTH > 10 THEN ...

Exemplo2:
DEF VAR oFields AS JsonArray NO-UNDO.
ASSIGN oFields = oCustFields:getFields("fieldsTax").
IF oFields <> ? AND oFields:LENGTH <> 0 THEN ...

getField ( pCodField [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (JsonObject): Um campo.

Retorna um JsonObject que representa um campo.
Exemplo1:
DEF VAR oField AS JsonObject NO-UNDO.
oField = oCustFields:getField("totalTax",
"fieldsTax").
IF oField <> ? THEN
oField:ADD("allowColumnsManager", TRUE).

Exemplo2:
DEF VAR oField AS JsonObject NO-UNDO.
oField = oCustFields:getField("enableAutomaticDuplicate").
IF oField <> ? THEN
oField:SET("order", 10).

addField ( pCodField , pCodLabel , pCodType [ , pPosition ] [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodLabel (CHARACTER): Label do campo;
  • pCodType (CHARACTER): Tipo do campo (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 campo será o Primeiro do Formulário (valor: YES) ou o Útimo (valor: NO);
    • pReferenceField (CHARACTER): Código de um campo já existente, onde o campo ficará DEPOIS dele.
    • É opcional, se não informado valor, o campo será o Último do Formulário.
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (JsonObject): campo Incluído.

Incluir um novo campo.
Exemplo1:
ASSIGN oField = oCustFields:addField("userCopy",
"Cópia Usuário",
FieldType:STRING).

Exemplo2:
ASSIGN oField = oCustFields:addField("codeTax",
"Código Imposto",
FieldType:NUMBER,
TRUE).

Exemplo3:
ASSIGN oField = oCustFields:addField("datAdmin",
"Data Admissão",
FieldType:DATE,
"enableSequence",
"fieldsTypingEnableDisable").

changeFieldOrder ( pCodField [ , pPosition ] [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pPosition: Posição onde o campo irá ficar no Formulário, usar uma da opções:
    • pIsFirst (LOGICAL): O campo será o Primeiro do Formulário (valor: YES) ou o Útimo (valor: NO);
    • pReferenceField (CHARACTER): Código de um campo já existente, onde o campo ficará DEPOIS dele;
    • É opcional, se não informado valor, o campo será o Último do Formulário.
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

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

Altera a Ordem de um campo.
Exemplo1:
oCustFields:changeFieldOrder("name").

Exemplo2:
oCustFields:changeFieldOrder("cpf",
TRUE).

Exemplo3:
oCustFields:changeFieldOrder("enableState",
"enableStockMovement",
"fieldsTypingEnableDisable").

setFieldValidate ( pCodField , pCodProg [ , pGroupId ] )

setFieldValidateCustom ( pCodField , pEndpoint [ , pGroupId ] )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodProg (CHARACTER): API-REST de Produto (deve ser enviado o terceiro parâmetro recebido pela UPC). Quando o campo for alterado, será executado o Endpoint 'validateField' da API-REST do Produto;
  • pEndpoint (CHARACTER): Endpoint (método POST) que será executado quando o campo for alterado. O caminho do Endpoint pode ser relativo (API-REST dentro do datasul) ou completo;
  • pGroupId (CHARACTER): Agrupador onde o campo está contido. É opcional, se não for informado, será considerado o agrupador padrão "fields".

Retorno (LOGICAL): Indicativo se foi possível incluir a propriedade no campo.

Incluir a propriedade 'validate' no campo (monitora a alterado do campo - evento validateField).
Exemplo1:
oCustFields:setFieldValidate("allowedVariation",
pAPI).

Exemplo2:
oCustFields:setFieldValidate("execGZIPProgram",
pAPI,
"fieldsTypingConfigurations").

Exemplo3:
oCustFields:setFieldValidateCustom("receiveVendorOrder",
"/api/cdpcus/v1/orders").

Exemplo4:
oCustFields:setFieldValidateCustom("oderNumber",
"http://server:3000/vdlOrder/validateField",
"fieldsUpdateFiscalValidations").

addValidateFields ( pCodField )

Parâmetros:

  • pCodField (CHARACTER): Código do campo.

Retorno (LOGICAL): Lógico indicativo se foi possível incluir o campo.

Inclui um campo no ValidateFields do Formulário (evento validateForm).

Observação: Utilizar este método para telas HTML que implementam o componente DynamicForm.

oCustFields:addValidateFields("enableICMSTaxationCode").

isChangedField ( pCodField )

Parâmetros:

  • pCodField (CHARACTER): Código do campo.

Retorno (LOGICAL): Lógico indicativo se o campo teve seu valor alterado.

Verifica se um campo foi alterado (eventos ValidateForm e ValidateField).
IF oCustFields:isChangedField("enableICMSTaxationCode")
THEN DO:
... Realiza algum tratamento
END.

getReturnRoot ( )

Retorno (JsonObject): Root de retorno.

Retorna um JsonOject que representa o Root de retorno (eventos ValidateForm e ValidateField).
DEFINE VARIABLE oRoot AS JsonObject NO-UNDO.
oRoot = oCustFields:getReturnRoot().
... Faz algo com a informação

getFieldValueCharacter ( pCodField )

getFieldValueInteger ( pCodField )

getFieldValueDecimal ( pCodField )

getFieldValueLogical ( pCodField )

getFieldValueDate ( pCodField )

getFieldValueJsonObject ( pCodField )

getFieldValueJsonArray ( pCodField )

Parâmetros:

  • pCodField (CHARACTER): Código do campo.

Retorno (CHARACTER,INTEGER,DECIMAL,LOGICAL,DATE,JsonObject,JsonArray): Valor do campo.

Retorna o valor de um campo.
Exemplo1:
ASSIGN vValorAtual =
oCustFields:getFieldValueCharacter("execGZIPProgram").
... Faz algo com a informação

Exemplo2:
ASSIGN vValorMark =
oCustFields:getFieldValueLogical("enableICMSTaxCode").
... Faz algo com a informação

setFieldValue ( pCodField , pCodValue )

Parâmetros:

  • pCodField (CHARACTER): Código do campo;
  • pCodValue (CHARACTER,INTEGER,DECIMAL,LOGICAL,DATE): Novo valor.

Retorno (LOGICAL): Indicativo se foi possível alterar o campo.

Altera o valor de um campo.
Exemplo1:
oCustFields:setFieldValue("execGZIPProgram",
vValorAjust).

Exemplo2:
oCustFields:setFieldValue("variationIssuing",
888).

getFieldValues ( )

Retorno (JsonObject): Valores do registro.

Retorna um JsonOject que representa os Valores do registro.
DEFINE VARIABLE oValues AS JsonObject NO-UNDO.
oValues = oCustFields:getFieldValues().
... Faz algo com a informação

d. CustomActions

Classe utilizada para realizar customizações relacionadas as Ações da tela HTML. Estas ações podem ser de 2 tipos:

  • Ações Padrões: Correspondem as ações: Incluir, Editar, Copiar, Visualizar e Excluir.
  • Ações Customizadas: Correspondem a qualquer outra ação que não seja padrão, incluídas pelo próprio produto ou de forma customizada. Exemplo: "Atualiza Doc".

Através desta classe, é possível manipular as ações existentes na Páginas e também nas Tabelas.


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

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;
  • 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.

oCustRecords:updateRecords(THIS-PROCEDURE, "pi_altera_registros").

PROCEDURE pi_altera_registros:
DEF INPUT PARAM oItem AS JsonObject NO-UNDO.
FIND minha-tabela WHERE
minha-tabela.cod-cliente = oItem:getCharacter("userCode")
NO-LOCK NO-ERROR.
IF AVAIL minha-tabela THEN
oItem:ADD("myInform", minha-tabela.cod-minha-info).
END PROCEDURE.

f. CustomMessages

Classe utilizada para criação de mensagens 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 VAR vName AS CHARACTER NO-UNDO.

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

IF vName = "" OR vName = ? THEN DO:
jsonIO = oCustMsgs:createMessageError(1,
"Nome OBRIGATÓRIO",
"O nome do cliente é obrigatório !").
RETURN "NOK".
END.

04. EXEMPLOS DA UTILIZAÇÃO DAS CLASSES

Abaixo segue o exemplo de uma UPC utilizado grande parte dos métodos das classes do utilitário:

Exemplo UPC
// 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 auxiliares
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".






  • Sem rótulos