Uso de Return dentro do BeginTransaction

Senhores estou com seguinte bug apontado no codeanalytics:

Uso de Return dentro do BeginTransaction

Abaixo segue o Trecho do código que esta retornando o bug:

If !Empty(cIntegrado)

BEGIN TRANSACTION

If !Empty(p_cNotaIni)

IncProc("Importando NF de transferencia de Medicamentos na Matriz "+_cDoc+"/"+_cSerie)

EndIf

_lOk := U_UNP015(_cDoc,_cSerie,_cChave,_dEmissao)

If !_lOk

DisarmTransaction()

Return

EndIf

If !Empty(p_cNotaIni)

IncProc("Gerando Pedido de Venda do Integrado...")

EndIf

cNumPedido := U_LHC16(_cDoc,_cSerie)

If Empty(cNumPedido)

DisarmTransaction()

Alert(OemToAnsi("LHC16 - Erro na Inclusão do Pedido referente a NF de transferência " + _cSerie + "/" + _cDoc))

Return

EndIf

END TRANSACTION

Como posso fazer para matar esse problema? Alguem com algo parecido?

Olá Luis,

A utilização de mensagens e retornos dentro de transação não é considerada uma boa prática, já tivemos situações do return ser antes do End Transaction e gerar problemas, assim como já tivemos mensagens que seguraram a transação levando a um dead lock generalizado na rotina.

Essas experiências nos ensinaram bastante a evitar esse tipo de código.

Um exemplo do seu código, seria o seguinte:


Local cMsgError as character

If !Empty(cIntegrado)

    BEGIN TRANSACTION

        If !Empty(p_cNotaIni)
            IncProc("Importando NF de transferencia de Medicamentos na Matriz "+_cDoc+"/"+_cSerie)
        EndIf

        _lOk := U_UNP015(_cDoc,_cSerie,_cChave,_dEmissao)

        If _lOk
            If !Empty(p_cNotaIni)
                IncProc("Gerando Pedido de Venda do Integrado...")
            EndIf

            cNumPedido := U_LHC16(_cDoc,_cSerie)

            If Empty(cNumPedido)
                DisarmTransaction()
                cMsgError := OemToAnsi("LHC16 - Erro na Inclusão do Pedido referente a NF de transferência " + _cSerie + "/" + _cDoc)
            EndIf
        Else
            DisarmTransaction()
        EndIf

    END TRANSACTION

EndIf

If !Empty(cMsgError)
    Alert(cMsgError)
EndIf

Acredito que deseja forma, o código terá o mesmo comportamento, mas respeitando as boas práticas adotadas pelo SonarQube.