Pragiva — Tecnologia na prática

Tabelas genéricas (SX5): listas fixas sem criar tabela nova

Tabelas genéricas (SX5): como a SX5 guarda uma lista de código e descrição, como um campo usa uma delas com F3 e ExistCpo e como achar código livre.

Protheus Referência técnica 6 min de leitura

Assista o vídeo

Resposta rápida

Onde fica
Configurador, Tabelas Genéricas — gravado na SX5.
Serve para
lista fixa de código e descrição, usada em mais de um lugar.
Como um campo usa
X3_F3 com o código da tabela e ExistCpo("SX5", "<tabela>" + M->campo) na validação — é assim no estado do cliente.
Armadilha
a tabela 01 não é lista, é a numeração das notas fiscais.
Código livre
confira na tabela 00; o padrão também usa códigos com X e Z.
Consulta rápida5 seções

Estados do Brasil, tipos de produto, séries de nota fiscal: listas curtas, que quase não mudam e cabem em “código e descrição”. Para isso o Protheus não cria uma tabela por lista. Ele tem uma tabela de listas, a , e cada lista é identificada por um código de duas posições. A documentação da TOTVS resume o ganho: poupa criar tabela e consulta padrão adicionais só para guardar um domínio simples.

Como a SX5 guarda uma lista

ColunaO que guarda
Filial — em branco quando a SX5 é compartilhada
O código da tabela genérica: 12, 01, 02…
O código do item dentro da tabela
A descrição em português
, A descrição em espanhol e em inglês

O índice é X5_FILIAL+X5_TABELA+X5_CHAVE. Buscar um item é sempre filial + tabela + chave.

A tabela 12, por exemplo, são as unidades federativas: AC, AL, AM… até TO, mais EX, com a descrição ESTRANGEIRO — 28 itens, a descrição com o nome do estado em maiúsculas. Na base que conferimos, a chave tem 6 posições e a descrição 55; confira no seu ambiente antes de planejar uma lista.

E existe uma tabela das tabelas: a 00. Cada chave dela é o código de uma tabela genérica, com o nome na descrição — 01 Séries de N. Fiscais, 02 Tipos de Materiais, 12 Unidade Federativa. É o índice que diz o que cada código significa.

Como um campo usa uma tabela genérica

O exemplo está no cadastro de clientes. O estado do cliente, :

PropriedadeValorO que faz
X3_F312A consulta do campo aponta a tabela genérica 12
X3_VALIDExistCpo("SX5","12"+M->A1_EST) .AND. IE(M->A1_INSCR,M->A1_EST)Recusa sigla que não esteja na tabela 12

O ExistCpo recebe a tabela ("SX5") e a chave de busca — o código da tabela genérica concatenado com o que o usuário digitou. Sem o "12" na frente, a busca procuraria a sigla como se fosse um código de tabela. O comportamento de ExistCpo e das outras funções de validação está em Validação de campo.

O mesmo desenho aparece em todo o dicionário padrão: o tipo do produto () tem X3_F3 = 02, a tabela de tipos de materiais; campos de série de nota apontam 01; outros validam com ExistCpo("SX5","A2"+...), ExistCpo("SX5","A4"+...). Consulta de duas posições apontando código de tabela genérica é padrão, não exceção.

A TOTVS documenta ainda um segundo caminho: criar uma consulta padrão sobre a SX5, com filtro na tabela desejada, e usá-la no campo. Serve quando você quer controlar as colunas mostradas ou o filtro — as consultas padrão têm artigo próprio.

Para mostrar a descrição em código ou num campo virtual, o padrão usa Posicione() na SX5 — há campo do cadastro de produtos buscando a descrição com POSICIONE("SX5",1,XFILIAL("SX5")+"XJ"+SB1->B1_GRPTI,"X5_DESCRI"). Para o estado:

ADVPL / TLPP
cNomeUF := Posicione("SX5", 1, xFilial("SX5") + "12" + SA1->A1_EST, "X5_DESCRI")

A tabela 01 não é uma lista qualquer

A tabela 01 tem as séries de nota fiscal: 1, A, B, UNI… Só que ali o X5_DESCRI não guarda um nome — guarda um número, como 000059. Segundo a Central de Atendimento TOTVS, quando a numeração da nota de saída é controlada pela SX5, é o número desse campo que define de onde a série segue: gravar 000010 faz a numeração recomeçar de 000010.

Quem decide se a numeração é controlada ali é o parâmetro . A própria descrição dele no dicionário padrão lista as opções: 1-SX5 | 2-SXE/SXF | 3-SD9.

Confira no seu ambienteSQL
SELECT X6_FIL, X6_VAR, X6_TIPO, X6_DESCRIC, X6_DESC1, X6_CONTEUD
  FROM SX6010
 WHERE X6_VAR IN ('MV_TPNRNFS', 'MV_NUMITEN')
   AND D_E_L_E_T_ = ' '
 ORDER BY X6_VAR, X6_FIL

O sufixo 010 é o da empresa; troque pelo do seu ambiente.

O documento FAT0049 do TDN, sobre o controle de numeração da nota de saída, trata do compartilhamento: com a SX5 compartilhada, o ponto de entrada CHGX5FIL passa o código da filial logada para a SX5, e a tabela 01 passa a ser tratada como exclusiva. O que ele devolve é esse código de filial: o padrão faz cFilSX5 := ExecBlock("CHGX5FIL",.F.,.F.) e usa o resultado no lugar do xFilial("SX5") ao procurar a série na tabela 01. O mesmo documento avisa que o controle pela SX5 trava a tabela de séries e o parâmetro para reservar a numeração, e que cada filial deve ter um MV_NUMITEN exclusivo — por isso a consulta acima já traz os dois parâmetros, com a filial de cada linha.

Criar uma tabela genérica sua

A manutenção fica no Configurador, na opção de Tabelas Genéricas, e a documentação da TOTVS registra que só o grupo de administradores tem acesso a ela. O que exige cuidado é o código.

Não há faixa de código reservada para o cliente que dê para afirmar. E a suposição óbvia — “o padrão não usa X nem Z” — está errada: a tabela 00 de uma base padrão tem XJ (Grupo — TES Inteligente, a mesma do Posicione acima), XN, ZR, ZS, ZT, entre outras. Código com Z na frente não protege nada aqui.

Então a regra prática é: escolha o código depois de listar os que já existem.

Confira no seu ambienteSQL
SELECT X5_CHAVE, X5_DESCRI
  FROM SX5010
 WHERE X5_TABELA = '00'
   AND D_E_L_E_T_ = ' '
 ORDER BY X5_CHAVE

E confirme que o código escolhido não tem itens soltos, cadastrados sem entrada na 00:

Confira no seu ambienteSQL
SELECT DISTINCT X5_TABELA
  FROM SX5010
 WHERE D_E_L_E_T_ = ' '
 ORDER BY X5_TABELA

Com o código escolhido, o campo que usa a lista segue o desenho do A1_EST: X3_F3 com o código e ExistCpo("SX5", "<código>" + M->campo) na validação. Por exemplo, se o cadastro de motoristas da série ganhasse a categoria da CNH, as categorias caberiam numa tabela genérica, com o campo apontando para ela.

Tabela genérica ou tabela própria

Tabela genérica (SX5)Tabela própria
EstruturaCódigo e descrição (nos três idiomas)Quantos campos precisar
CriaçãoUm código novo e os itensTabela, campos, índices no dicionário
Consulta no campoX3_F3 com o código da tabelaConsulta padrão própria
Cadastro dos itensConfiguradorRotina de cadastro, com o acesso que você definir
Bom paraLista curta, estável, que só precisa de nomeCadastro que cresce, tem atributos ou é mantido pelo usuário

O limite aparece quando a lista começa a pedir um segundo atributo — a categoria da CNH que precisa de “exige curso”, ou o motorista que precisa de data de nascimento. Aí a SX5 não tem onde guardar, e o caminho é uma tabela como a ZA1 (Tabela customizada no Protheus). E se o usuário do negócio precisa manter a lista sem depender do administrador, também.

A página da SX5 no catálogo mostra a estrutura no dicionário; a do cadastro de clientes mostra o A1_EST e os outros campos que consultam tabelas genéricas.

Se a numeração de nota da sua empresa depende da tabela 01 e ninguém sabe dizer quem mexeu nela, fale com a gente.

Referências

  1. TDNtdn.totvs.com

    TDN — SX5, Tabelas GenéricasEstrutura de código e valor que evita criar tabela e consulta padrão adicionais; manutenção pelo Configurador.
  2. TDNtdn.totvs.com

    TDN — Tabelas Genéricas (CFGX031 - SIGACFG)Onde a manutenção fica no Configurador.
  3. Central de Atendimentocentraldeatendimento.totvs.com

    Central de Atendimento TOTVS — Consulta padrão x Tabelas genéricasConsulta padrão sobre a SX5 com filtro na tabela desejada.
  4. Central de Atendimentocentraldeatendimento.totvs.com

    Central de Atendimento TOTVS — Controle de numeração via Tabela Genérica SX5Na tabela 01, X5_DESCRI guarda o número a partir do qual a série segue.
  5. TDNtdn.totvs.com

    TDN — FAT0049 Controle de Numeração do Documento de SaídaTabela 01 exclusiva com SX5 compartilhada pelo ponto de entrada CHGX5FIL; MV_NUMITEN exclusivo por filial.
  6. TDNtdn.totvs.com

    TDN — Parâmetro MV_TPNRNFSTipo de controle da numeração dos documentos de saída.

Continue por aqui