Fina050 Não Deleta Corretamente

Boa tarde!

Estou usando o execauto da FINA050 para deletar alguns registros.. O problema é que as vezes ele simplesmente não deleta o registro e não volta nenhum erro.

Alguma idéia de como corrigir?

Segue o código:


Static Function FINA050EXC()
    LOCAL aArray := {}
    Local nY
    Local lMsErroAuto := .F.
    Local cErro := ""

    if alltrim(XZZM->ZZM_CTRID) != alltrim(SE2->E2_XCTRID)
        Return
    Endif 

    //Estrutura para demais títulos
    aArray :={          {"E2_FILIAL"     ,SE2->E2_FILIAL,Nil},;
                        {"E2_PREFIXO"     ,SE2->E2_PREFIXO,Nil},;
                        {"E2_NUM"          ,SE2->E2_NUM,Nil},;
                        {"E2_PARCELA"     ,SE2->E2_PARCELA,Nil},;
                        {"E2_TIPO"          ,SE2->E2_TIPO,Nil},;               
                        {"E2_NATUREZ"     ,SE2->E2_NATUREZ,Nil}}

    MsExecAuto( { |x,y,z| FINA050(x,y,z)}, aArray,, 5)  // 3 - Inclusao, 4 - Alteração, 5 - Exclusão
    //MSExecAuto({|x, y| FINA050(x, y)}, aArray, 5)

    If lMsErroAuto
        aLog        := GetAutoGRLog()

        For nY := 1 To Len(aLog)
            If !Empty(cErro)
                cErro += CRLF
            EndIf
            cErro += aLog[nY]
        Next nY
    Endif

Return cErro

Oi bom dia,

Verifique um registro que ocorre a exclusão e acesse o sistema na rotina FINA050 e tente excluir, verifica se existe algum impeditivo.

As vezes é alguma customização (PE) que está impedindo, que por cima exibe uma mensagem, por exemplo, e via execauto você não consegue enxergar. o Ideal é simular pela rotina esse mesmo título e tentar identificar. Ou até desabilitar os PE com o IXBLOG=NORUN e verificar se funciona.

Olá.

Algumas rotinas entram em conflito com validação de campo ou pontos de entrada, o que faz com que a variável lMsErroAuto retorne falso de forma indevida.

Nesses casos, já observei que a mensagem de erro é retornada pelo GetAutoGrLog() ou MostraErro(), apenas a variável lMsErroAuto que acaba não sendo atualizada devidamente.

Uma solução é tentar obter a mensagem de erro e usar ela em conjunto com a validação da variável lMsErroAuto para indicar se o processamento teve erro ou não.

Exemplo:

MsExecAuto( { |x,y,z| FINA050(x,y,z)}, aArray,, 5)

aLog := GetAutoGRLog()

If lMsErroAuto .or. Len(aLog) > 0

// indica que deu erro

Endif