Do transaction (erro)

Discussão em 'Progress 4GL' iniciado por Maciel Costa, Fevereiro 21, 2014.

  1. Maciel Costa

    Maciel Costa Sem Pontuação

    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
  2. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    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.
  3. renato.schlogel

    renato.schlogel Membro Participativo

    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.
    Última edição: Fevereiro 25, 2014
  4. Maciel Costa

    Maciel Costa Sem Pontuação

    Bom dia amigos!
    Agradeço !
    Abraços!

Compartilhe esta Página