Pragiva — Tecnologia na prática

Grupo de campos: aumentar um campo em todas as tabelas de uma vez

Grupo de campos (SXG) controla o tamanho do código de cliente e produto em mais de mil tabelas. Como descobrir o grupo pelo SQL e o risco de diminuir um.

Protheus Guia de processo 5 min de leitura

Assista o vídeo

Nesta página4 seções

O código do produto não mora só na . 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:

ColunaO que é
XG_SIZEO tamanho atual. É o que os campos do grupo têm hoje.
XG_SIZEMINO menor tamanho previsto para o grupo.
XG_SIZEMAXO maior tamanho previsto para o grupo.
XG_PICTUREA 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:

GrupoDescriçãoAtualMínimoMáximo
001Codigo Cliente/Fornecedor6620
006Classe de Valor9920
018Documento de entrada/saída9613
030Tamanho do Produto151530
033Tamanho da Filial2212

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:

Confira no seu ambienteSQL
SELECT XG_GRUPO, XG_DESCRI, XG_SIZE, XG_SIZEMIN, XG_SIZEMAX, XG_PICTURE
  FROM SXG010
 WHERE D_E_L_E_T_ = ' '
 ORDER BY XG_GRUPO

O 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:

GrupoCampos (amostra)
030 Produto, , , , ,
001 Cliente/Fornecedor, , , ,
018 Documento, ,
006 Classe de Valor, ,

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:

Confira no seu ambienteSQL
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_CAMPO

E o caminho inverso — de um campo para o grupo e seus limites:

Confira no seu ambienteSQL
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:

Confira no seu ambienteSQL
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_ORDEM

Antes 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 001 vai 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: o C5_XMOTOR da série guarda o código do motorista (ZA1_COD), que não pertence a grupo nenhum — se um dia o ZA1_COD crescer, o C5_XMOTOR tem 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.

ADVPL / TLPP
// 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:

Confira no seu ambienteSQL
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

  1. TDNtdn.totvs.com

    TDN — Visualizar Grupo de Campos (CFGX034 - SIGACFG)
  2. TDNtdn.totvs.com

    TDN — SXG, Alteração do grupo de campos
  3. TDNtdn.totvs.com

    TDN — Atualizar Base de Dados (CFGX034 - SIGACFG)

Continue por aqui