Como estornar o Cálculo do Custo Médio (MATA330)

Hoje vou mostrar como estornar o Cálculo do Custo Médio (MATA330).

Primeiramente pessoal, se forem realizar testes, ou se forem realizar os procedimentos abaixo, tentem fazer primeiro em base de testes. Não existe um procedimento padrão para estorno do Cálculo do Custo Médio, então aqui será demonstrado como fazer um paliativo para isso.

Esse tutorial foi montado pelo grande Kleber Santos (LinkedIn). Ah e para esse caso, não existem Ordens de Produção.

  1. Acesse o configurador, no MV_ULMES altere para um mês antes, por exemplo, se você quer estornar Setembro, volte a data para agosto

Alterando o MV_ULMES

  1. Agora faça um UPDATE na tabela SB9, excluindo todos os registros a partir do primeiro dia do mês que será estornado (no nosso caso, a partir de 01 de Setembro)
UPDATE SB9010
SET D_E_L_E_T_ = '*', R_E_C_D_E_L_ = R_E_C_N_O_
WHERE B9_DATA >= '20200901' AND D_E_L_E_T_ = ' '

Limpando a SB9

  1. Agora é só rodar novamente o MATA330

Update (23/03/2021):

Pessoal, o grande Jonas Machado, mandou uma contribuição para quem também trabalha com lote (SBJ), endereçamento (SBK) e FIFO (SCC).

Para isso, se atente a algumas informações como:

  • Faça backup do banco antes do procedimento
  • Se quiser, faça backup apenas das tabelas que serão atualizadas
  • Teste em homologação antes
  • Se tem múltiplas filiais e empresas, adapte na query

Abaixo a query montada:

SELECT MAX(CC_DATA) FROM SCC010 WHERE D_E_L_E_T_=''
/*
DELEÇÃO DA TABELA DE SALDOS INICIAIS FIFO
*/
UPDATE SCC010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE CC_DATA=(SELECT MAX(CC_DATA) FROM SCC010 WHERE D_E_L_E_T_='') AND D_E_L_E_T_=''
--QUERY SIMPLES
UPDATE SCC010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE CC_DATA='20210131' AND D_E_L_E_T_=''

SELECT MAX(BJ_DATA) FROM SBJ010 WHERE D_E_L_E_T_=''
/*
DELEÇÃO DA TABELA DE SALDOS INICIAIS POR LOTE
*/
UPDATE SBJ010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE BJ_DATA=(SELECT MAX(BJ_DATA) FROM SBJ010 WHERE D_E_L_E_T_='') AND D_E_L_E_T_=''
--QUERY SIMPLES
UPDATE SBJ010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE BJ_DATA='20210131'

SELECT MAX(BK_DATA) FROM SBK010 WHERE D_E_L_E_T_=''
/*
DELEÇÃO NA TABELA DE SALDOS INICIAIS POR ENDEREÇO
*/
UPDATE SBK010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE BK_DATA=(SELECT MAX(BK_DATA) FROM SBK010 WHERE D_E_L_E_T_='') AND D_E_L_E_T_=''
--QUERY SIMPLES
UPDATE SBK010 SET D_E_L_E_T_='*', R_E_C_D_E_L_ = R_E_C_N_O_ WHERE BK_DATA='20210131'

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

7 Responses

  1. Jonas disse:

    Mestre Atilio, me permita um adendo para o eu do futuro.

    Se trabalhar com lote, também atualiza a SBJ.
    Se trabalhar com endereço, também atualiza a SBK.
    Se trabalhar com Fifo, também atualiza a SCC.

    No meu caso, eu trabalho com todas.

    Abraço.

    • Dan_Atilio disse:

      Grande Jonas, acha mestre nada, bondade sua rs.
      Opa, caso você tenha o exemplo das queries prontas também, nos envie para já deixarmos o post atualizado.
      Grande abraço.

      • Jonas Machado disse:

        Ô meu amigo, fiz esta pequena contribuição para fins didáticos ao pessoal que assim como eu bebe demais nessa fonte aqui.

        SELECT MAX(CC_DATA) FROM SCC010 WHERE D_E_L_E_T_=”
        /*
        DELEÇÃO DA TABELA DE SALDOS INICIAIS FIFO
        */
        UPDATE SCC010 SET D_E_L_E_T_=’*’ WHERE CC_DATA=(SELECT MAX(CC_DATA) FROM SCC010 WHERE D_E_L_E_T_=”) AND D_E_L_E_T_=”
        –QUERY SIMPLES
        UPDATE SCC010 SET D_E_L_E_T_=’*’ WHERE CC_DATA=’20210131′ AND D_E_L_E_T_=”

        SELECT MAX(BJ_DATA) FROM SBJ010 WHERE D_E_L_E_T_=”
        /*
        DELEÇÃO DA TABELA DE SALDOS INICIAIS POR LOTE
        */
        UPDATE SBJ010 SET D_E_L_E_T_=’*’ WHERE BJ_DATA=(SELECT MAX(BJ_DATA) FROM SBJ010 WHERE D_E_L_E_T_=”) AND D_E_L_E_T_=”
        –QUERY SIMPLES
        UPDATE SBJ010 SET D_E_L_E_T_=’*’ WHERE BJ_DATA=’20210131′

        SELECT MAX(BK_DATA) FROM SBK010 WHERE D_E_L_E_T_=”
        /*
        DELEÇÃO NA TABELA DE SALDOS INICIAIS POR ENDEREÇO
        */
        UPDATE SBK010 SET D_E_L_E_T_=’*’ WHERE BK_DATA=(SELECT MAX(BK_DATA) FROM SBK010 WHERE D_E_L_E_T_=”) AND D_E_L_E_T_=”
        –QUERY SIMPLES
        UPDATE SBK010 SET D_E_L_E_T_=’*’ WHERE BK_DATA=’20210131′

        ****CONSIDERAÇÕES AOS INICIANTES

        1 – FAÇA BACKUP DO BANCO DE DADOS, SEMPRE! NÃO VÁ TESTAR EM PRODUÇÃO!!!
        NO SQL SERVER PARA NÃO QUEBRAR A CADEIA DE BACKUPS DIFERENCIAIS, CASO EXISTA, SEGUE UMA QUERY DE BACKUP SOMENTE CÓPIA.

        BACKUP DATABASE [SEUBANCO]
        To DISK=’C:\TEMP\SEUBANCO.BAK’
        WITH COPY_ONLY,
        GO

        2 – PODE FAZER O BACKUP DAS TABELAS SOMENTE VIA MPSDU SB9, SBJ, SBK E SCC.

        3 – TESTE SEMPRE EM HOMOLOGAÇÃO ANTES.

        Abraços!

      • Jonas disse:

        4 – Se você tem múltiplas empresas e filiais se atente para discriminá-las corretamente nas querys.

      • Jonas disse:

        kkk

        Completa ai pra mim nas sentenças RECNO=RECDEL

        :D:D:D

Deixe uma resposta