Versão atual:

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?

Versões (2):

Ver a versão formatada

Begin Transaction não da rollback sozinho?

Comentário

new question