Begin Transaction não da rollback sozinho?

Bom dia,

Tenho o seguinte código:

Begin Transaction
        While x <= Len(aDadosDest)

            //==========================
            // - Retira PA do Estoque
            If x == 1 //Garanto para que rode apenas uma vez a remoção do estoque
                ExpA1 := {}
                aAdd(ExpA1,{"D3_FILIAL"    ,xFilial("SD3")        ,})
                aAdd(ExpA1,{"D3_TM"        ,"505"                ,})
                aAdd(ExpA1,{"D3_COD"    ,aDadosPA[x, 1]        ,})
                aAdd(ExpA1,{"D3_UM"        ,aDadosPA[x, 2]        ,})
                aAdd(ExpA1,{"D3_LOCAL"    ,aDadosPA[x, 3]        ,})
                aAdd(ExpA1,{"D3_QUANT"    ,aDadosPA[x, 4]        ,})
                aAdd(ExpA1,{"D3_EMISSAO",dDataBase            ,})
                aAdd(ExpA1,{"D3_LOTECTL",aDadosPA[x, 5]        ,})
                aAdd(ExpA1,{"D3_DOC"    ,cDoc                ,})
                MSExecAuto({|x,y| mata240(x,y)},ExpA1,ExpN2)
                If !lMsErroAuto
                    LogMsg('', 0, 14, 1, '', '',"Movimentação PAxCP-1-OK")
                Else
                    mostraerro()
                EndIf
            EndIf

            // -
            //==========================
            // - Verifica se possui registro do CP ou KT no armazém novo

            If chkST(aDadosDest[x, 1]) == .F.
                CriaSB2(aDadosDest[x, 1],aDadosDest[x, 3])
            EndIf

            // -
            //==========================
            // - Inclui CP ou KT no Estoque
            If !lMsErroAuto
                ExpA1 := {}
                aAdd(ExpA1,{"D3_FILIAL"    ,xFilial("SD3")             ,})
                aAdd(ExpA1,{"D3_TM"        ,"005"                     ,})
                aAdd(ExpA1,{"D3_COD"    ,aDadosDest[x, 1]        ,})
                aAdd(ExpA1,{"D3_UM"        ,aDadosDest[x, 2]        ,})
                aAdd(ExpA1,{"D3_LOCAL"    ,aDadosDest[x, 3]        ,})
                aAdd(ExpA1,{"D3_QUANT"    ,aDadosDest[x, 4]        ,})
                aAdd(ExpA1,{"D3_EMISSAO",dDataBase                 ,})
                aAdd(ExpA1,{"D3_LOTECTL",aDadosDest[x, 5]        ,})
                aAdd(ExpA1,{"D3_DOC"    , cDoc2                     ,})
                aAdd(ExpA1,{"D3_DTVALID",aDadosDest[x, 6]        ,})
                MSExecAuto({|x,y| mata240(x,y)},ExpA1,ExpN2)  <---AQUI OCORRE O ERRO

                If !lMsErroAuto
                    LogMsg('', 0, 14, 1, '', '',"Movimentação PAxCP-2-OK")
                Else
                    mostraerro()
                EndIf
            Endif
            x++
        EndDo
    End Transaction

Ele executa duas EXECAUTO, a primeira ocorre como deveria, a segunda não. Porem eu coloquei as duas dentro de um BEGIN TRANSACTION para tentar garantir que caso 1 das duas movimentações dessem erro, nenhum fosse executada. Porem constatei que quando a segunda da erro a primeira, por ja ter sido executada com sucesso, não recebe um rollback. Minha interpretação esta errada sobre a função? Sabem o que aconteceu?

*Obs: Lendo este link ele fala sobre uma DisarmTransaction, será que dentro das minhas validações de erro eu preciso forçar a finalização da transação ou isso é redundante?

compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags advpl semaforo ou faça a sua própria pergunta.