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?