Gravando log do ExecAuto em um arquivo TXT

Hoje vou mostrar como gravar o erro de um ExecAuto em TXT tanto no padrão MVC quanto no modo antigo.

Algumas vezes precisamos criar algum ExecAuto para inclusão ou manipulação de rotinas padrões. Às vezes, essas rotinas rodam em background, como em importações ou Jobs.

Portanto, é possível gerar um TXT com o erro, tanto da maneira antiga, como em MVC.

Da maneira antiga, é necessário apenas declarar algumas variáveis como private antes da chamada do ExecAuto, e depois se houve erro, pegar o erro jogar em um Array, percorrê-lo e salvá-lo em um txt.

//Variáveis para controlar o TXT
Local aLogAuto := {}
Local cLogTxt  := ""
Local cArquivo := "C:\TOTVS\exemplo1.txt"
Local nAux     := 0

//Variáveis de controle do ExecAuto
Private lMSHelpAuto     := .T.
Private lAutoErrNoFile  := .T.
Private lMsErroAuto     := .F.

// [ ... Lógica da sua Rotina ... ]

//Chamando o cadastro de produtos de forma automática
MSExecAuto({|x, y| Mata010(x, y)}, aVetor, 3)

//Se houve erro
If lMsErroAuto
//Pegando log do ExecAuto
aLogAuto := GetAutoGRLog()

//Percorrendo o Log e incrementando o texto (para usar o CRLF você deve usar a include "Protheus.ch")
For nAux := 1 To Len(aLogAuto)
cLogTxt += aLogAuto[nAux] + CRLF
Next

//Criando o arquivo txt
MemoWrite(cArquivo, cLogTxt)
EndIf

Para rotinas em MVC, é apenas necessário verificar se houve um erro no Modelo de Dados, e se houve, monta o log para geração do TXT.

//Variáveis para controlar o TXT
Local aLog      := {}
Local nX        := 0
Local cLog      := ""
Local cArquivo  := "C:\TOTVS\exemplo2.txt"

// [ ... Lógica da sua Rotina ... ]

//Se for nulo, carrega o modelo de dados
If oModelCtb == Nil
oModelCtb := FWLoadModel('CTBA020')
EndIf

//Set a operação de Alteração no modelo, e ativa ele
oModelCtb:SetOperation(nOpcAuto)
oModelCtb:Activate()

//Pega o modelo (grid) da CVD, e define os campos
oCVD := oModelCtb:GetModel('CVDDETAIL')
oCVD:SetValue('CVD_FILIAL', FWxFilial('CVD'))
oCVD:SetValue('CVD_ENTREF', cEntidade )
oCVD:SetValue('CVD_CODPLA', cPlanoRef )
oCVD:SetValue('CVD_VERSAO', cVersao   )
oCVD:SetValue('CVD_CTAREF', cContaRef )
oCVD:SetValue('CVD_CUSTO' , cCenCusto )
oCVD:SetValue('CVD_CLASSE', cClaConta )
oCVD:SetValue('CVD_TPUTIL', cTpUtil   )
oCVD:SetValue('CVD_NATCTA', cNatConta )
oCVD:SetValue('CVD_CTASUP', cEntSuper )

//Valida os dados preenchidos, se deu certo, faz um commit
If oModelCtb:VldData()
oModelCtb:CommitData()

Else

//Recupera o erro e joga no array de log
aLog := oModelCtb:GetErrorMessage()
cLog := ""

//Percorrendo o Log e incrementando o texto (para usar o CRLF você deve usar a include "Protheus.ch")
For nX := 1 To Len(aLog)
If ! Empty(aLog[nX])
cLog += Alltrim(aLog[nX]) + CRLF
EndIf
Next

//Grava o Arquivo
MemoWrite(cArquivo, cLog)
EndIf

//Desativa o modelo de dados
oModelCtb:DeActivate()

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta