Como saber se uma DO TRANSACTION foi atualiza com sucesso? Exemplo: do transacttion: Gravo ou altero tabelas. end. Se todas as tabelas foram gravadas com sucesso aí continuo fazendo outras gravações caso contrário tomo outras providências. Grato
Bom dia Maciel, Eu partiria do principio que se foi tudo executado e minha transação foi desenvolvida corrente, foi executado, talvez um código assim, mas sempre garantir que em caso de erro será executado um LEAVE ou RETURN, para sair do bloco: Código: DEFINE VARIABLE lerro AS LOGICAL NO-UNDO. ASSIGN lerro = YES. Bloco_Transacao: DO TRANSACTION ON ERROR UNDO Bloco_Transacao, LEAVE Bloco_Transacao ON QUIT UNDO Bloco_Transacao, LEAVE Bloco_Transacao ON ENDKEY UNDO Bloco_Transacao, LEAVE Bloco_Transacao ON STOP UNDO Bloco_Transacao, LEAVE Bloco_Transacao: /* Aqui vc coloca a regra do erro */ IF a > b THEN UNDO Bloco_Transacao, LEAVE Bloco_Transacao. /*Continua o código*/ IF X = Y THEN UNDO Bloco_Transacao, LEAVE Bloco_Transacao. /*Final de tudo */ ASSIGN lerro = NO. END. /* Bloco_Transacao */ /* Executou tudo corretamente */ IF NOT lerro THEN MESSAGE "Transação OK" VIEW-AS ALERT-BOX INFO BUTTONS OK. /* Apresentou algum erro */ ELSE MESSAGE ERROR-STATUS:GET-MESSAGE(1) VIEW-AS ALERT-BOX INFO BUTTONS OK. Também já fiz códigos bem mais complexos, mas não no sentido de garantir a transação, e sim detectar possíveis erros que não foram bem tratados em outras instâncias, como triggers. Espero que seja um início para seu entendimento, e espero ter ajudado. Abs.
Bom dia, eu concordo com cobra.cnr. Porem eu costumo utilizar procedimentos. Exemplo: b-main: do on error undo b-main, leave b-main. run minhaTransacao in this-procedure. if return-value ne 'minhaTransacao_ok' then undo b-main, leave b-main. /* nao aplicou */ return 'Programa_ok'. /*aplicou a transacao*/ end. undo, return error. Procedure minhaTransacao. B-trans: DO TRANSACTION ON ERROR UNDO B-trans, LEAVE B-trans ON QUIT UNDO B-trans, LEAVE B-trans ON ENDKEY UNDO B-trans, LEAVE B-trans ON STOP UNDO B-trans, LEAVE B-trans: /* aqui você coloca seu codigo */ return 'minhaTransacao_ok'. end. /*B-trans*/ message 'Ocorreu uma falha. a transacao será desfeita.'. readkey pause 9. undo, return error. End Procedure.