[RESOLVIDO] Forçando erro no 'do transaction'

Discussão em 'EMS , HCM e Totvs 11' iniciado por magidigor, Fevereiro 7, 2014.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. magidigor

    magidigor Membro Participativo

    Boa tarde.

    estou com duvida quanto a utilização do do transaction.

    Estou criando um rotina que inserir on-line um sobra na ordem e reporta.

    A rotina deve funcionar da seguinte forma:

    do transaction:
    >>Busca ultimo reporta de ACA feito para a ordem;
    >>Grava os movimentos de ultimo reporte em uma temp-table;
    >>Estorna ultimo reporte;
    >>Faz alguma validações de consistências para reporta o item novamente;
    (((((Neste ponto, se houver alguma coisa errada, gostaria de forçar um erro para que o 'TRANSACTION' desfaça o estorno que havia feito acima)))));
    >>Se estivesse tudo OK, inclui a SOBRA na temp-table;
    >>Reporta usando a include padrão do datasul;
    >>Fim do processo.
    end.

    Ate onde sei, o Transaction garante que o processo chegue ate o final, mais não sei como gerar um erro para ele desfazer o estorno que havia feito.

    Desde ja agradeço.
  2. lwazevedo

    lwazevedo Membro Ativo

    Não sei se é possível fazer isto, mas andei dando uma olhada no help e tive um ideia só não posso te afirmar se vai funcionar, mas quem sabe
    da uma testada aia e vê se funciona...

    Código:
    
    DEF VAR lError AS LOG INIT NO.
       
    DO  TRANSACTION ON ERROR UNDO:
    
       /*Faz teu processo, se houver error , a variavel lError recebe yes.*/
       IF lError THEN  UNDO, LEAVE.
       ELSE 
           /*faz o resto*/..
    
    END.
    
    
  3. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Bom dia,

    O comando que defaz a transação é o UNDO, recomendo definir um label para o bloco para facilitar o entendimento do código quando for executar a ação, eu também trato outros situações de erro durante a execução.

    Quanto ao comando seguinte ao UNDO, pode ser o LEAVE que vai sair do bloco, ai depende da estrutura do seu programa para avaliar a continuidade da procedure, ou você também pode dar um RETURN, que já sairá da rotina.

    Código:
    DEFINE VARIABLE lerro AS LOGICAL    NO-UNDO.
    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 lerro THEN
            UNDO Bloco_Transacao, RETURN "Mensagem de Erro".
        /*Continua o código*/
    END. /* Bloco_Transacao */
    
    abs.
    don.junior curtiu isso.
  4. lwazevedo

    lwazevedo Membro Ativo

    Legal Cleilton, eu estava na dúvida se o código que postei iria funcionar da forma que o magidigor queria.

    Valeu.
  5. magidigor

    magidigor Membro Participativo

    Excelente... era isso mesmo que precisava...

    Muito obrigado a vocês... me ajudaram bastante.

    Problema resolvido.
  6. lwazevedo

    lwazevedo Membro Ativo

    Fico feliz em ter ajudado.....

    abraço.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página