Nesta página4 seções
O código do produto não mora só na SB1. Ele aparece no item do pedido de
venda, no pedido de compra, na nota de entrada, na nota de saída, na tabela de
preços — em mais de mil tabelas. Aumentar esse código campo a campo seria
inviável, e é para isso que existe o grupo de campos: um cadastro na SXG
que diz qual é o tamanho daquele dado. Todo campo ligado ao grupo segue o
tamanho dele. Pela documentação da TOTVS, quando um grupo é alterado, todos os
campos relacionados são corrigidos automaticamente.
O que a SXG guarda
Cada grupo é uma linha, identificada por XG_GRUPO. Três colunas guardam tamanhos e uma guarda a máscara:
| Coluna | O que é |
|---|---|
XG_SIZE | O tamanho atual. É o que os campos do grupo têm hoje. |
XG_SIZEMIN | O menor tamanho previsto para o grupo. |
XG_SIZEMAX | O maior tamanho previsto para o grupo. |
XG_PICTURE | A máscara do grupo (por exemplo, @!). |
Pela documentação, os grupos são pré-definidos pela TOTVS e servem para dimensionar o tamanho mínimo e máximo de uma informação. Alguns deles, como estavam numa base Protheus 12 de demonstração:
| Grupo | Descrição | Atual | Mínimo | Máximo |
|---|---|---|---|---|
001 | Codigo Cliente/Fornecedor | 6 | 6 | 20 |
006 | Classe de Valor | 9 | 9 | 20 |
018 | Documento de entrada/saída | 9 | 6 | 13 |
030 | Tamanho do Produto | 15 | 15 | 30 |
033 | Tamanho da Filial | 2 | 2 | 12 |
O que a documentação não diz é o que acontece se você informar um tamanho
fora da faixa entre XG_SIZEMIN e XG_SIZEMAX — ela só afirma que a faixa
existe. Antes de planejar um aumento, confira os limites do grupo no seu
ambiente e trate o máximo como teto:
SELECT XG_GRUPO, XG_DESCRI, XG_SIZE, XG_SIZEMIN, XG_SIZEMAX, XG_PICTURE
FROM SXG010
WHERE D_E_L_E_T_ = ' '
ORDER BY XG_GRUPOO sufixo 010 é o da empresa; no seu ambiente pode ser outro.
Como saber a qual grupo um campo pertence
O vínculo fica no próprio campo, na coluna X3_GRPSXG da SX3. Alguns
exemplos do dicionário padrão:
| Grupo | Campos (amostra) |
|---|---|
030 Produto | B1_COD, C6_PRODUTO, C7_PRODUTO, D1_COD, D2_COD, DA1_CODPRO |
001 Cliente/Fornecedor | A1_COD, A2_COD, C5_CLIENTE, E1_CLIENTE, F2_CLIENTE |
018 Documento | F2_DOC, D2_DOC, E1_NUM |
006 Classe de Valor | B1_CLVL, CT2_CLVLDB, CT9_CLVLDB |
A escala assusta: no dicionário padrão, o grupo 030 alcança
campos em mais de mil tabelas. Antes de mexer em um grupo, liste o que ele
arrasta:
SELECT X3_ARQUIVO, X3_CAMPO, X3_TAMANHO, X3_TITULO
FROM SX3010
WHERE X3_GRPSXG = '006'
AND D_E_L_E_T_ = ' '
ORDER BY X3_ARQUIVO, X3_CAMPOE o caminho inverso — de um campo para o grupo e seus limites:
SELECT X3.X3_CAMPO, X3.X3_TAMANHO, XG.XG_GRUPO, XG.XG_DESCRI,
XG.XG_SIZEMIN, XG.XG_SIZEMAX
FROM SX3010 X3
JOIN SXG010 XG
ON XG.XG_GRUPO = X3.X3_GRPSXG
AND XG.D_E_L_E_T_ = ' '
WHERE X3.X3_CAMPO = 'B1_COD'
AND X3.D_E_L_E_T_ = ' 'Se essa consulta não devolver nada, o campo não tem grupo e o tamanho dele se altera no próprio campo.
O grupo não arrasta só campos: arrasta também perguntas. A SX1 tem a
mesma coluna, X1_GRPSXG, e a visualização do grupo no Configurador, pela
documentação, mostra os “Campos e Perguntas” relacionados a ele. É o que faz
o “Fornecedor De ?” de um relatório ter o mesmo tamanho do código do
fornecedor. Numa base de demonstração, todas as perguntas ligadas aos grupos
001, 006, 018 e 030 tinham exatamente o XG_SIZE do grupo. Liste as
perguntas junto com os campos:
SELECT X1_GRUPO, X1_ORDEM, X1_PERGUNT, X1_TAMANHO
FROM SX1010
WHERE X1_GRPSXG = '001'
AND D_E_L_E_T_ = ' '
ORDER BY X1_GRUPO, X1_ORDEMAntes de aumentar
A documentação chega ao grupo pelo menu Base de Dados + Dicionário +
Arquivos, clicando em Dicionário de Dados e depois em Grupo de
Campos (rotina CFGX034). Três cuidados que valem para qualquer grupo:
- Planeje uma janela. Pela documentação da atualização da base de dados,
alterações que interferem na estrutura da tabela só são gravadas com o
processamento em modo exclusivo — ninguém usando o sistema. E a página do
grupo de campos avisa que, dependendo do volume de informações, o processo
de alteração pode ser lento. Com mais de mil tabelas num grupo como o
030, conte com isso. - Stored procedures. A TOTVS orienta que, se o tamanho de um grupo for alterado e houver stored procedure ligada a ele, é preciso remover e reinstalar as procedures. Veja Stored procedures no Protheus.
- Campos customizados que guardam o mesmo dado. O grupo só alcança os
campos ligados a ele. Um campo seu com código de cliente, criado com
tamanho 6 e sem grupo, continua com 6 depois que o grupo
001vai a 10. Recomendação: ao criar um campo customizado que guarda código de cliente, produto ou documento, ligue-o ao grupo correspondente. O inverso também vale: oC5_XMOTORda série guarda o código do motorista (ZA1_COD), que não pertence a grupo nenhum — se um dia oZA1_CODcrescer, oC5_XMOTORtem de crescer junto, à mão.
O mesmo vale para fonte customizado que fixa tamanho no código. Space(15) ou
PadR(cProd, 15) param de funcionar quando o produto cresce. Leia o tamanho do
dicionário: TamSX3(cCampo) devolve um array com tamanho, decimais e tipo.
// Tamanho do código do produto conforme o dicionário, não fixo no fonte
Local nTamProd := TamSX3("B1_COD")[1]
SB1->(DbSetOrder(1))
SB1->(DbSeek(xFilial("SB1") + PadR(cProduto, nTamProd)))Por que não diminuir
Aumentar um campo só acrescenta espaço: o que estava gravado continua cabendo. Diminuir faz o contrário — o que passa do novo tamanho não cabe mais, e a informação é cortada. E o corte não acontece em um lugar só: acontece em todas as tabelas do grupo, cada uma com sua cópia do dado.
Um cenário para tornar isso concreto. Uma empresa aumentou o grupo 018
(Documento de entrada/saída) e passou a emitir notas com mais dígitos. Meses
depois, alguém pede para “voltar ao padrão” e o grupo é reduzido. O número
gravado em F2_DOC é cortado; o mesmo número, em E1_NUM, também — e o que
ligava a nota ao título, ao pedido e ao livro fiscal era justamente esse
número inteiro. Os registros não somem; eles perdem a identidade que os
amarrava.
Por isso a recomendação é direta: não diminua grupo de campos. Se for inevitável, trate como migração de dados, não como ajuste de dicionário: levante todos os campos do grupo com a SQL acima, confira se algum registro tem conteúdo maior que o tamanho novo, e faça backup antes.
Para conferir se há conteúdo que não caberia em 6 posições, por exemplo, nas notas de saída:
SELECT COUNT(*) AS NOTAS_MAIORES_QUE_6
FROM SF2010
WHERE LEN(RTRIM(F2_DOC)) > 6
AND D_E_L_E_T_ = ' 'Se o resultado for maior que zero, reduzir o grupo para 6 corta essas notas.
O dicionário completo está no mapa das tabelas SX. Se você precisa aumentar um grupo em produção e quer levantar o impacto antes, fale com a gente.
Referências
TDNtdn.totvs.com
TDN — Visualizar Grupo de Campos (CFGX034 - SIGACFG)TDNtdn.totvs.com
TDN — SXG, Alteração do grupo de camposTDNtdn.totvs.com
TDN — Atualizar Base de Dados (CFGX034 - SIGACFG)
Continue por aqui
- Vídeo
ProtheusTutorial
Log de registros: quem incluiu e quem alterou um cadastro
Log de registros: os campos de inclusão e alteração, por que o SELECT direto mostra lixo, como ler com FWLeUserlg e a rotina no Configurador.