Configurador

Tabela e Campos – Tabelas Customizadas Protheus

Escritor por Vinícius Gregório

 

Olá,

 

Uma das tarefas mais comuns do analista desenvolvedor é criar projetos que envolvam um ou mais modelos de dados diferentes dos originais do sistema. Por “modelos de dados” estamos tratando de entidades que serão representadas por conjuntos de registros dentro de uma tabela na base de dados. Esses modelos podem ser necessários quando o conceito que eles abordam são extremamente particulares ao negócio de uma empresa e, portanto, não estão representados dentro das tabelas do padrão do sistema.

 

Nesse artigo vamos fazer um passo-a-passo de criação de uma tabela “customizada” na base de dados e como criar um cadastro para ela. Como exemplo, vamos gerar uma tabela bem simples, com dois campos apenas e que serve apenas para o propósito de estudo desse artigo. É um procedimento extremamente básico, mas para os analistas que estão começando é muito importante dominar completamente essas operações 😉

 

Acessando o Configurador

 

Para começar nosso tutorial, acesso o módulo Configurador do TOTVS Protheus (lembre-se que os campos Comunicação no cliente irá variar de acordo com a chave de comunicação – ip e porta – do seu arquivo smartclient.ini. Para o caso do campo Ambiente, a definição está no appserver.ini, dentro da instalação do servidor do Protheus):

 

 

Para acessar esse módulo, o seu usuário deve ter a permissão de acesso devida para manutenção do SIGACFG (verifique as permissões de seu usuário). Após acessar o módulo, entre nas opções Dicionário > Base de Dados no menu:

 

 

Essa tela nos traz a manutenção do dicionário de dados do Protheus. O dicionário de dados é um cadastro (em diversos arquivos-tabelas) que define a estrutura da base de dados e alguns comportamentos específicos do sistema, como Gatilhos (preenchimentos automáticos de determinados campos, quando o usuário preenche uma informação em outro campo), validações de dados, máscaras de preenchimento

Fique atualizado, É GRÁTIS!
Cadastre o seu endereço de e-mail e fique por dentro de todas as atualizações da AcademiaERP.
Não enviamos spam.

No frame lateral, vamos selecionar a opção Dicionário de Dados. No painel lateral direito, uma listagem das tabelas cadastradas no dicionário de dados será apresentada.

 

 

Incluindo uma nova tabela (SX2)

 

Vamos incluir uma nova tabela clicando em    na barra superior.  A seguinte tela será exibida:

 

Vamos preencher os campos apresentados da seguinte forma:

  • Prefixo: Esse é o Alias da tabela. Seu código representativo. Como estamos criando uma tabela temporária, existem alguns grupos de códigos que normalmente são utilizados para a criação de tabelas customizadas (SZx, Pxx, Zxx … onde “x” são caracteres abstratos que podem ir de 0 a Z). No nosso caso, vamos criar a tabela “ZZZ”;

  • Path: Esse é o caminho, dentro do Protheus_Data, onde essa tabela será salva. Na realidade, esse campo só é útil quando utilizamos bases de dados DBF ou CDX, que criam um arquivo físico representando cada uma das tabelas do sistema;

  • Nome: É o nome completo da tabela dentro da base de dados (novamente, para bases DBF ou CDX, esse será o nome do arquivo, seguido da sua extensão. Ex: ZZZ990.DBF). Em bases de dados SQL, o sistema irá criar uma tabela (CREATE TABLE) com esse nome dentro do banco. A estrutura para esse nome é bem simples de ser decomposta: ZZZ é o código da tabela, 99 é o número da empresa (no nosso caso, estamos usando a empresa de testes 99) e 0 é o sufixo final reservado (o último caracter do nome de uma tabela sempre será 0);

  • Descrição: Esse campo é utilizado para descrever a utilidade dessa tabela. Geralmente, é utilizado para descrever a entidade que é representada por cada um dos registros da tabela (Ex.: Clientes);

  • Ac. Filial, Ac. Unidade e Ac. Empresa: Determina se essa tabela será compartilhada ou exclusiva dentro do sistema de filiais, unidades de negócio e empresas do sistema. Uma tabela pode ser compartilhada de forma diferente dentro de cada nível de estrutura da organização da empresa dentro do sistema. Dessa forma, uma tabela compartilhada entre filiais vai ter registros de todas as filiais de uma determinada unidade de negócio e empresa dentro dela e, consequentemente, independente da filial em que o usuário estiver logado, ele poderá consultar todos esses registros;

 

Após preencher esses campos, é necessário clicar em no botão verde na barra superior para que o Configurador crie a estrutura básica da tabela na memória:

 

 

Criação de campos (SX3)

 

Com a estrutura básica da tabela já criada, vamos criar os campos (colunas da base de dados para ela). Com a tabela ZZZ selecionada na grid, clique no botão Editar na barra superior. Aparecerá uma tela com a estrutura da tabela.

 

 

Selecione, no frame lateral esquerdo, a opção Campos e depois clique em

 

 

Será apresentado para o usuário uma tela com campos que irão representar um as propriedades de um campo dentro da tabela na base de dados. Vamos analisar cada um dos campos disponíveis para preenchimento:

 

  • Campo: Esse campo determina qual será o nome da coluna dentro da base de dados. Por convenção, o nome de um campo deve conter parte do nome de sua tabela. No caso de tabelas começadas com S, normalmente do padrão, o campo deve começar com o segundo e terceiro caracteres do código da tabela, seguindo de underline (Ex.: A1_ para campos da SA1). Para tabelas customizadas (como é nosso caso) o campo deve começar com o código da tabela, seguindo de underline (Ex: ZZZ_ para campos da tabela ZZZ);

  • Tipo: Descreve qual o tipo de dado que será armazenado nesse campo (Caracter, Númerico, Lógico, Data, Memo);

  • Tamanho e Decimal: Esse campo serve para limitar o tamanho do campo que será criado. Para o caso de campos numéricos, o campo Decimal informa quantas posições serão utilizadas depois da vírgula;

  • Formato: Esse campo determina qual a máscara que será utilizada para o preenchimento do campo. A máscara funciona como uma validação de quais caracteres serão aceitos no preenchimento dos campos. Para preencher esse campo, é necessário que o usuário se familiarize com alguns padrões de que determinam quais os caracteres aceitos, chamados de wildcards (Ex: @! para campos de texto e @E 9..9,99 para campos númericos);

  • Contexto: Define se o campo que estamos criando será um campo físico dentro da base de dados ou somente uma estrutura virtual dentro do dicionário. Essa informação é muito importante e gera muita confusão em desenvolvedores iniciantes. Um campo virtual, embora esteja presente para que o usuário o edite, não será salvo na base de dados, uma vez que não existe uma coluna pra ele na tabela. Seu propósito é de ser um facilitador para rotinas de preenchimento ou visualização de informações durante a manutenção do registro;

  • Propriedade: Determina se o campo poderá ser editado pelos usuários ou somente visualizado. Campos visuais ficam desabilitados enquanto o usuário estiver realizando a manutenção no registro;

 

 

  • Título, Tit. Espanhol, Tit. Inglês: Campos utilizados para colocar o nome do campo para o usuário. Como o sistema trabalha com um sistema de 3 idiomas, existem campos para cada um deles;

  • Descrição, Des. Espanhol e Des. Inglês: Esses campos são um nível mais detalhado da descrição do campo, permitindo o preenchimento de mais caracteres;

  • Help: O campo de Help é uma descrição completa da funcionalidade do campo. Seu conteúdo é exibido quando o usuário está posicionado dentro da edição do campo e aperta F1 (Ajuda);

 

  • Lista Opções, Lista Espanhol, Lista Inglês: Os campos de Lista são utilizados para campos que serão representados visualmente por um objeto de seleção do tipo ComboBox. Nesse campo é possível determinar a listagem de opções seguindo esse padrão: X=Descrição da Opção;Y=Descrição da Outra Opção. X e Y representam os valores possíveis para o campo, após de cada sinal de = fica a descrição da opção e cada opção é separada por ponto-e-vírgula;

  • Inic. Padrão: Essa informação determina qual o valor inicial (quando um novo registro é gerado) para o campo. Aqui podem ser utilizadas também funções, onde o retorno da função será o valor inicial do campo. É muito importante sempre tomar atenção para que o valor inicial do campo seja condizente com o tipo de informação que ele pode armazenar;

  • Inic. Browse: Determina qual será o valor exibido para esse campo em listagens de registros, como MBrowse, MarkBrowses e outros. Caso não seja preenchido, o valor real do campo (para campos reais da base de dados, não virtuais) será exibido;

  • Modo Edição: Define uma condição booleana (.T. ou .F.) para que este campo esteja habilitado para edição. Caso não preenchido, o campo estará disponível para edição (no caso de inclusões ou alterações no registro);

  • Cons. Padrão: Define qual será a consulta utilizada para esse campo. Uma consulta padrão é uma forma de listar registros de outra tabela para o usuário, facilitando o seu preenchimento (pode ser acessada através da tecla de atalho F3). É utilizada em campos que determinam uma chave estrangeira dentro da tabela. Para todos os outros casos, não é obrigatório preencher essa informação;

 

 

  • Val. Usuário, Val. Sistema: Determinam regras de validação para que o preenchimento desse campo seja válido. Essas regras devem ser expressas através de expressões de programação que dêem um retorno booleano (.T. a informação é válida, .F. a informação não é válida e o usuário retorna fica “preso” no campo até corrigir). Ex.: Positivo() —-> para verificar se o preenchimento de um campo numérico é um número positivo;

  • Nível: Define qual o nível de usuário necessário para visualizar e editar esse campo;

 

 

  • Obrigatório: Esse checkbox determina se o preenchimento do campo é obrigatório;

  • Usado: Esse checkbox determina se esse campo está em uso pela regra de negócio do sistema. Caso o campo venha a se tornar obsoleto e o responsável não queira excluí-lo (para não perder informaçõe históricas talvez), é possível simplesmente desmarcar essa opção e desativá-lo;

  • Browse: Esse checkbox define se esse campo será exibido em listagens de registros dessa tabela, como MBrowse ou MarkBrowse, por exemplo;

 

 

  • Módulos: Determina em quais módulos do sistema esse campo será utilizado. Normalmente, não é necessário alterar esse tipo de controle de acesso 🙂

 

Como iremos criar alguns campos para essa tabela, vou listar as informações de preenchimento dos campos (após preencher os campos corretamente, clique em Confirmar e depois em Incluir para criar o novo campo):

 

Campo: ZZZ_USER
Tipo: Caracter
Tamanho: 6
Formato: @!
Contexto: Real
Propriedade: Visualizar
Inic Padrão: RetCodUsr()    —–> essa função retorna o código do usuário que está logado no sistema no momento. Ou seja, caso o Administrador esteja utilizando o sistema, a função irá pegar o código “000000” e colocar como valor padrão desse campo;
Obrigatório, Usado e Browse

Campo: ZZZ_NOMUSR
Tipo: Caracter
Tamanho: 60
Formato: @!
Contexto: Virtual  —–> esse é um ótimo exemplo de campo virtual. Como o objetivo do campo é exibir o nome do usuário e não alterá-lo, não existe motivos para ter essa informação duplicada nessa tabela dentro da base de dados. Pensando em normalização da nossa base de dados, como essa informação virá de uma outra tabela e é armazenada lá, esse campo não deve ser real dentro da base de dados e sim somente um facilitador para o usuário;
Propriedade: Vizualizar  —–> novamente, igual ao comentário anterior. Como não há motivos para o usuário alterar essa informação, esse campo pode ser somente visual;
Inic Padrão: USRFULLNAME(RETCODUSR()) —–> Esse é um ótimo exemplo de encadeamento de funções. A função USRFULLNAME() retorna o nome completo do usuário passado como parâmetro e a função RETCODUSR(), como já vimos, retorna o código do usuário autenticado no sistema. Assim, o valor inicial desse campo é o nome do usuário autenticado no momento;
Inic.Browse: USRFULLNAME(ZZZ->ZZZ_USER)  —–> Quando o usuário visualizar uma listagem de registros da tabela ZZZ, é interessante que ele veja o nome completo do usuário e não somente o seu código. Para isso, temos que preencher o Inicializador de Browse. O contéudo é igual ao inicializador padrão, exceto que ao invés de passarmos o código do usuário autenticado no momento, vamos passar o campo ZZZ_USER (imagine que diversos usuários cadastraram registros na tabela e você, depois disso, irá visualizar esses registros. Você irá ver o nome de cada um desses usuários e não o seu nome diversas vezes :p )
Usado e Browse

Campo: ZZZ_NUMERO
Tipo: Numérico
Tamanho: 9
Decimal: 2
Formato: @E 999,999.99    —-> perceba que a contagem do tamanho – 9 – leva em consideração o ponto separador e os 2 dígitos decimais. A vírgula funciona como um separador estético e, portanto, não entra na contagem de tamanho
Contexto: Real
Propriedade: Alterar
Val. Usuário: POSITIVO()
Obrigatório, Usado e Browse

 

Conclusão

 

Vamos fazer uma pausa por enquanto para que você possa assimilar e testar cada uma dessas opções. Nos próximos artigos, vamos falar sobre a criação de índices, gatilhos, efetivação das alterações dentro da base de dados, agendamento dessa efetivação, criação de um cadastro simples para essa tabela e como visualizar a estrutura dessa tabela diretamente dentro do dicionário de dados. Abraços e até lá.

 

Sobre o Autor

Vinícius Gregório

Tecnólogo em análise de sistemas da informação pela Faculdade IBTA (SP), empreendedor da área de TI e consultor Protheus especializado em desenvolvimento AdvPL. Trabalhou em diversos projetos com os módulos de Compras, Estoque/Custos, Faturamento, Contabilidade Gerencial, Field Service/Gestão de Serviços, Financeiro, Gestão de Contratos e Gestão de Projetos. Atua também como desenvolvedor de sistemas web e é usuário fanático de sistemas e softwares open source... (vinicius.gregorio@academiaerp.com.br)

4 comentários

Deixe um comentário

Dúvida?