Fazendo um Try … Catch em um controle de transações | Ti Responde 0190

No vídeo de hoje, vamos demonstrar em como usar Try … Catch dentro de um controle de transações.

A dúvida de hoje, nos perguntaram, se seria possível usar Try e Catch dentro de um Begin Transaction e End Transaction.

 

Pensando nisso, montamos um exemplo, onde vamos mostrar em como criar essa tratativa com um ExecAuto da MATA010 (Cadastro de Produtos e SB1).

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"

//Declaração da namespace
Namespace custom.terminal.youtube

/*/{Protheus.doc} User Function video0190
Aciona tratativa e erro nos códigos usando Transaction
@type Function
@author Atilio
@since 12/03/2024
@see https://tdn.totvs.com/display/tec/Try...Catch
@example custom.terminal.youtube.u_video0190()
/*/

User Function video0190()
    Local aArea         := FWGetArea() As Array
    Local aData         := {}          As Array
    Private oError      := Nil         As Object
    Private lMsErroAuto := .F.         As Logical

    //Inicia o controle de transações
    Begin Transaction

        //Tenta executar os comandos
        TRY
            //Adiciona os campos
            aAdd(aData, {"B1_COD",    "E0003",        Nil})
            aAdd(aData, {"B1_DESC",   "Caneta Preta", Nil})
            aAdd(aData, {"B1_TIPO",   "PA",           Nil})
            aAdd(aData, {"B1_UM",     "UN",           Nil})
            aAdd(aData, {"B1_LOCPAD", "01",           Nil})
            aAdd(aData, {"B1_GRUPO",  "G002",         Nil})

            //Chama a inclusão
            MsExecAuto({|x, y| MATA010(x, y)}, aData, 3)
            
            //Se houve erro, mostra a mensagem e aborta o try
            If lMsErroAuto
                MostraErro()
                forceError()
            EndIf

            //Mostra mensagem
            FWAlertSuccess("Sucesso na execução do Try com Transaction", "Teste Try ... Catch")

        //Caso houve falha, captura e exibe
        CATCH oError
            FWAlertError("Erro gerado: " + oError:Description , "Teste Try ... Catch")
        ENDTRY

    End Transaction
  
    FWRestArea(aArea)
Return

Static Function forceError()
    DisarmTransaction()

    oError := ErrorClass():New()
    oError:genCode := 19584
    oError:description := "Erro forçado dentro da função forceError()"
    THROW oError
Return

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação