Pragiva — Tecnologia na prática

Cinco situações do Configurador, com a consulta que resolve cada uma

Configurador: cinco situações comuns — memo em bytes no SQL, opção de combo recusada, parâmetro MV_, índice sem nickname e stored procedure.

Protheus Guia de processo 5 min de leitura

Assista o vídeo

Cinco situações que aparecem no dia a dia de quem mexe no Configurador, e cada resposta termina numa consulta SQL que você roda na sua própria base para conferir o caso no seu ambiente. Tente responder antes de ler; onde o porquê não vier fácil, o link leva ao artigo da série que trata do assunto.

  1. Um relatório em SQL lista os motoristas com a observação (ZA1_OBS, campo memo), e a coluna sai como 0x seguido de pares hexadecimais. Por quê, e o que muda na consulta?
  2. Você acrescentou 4=Temporario à lista do combo ZA1_VINC. A opção aparece na tela, o usuário escolhe, e o cadastro recusa. O que faltou?
  3. Um fonte lê o parâmetro MV_XIDMIN e o resultado não bate com o que foi combinado. Onde você confere?
  4. Você criou um índice seu na e o fonte usa DbSetOrder com o número dele. O que pode dar errado na próxima atualização?
  5. O recálculo do custo médio roda num ambiente sem nenhuma stored procedure instalada. Ele para?

Respostas

1. O memo que sai em bytes

O memo real de uma tabela comum fica numa coluna binária — no SQL Server, varbinary(max); em tabelas antigas, image. O conteúdo é o texto digitado, só que guardado como bytes, e cada par hexadecimal é um caractere. Para ler, aninhe duas conversões: primeiro para VARBINARY, e o resultado para VARCHAR — CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), ZA1_OBS)). O texto convertido ainda traz um caractere nulo no fim; limpe antes de comparar ou exportar.

Antes de converter, confirme que o memo é mesmo real. Um memo com contexto V não tem coluna na tabela, e onde o texto está depende do inicializador (X3_RELACAO):

Confira no seu ambienteSQL
SELECT X3_CAMPO, X3_TIPO, X3_CONTEXT, X3_RELACAO
  FROM SX3010
 WHERE X3_ARQUIVO = 'ZA1'
   AND X3_TIPO    = 'M'
   AND D_E_L_E_T_ = ' '
X3_CONTEXTInicializadorOnde está o textoO que fazer
R ou em brancovaziona coluna do próprio campo, em bytesuse a conversão acima
qualquerMSMM(...)na (ou na RDY, quando a chamada passa "RDY" ou a tabela é de módulo de RH), ligado pelo código gravado num campo à parteJOIN na SYP (ou RDY) por esse código; confira o último parâmetro da chamada
VPosicione(...)num campo de outra tabela, indicado na própria chamadaconsulte essa tabela e esse campo
qualqueroutra funçãodepende da funçãoabra a função e veja o que ela chama
Vvaziosem coluna; quem preenche é a rotinaprocure na rotina um MSMM sobre um campo-código da mesma tabela; se houver, o texto está na SYP (ou na RDY, se a chamada passar "RDY" ou a tabela for de RH)

Três casos pedem atenção. Um memo real também pode ter MSMM no inicializador: o tem contexto R e inicializador IF(!INCLUI,MSMM(AMG->AMG_CODMEM),''), e a rotina grava o texto na SYP pelo . A coluna existe, mas o texto que a tela mostra vem da SYP. Inicializador vazio também não descarta a SYP: e são memos virtuais sem inicializador, e a rotina carrega o texto com MSMM(ADE->ADE_CODINC) e MSMM(ADF->ADF_CODOBS). E há funções que só embrulham o MSMM: o tem no inicializador uma função que chama MSMM(SU2->U2_CODOBS, ...).

O 010 é o sufixo da empresa; no seu ambiente pode ser outro. Veja Campo memo.

2. A opção nova que o cadastro recusa

A lista do combo e a validação do campo são coisas separadas. O X3_CBOX diz o que a tela oferece; a validação diz o que o campo aceita. No exemplo da série, a validação é Pertence("123"), que só aceita 1, 2 ou 3. Com 4=Temporario na lista e a validação intacta, a tela oferece uma opção que a validação recusa. O conserto é Pertence("1234"), e a opção nova entra também nas listas em espanhol e inglês (X3_CBOXSPA e X3_CBOXENG).

Procure o Pertence() em dois lugares: X3_VALID (validação do sistema) e X3_VLDUSER (validação do usuário). A documentação da TOTVS diz que a validação do usuário é adicionada à do sistema: as duas valem, e basta uma recusar o 4 para o cadastro barrar.

Em rotina MVC, a estrutura do modelo também declara, por campo, uma “lista de valores permitido do campo (combo)” — o parâmetro aValues do AddField, na documentação da FWFormModelStruct. Seja qual for a rotina, a regra que você controla no dicionário é a mesma: opção nova no X3_CBOX pede a mesma opção no Pertence().

Confira no seu ambienteSQL
SELECT X3_CAMPO, X3_TAMANHO, X3_CBOX, X3_VALID, X3_VLDUSER
  FROM SX3010
 WHERE X3_CAMPO   = 'ZA1_VINC'
   AND D_E_L_E_T_ = ' '

Compare as opções à esquerda do = em X3_CBOX com as que aparecem no Pertence() de X3_VALID e de X3_VLDUSER, e confira se cada valor cabe em X3_TAMANHO. Veja Campo combo.

3. Onde conferir um parâmetro

Na SX6, direto no banco:

Confira no seu ambienteSQL
SELECT X6_FIL, X6_VAR, X6_TIPO, X6_DESCRIC, X6_CONTEUD, X6_PROPRI
  FROM SX6010
 WHERE X6_VAR = 'MV_XIDMIN'
   AND D_E_L_E_T_ = ' '

A consulta responde três perguntas de uma vez: o parâmetro existe, de que tipo ele é e o que está gravado — inclusive se há uma linha para uma filial específica, em X6_FIL.

Se o banco estiver certo e o fonte ainda ler o valor antigo, olhe como ele lê. SuperGetMV guarda o parâmetro em memória depois da primeira leitura; para valor que muda durante a execução, a TOTVS indica GetMV. Veja Parâmetros (SX6).

4. O índice seu em tabela padrão

O número da ordem pode passar a apontar para outro índice. A documentação da TOTVS orienta a identificar índices personalizados pelo nickname antes de rodar o compatibilizador: se ele precisar criar índices, vai adicioná-los a partir da ordem original do Protheus, o que pode sobrescrever índices personalizados sem nickname. Com nickname, o fonte seleciona o índice pelo apelido (DbOrderNickName), e a posição deixa de importar.

Para ver os índices da tabela e quais têm apelido:

Confira no seu ambienteSQL
SELECT INDICE, ORDEM, CHAVE, NICKNAME
  FROM SIX010
 WHERE INDICE = 'SC5'
   AND D_E_L_E_T_ = ' '
 ORDER BY ORDEM

No resultado, procure a linha do seu índice. Com NICKNAME em branco, é ela que o compatibilizador pode sobrescrever. Com apelido preenchido, troque no fonte o DbSetOrder(n) por DbOrderNickName("APELIDO"), com o apelido que aparece nessa coluna.

Veja Índices no Protheus.

5. Custo médio sem stored procedure

Não para. O MATA330 verifica se o conjunto de procedures dele está instalado; se estiver, processa no banco; se não, faz o mesmo trabalho em AdvPL. Basta faltar uma procedure do conjunto para o recálculo inteiro ir pelo AdvPL. Por isso a instalação é pelo processo completo. No SQL Server, confira o que existe de fato no banco:

Confira no seu ambienteSQL
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
  FROM INFORMATION_SCHEMA.ROUTINES
 ORDER BY ROUTINE_NAME

Veja Stored procedures no Protheus.

Onde revisar o resto

Se alguma resposta não veio, o mapa da série está em Configurador do Protheus, e o mapa das tabelas SX em Dicionário de dados do Protheus.

Referências

  1. TDNtdn.totvs.com

    TDN — Melhoria: troca do tipo de campo MEMO para MSSQL
  2. TDNtdn.totvs.com

    TDN — Pasta Validações (CFGX034 - SIGACFG)
  3. TDNtdn.totvs.com

    TDN — FWFormModelStruct (AddField, parâmetro aValues)
  4. TDNtdn.totvs.com

    TDN — Atualização de dicionário de dados do ACD
  5. Central de Atendimentocentraldeatendimento.totvs.com

    Central de Atendimento TOTVS — Diferença no funcionamento das funções GetNewPar e GetMv

Continue por aqui