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.
Daniel, você tem algum post explicando o funcionamento das variáveis lMsErroAuto, lMsHelAuto e lAutoErrNoFile? Não encontro nenhum artigo em específico que fale sobre o funcionamento das três variáveis e quais os cenários de utilização de cada uma delas.
Boa tarde Henrique, tudo joia?
Dê uma olhada nesse link se te ajuda, nele tem uma explicação sobre cada variável: https://tdn.totvs.com/pages/releaseview.action?pageId=566489232
Um grande abraço.