Execauto de Estorno na MATA241 | Ti Responde 059

No vídeo de hoje, vamos demonstrar em como acionar o Estorno de Movimentação Múltipla (MATA241) via ExecAuto.

A dúvida de hoje foi feita pelo grande Israel, onde ele perguntou como seria a montagem dos dados para acionar a execução automática do estorno de movimentação na SD3 via MATA241.

Então foi montado um exemplo demonstrando a realização do estorno via ExecAuto.

E abaixo o código fonte desenvolvido para exemplificar:

//Bibliotecas
#Include "TOTVS.ch"
 
/*/{Protheus.doc} User Function zVid0059
Exemplo de estorno / exclusão via ExecAuto da MATA241
@type  Function
@author Atilio
@since 29/08/2022
/*/
 
User Function zVid0059()
    Local aArea      := FWGetArea()
    Local cDocumento := Space(TamSX3("D3_DOC")[1])
    Local aPergs     := {}
 
    //Adiciona a pergunta e mostra a pergunta
    aAdd(aPergs, {1, "Documento SD3", cDocumento, "", ".T.", "", ".T.", 90, .T.})
    If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
        Processa({|| fEstornar(MV_PAR01)}, "Estornando...")
    EndIf
 
    FWRestArea(aArea)
Return
 
Static Function fEstornar(cDocumento)
    Local aArea    := FWGetArea()
    Local aAreaSD3
    Local aCab     := {}
    Local aItens   := {}
    Local aItem    := {}
    Local cChave   := ""
    Private lMsErroAuto := .F.
 
    //Abre a tabela de movimentações, e se conseguir posicionar no documento
    DbSelectArea("SD3")
    SD3->(DbSetOrder(2)) // D3_FILIAL + D3_DOC + D3_COD
    If SD3->(MsSeek(FWxFilial('SD3') + cDocumento))
        aAreaSD3 := SD3->(FWGetArea())
        cChave   := SD3->D3_FILIAL + SD3->D3_DOC
 
        //Adiciona no cabeçalho as chaves da tabela
        aCab := {;
            {"D3_DOC", SD3->D3_DOC, Nil};
        }
 
        //Enquanto houver dados que for o mesmo documento, adiciona no array de itens
        ProcRegua(0)
        While ! SD3->(EoF()) .And. SD3->D3_FILIAL + SD3->D3_DOC == cChave
            IncProc("Adicionando produto " + Alltrim(SD3->D3_COD) + "...")
 
            aItem := {}
            aAdd(aItem, {"D3_COD",     SD3->D3_COD,   Nil})
            aAdd(aItem, {"D3_UM",      SD3->D3_UM,    Nil})
            aAdd(aItem, {"D3_QUANT",   SD3->D3_QUANT, Nil})
            aAdd(aItem, {"D3_LOCAL",   SD3->D3_LOCAL, Nil})
            aAdd(aItem, {"D3_ESTORNO", "S",           Nil})
            aAdd(aItens, aClone(aItem))
 
            SD3->(DbSkip())
        EndDo
 
        //Volta onde estava na SD3
        FWRestArea(aAreaSD3)
 
        //Aciona o ExecAuto
        MsExecAuto({|x, y, z| MATA241(x, y, z)}, aCab, aItens, 6)
 
        //Se houve erro, exibe
        If lMsErroAuto
            MostraErro()
        Else
            FWAlertSuccess("Documento foi estornado com sucesso!", "Atenção")
        EndIf
 
    Else
        FWAlertError("Documento não foi encontrado!", "Atenção")
    EndIf
 
    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Jorge disse:

    Boa noite. Muito obrigado pelo artigo. E para estornos valorizados DE6? Qual seria o execauto?

Deixe uma resposta

Terminal de Informação