Hoje vou mostrar uma forma de arrumar a numeração no campo D3_DOC.
Algumas vezes os usuários, sem querer batem o dedo e acabam alterando a sequência de algum campo do Protheus.
No caso da SD3, o campo D3_DOC, utiliza na inicialização do campo a função NextNumero, e essa função efetua a busca direto no banco de dados, sem passar pelo controle de numerações do License, então você não consegue simplesmente ir e alterar via configurador.
Então para acertarmos isso, primeiro precisamos saber quantos registros estão errados, e se não houve movimentação no estoque desses itens.
Para isso, iremos executar a seguinte query:
SELECT R_E_C_N_O_, D3_FILIAL, D3_DOC FROM dbo.SD3020 WHERE D3_FILIAL = '01' AND D3_DOC < 'INVENT ' AND D_E_L_E_T_ = ' ' ORDER BY D3_FILIAL DESC , D3_DOC DESC , D3_COD DESC , R_E_C_N_O_ DESC
Feito isso, guarde a lista de documentos, e solicite ao usuário estornar um a um desses documentos.
Após o usuário estornar, devemos agora prosseguir com a exclusão (pois a NextNumero, não filtra o campo D3_ESTORNO).
Para isso, iremos dar um UPDATE na tabela SD3, atualizando o campo D_E_L_E_T_ para * (somente dos registros que foram estornados), e se na sua instalação tiver o R_E_C_D_E_L_, preencha ele com R_E_C_N_O_. Caso você não tenha familiaridade com queries SQL, você pode fazer esse procedimento de exclusão via APSDU, filtrando os registros na SD3 com Ctrl+F e excluindo um a um apertando o botão Delete no teclado.
UPDATE SD3020 SET D_E_L_E_T_ = '*' WHERE D3_DOC >= '40 ' AND D3_ESTORNO = 'S' AND D3_DOC < 'INVENT ' AND D_E_L_E_T_ = ' '
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Dan_Atilio! Obrigado por compartilhar o conhecimento!
Tenho um cenário que é um pouco mais complicado, onde usuário digitou em algum momento “ZERAR” no D3_DOC, e a partir desse, seguiu a sequência, aí já sabe, e como a função “NEXTNUMERO()” está interna nas rotinas, a conclusão que cheguei é que vou ter que preparar uma rotina para atualizar esse campo para uma sequência numérica correta, prevendo atualização do estorno e alguma tabela que contenha essa informação (D3_DOC). Fazer em base teste inicialmente, claro para validar a aderência!
Motivo: Toda vez usuários e diretoria questiona o motivo de aparecer “ZERARxxxxxx” no documento, pois os relatórios padrões apresentam essa informação, e a origem “RE0/RE1, etc” não é visualmente rápido de entender.
Consequência: Usuário e diretoria questiona. Ex: Esse Zerar foi inventário? Ou Ex: Utilizaram a rotina de Internos para baixar saldo. Coisas do tipo!
Com sua experiência, alguma ressalva do descrito acima? Ou alternativa ?
Bom dia Renato. Obrigado pelo feedback.
Então, se forem poucos movimentos, talvez compensaria realmente estornar e deixar a numeração ok (para utilização da NextNumero).
Agora se forem muitos, o que você poderia fazer, é criar uma user function e colocar no ini padrão (nesse link eu mostro um exemplo – https://terminaldeinformacao.com/2018/03/27/funcao-advpl-retorna-ultimo-codigo-de-uma-tabela-sql/ ), que faz uma query sql, e você monta a numeração, ai você poderia desconsiderar o que começasse com ZERAR.
Qualquer dúvida, fico à disposição.
Grande abraço.
Complementando, esse campo D3_DOC é tão mal pensado, que a rotina de inventário gera ele como “INVENT”, já rotinas de Baixas do CQ, gera com uma sequência alfanumérica de 6 Dígitos controlada por um parâmetro, já quando você aponta uma OP, ele grava o número da OP!
Cara, é um inferno.
Esse campo deveria ser bloqueado, e sempre trabalhar uma sequência numérica, simples assim, independente da rotina de origem que gerar.
Já no campo RE/DE, onde grava a origem; deveria ser mais detalhado e apresentar nos relatórios a origem por extenso, para que usuário rapidamente soubesse a origem!
Diário de experiência ruim!!