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.