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.
- Um relatório em SQL lista os motoristas com a observação (
ZA1_OBS, campo memo), e a coluna sai como0xseguido de pares hexadecimais. Por quê, e o que muda na consulta? - Você acrescentou
4=Temporarioà lista do comboZA1_VINC. A opção aparece na tela, o usuário escolhe, e o cadastro recusa. O que faltou? - Um fonte lê o parâmetro
MV_XIDMINe o resultado não bate com o que foi combinado. Onde você confere? - Você criou um índice seu na
SC5e o fonte usaDbSetOrdercom o número dele. O que pode dar errado na próxima atualização? - 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):
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_CONTEXT | Inicializador | Onde está o texto | O que fazer |
|---|---|---|---|
R ou em branco | vazio | na coluna do próprio campo, em bytes | use a conversão acima |
| qualquer | MSMM(...) | na SYP (ou na RDY, quando a chamada passa "RDY" ou a tabela é de módulo de RH), ligado pelo código gravado num campo à parte | JOIN na SYP (ou RDY) por esse código; confira o último parâmetro da chamada |
V | Posicione(...) | num campo de outra tabela, indicado na própria chamada | consulte essa tabela e esse campo |
| qualquer | outra função | depende da função | abra a função e veja o que ela chama |
V | vazio | sem coluna; quem preenche é a rotina | procure 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 AMG_MSG tem contexto R e inicializador
IF(!INCLUI,MSMM(AMG->AMG_CODMEM),''), e a rotina grava o texto na SYP
pelo AMG_CODMEM. A coluna existe, mas o texto que a tela mostra vem da
SYP. Inicializador vazio também não descarta a SYP: ADE_INCIDE e
ADF_OBS 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 U2_OBS 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().
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:
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:
SELECT INDICE, ORDEM, CHAVE, NICKNAME
FROM SIX010
WHERE INDICE = 'SC5'
AND D_E_L_E_T_ = ' '
ORDER BY ORDEMNo 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:
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
ORDER BY ROUTINE_NAMEVeja 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
TDNtdn.totvs.com
TDN — Melhoria: troca do tipo de campo MEMO para MSSQLTDNtdn.totvs.com
TDN — Pasta Validações (CFGX034 - SIGACFG)TDNtdn.totvs.com
TDN — FWFormModelStruct (AddField, parâmetro aValues)TDNtdn.totvs.com
TDN — Atualização de dicionário de dados do ACDCentral de Atendimentocentraldeatendimento.totvs.com
Central de Atendimento TOTVS — Diferença no funcionamento das funções GetNewPar e GetMv
Continue por aqui
- Vídeo
ProtheusTutorial
Consulta padrão (F3): como criar a lupa de um campo
Consulta padrão (F3): o que a SXB guarda em cada tipo de registro, como criar a consulta ZA1, ligá-la a um campo pelo X3_F3 e a SQL de conferência.
- Vídeo
ProtheusReferência técnica
Perguntas (SX1): o grupo de perguntas de relatórios e rotinas
Perguntas (SX1): como a tabela guarda as perguntas de um relatório, o que Get e Combo mudam e como o fonte lê as respostas em mv_par01, mv_par02.