Escolar Documentos
Profissional Documentos
Cultura Documentos
Bom dia,
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
// -
//==========================
// - 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?
2 respostas
Patrick, bom dia.
Abraço,
Mas a regra do Begin Transaction não é DEU ERRO = ROLLBACK?
Ou só por que não deu um errorLog ele não da RollBack?
Claro, se o disarmtransaction não funcionar.
O próprio nome já diz isso... não tem qualquer controle sobre dar rollback.
Para isso, você tem que usar o comando DisarmTransaction.
Até entendi o seu ponto de vista... "se deu erro, era pra voltar a transação"
mas pare para olhar friamente: esse trecho de código não sabe que deu
erro! Imagine que você não estivesse usando ExecAuto... imagine que
fosse um teste ou inclusão "na mão"... como ele saberia se incluiu com
sucesso ou não?