Como fazer o disparo de um relatório automaticamente via AdvPL

No artigo de hoje, vou mostrar como disparar um relatório automaticamente por e-Mail via AdvPL, usando tanto TReport como FWMSPrinter.

TReport:

Para esse caso, é possível gerar um html do relatório e enviar por e-Mail.

Primeiro, certifique-se de ter configurado corretamente os parâmetros para envio de e-Mail (os MV_REL*** ou veja o passo a passo do TDN clicando aqui).

Após isso, ao criar seu fonte com TReport, defina para quem será enviado com o atributo cEmail. No nDevice defina como 3 (que é o tipo que envia por e-mail). Abaixo um exemplo do trecho mencionado:

//Cria as definições do relatório
oReport := fReportDef()
 
//Define o e-Mail de destinatário
cPara := "teste@teste.com"
 
//Define que será executado sem tela (job), o e-Mail destinatário, o tipo 3 (e-Mail) e gera o arquivo sem visualização
oReport:nRemoteType := NO_REMOTE
oReport:cEmail := cPara
oReport:nDevice := 3 //1-Arquivo,2-Impressora,3-email,4-Planilha e 5-Html
oReport:SetPreview(.F.)
oReport:Print(.F., "", .T.)

FWMSPrinter:

Primeiro, tenha uma variável que define se esta rodando via Job ou não (iremos chamar de lJob). Se for via Job, a pasta que você irá apontar, deve ser dentro da Protheus data, por exemplo, x_relatorios.

Após processar o relatório, se for via job, você aciona o método Print() e anexa o arquivo no disparo do e-Mail.

//Se for via JOB, muda as parametrizações
If lJob
	//Define o caminho dentro da protheus data e o nome do arquivo
	cCaminho := "\x_relatorios\"
	cArquivo := "zTstRel_job_" + dToS(dDataGer) + "_" + StrTran(cHoraGer, ':', '-') + ".pdf"
	 
	//Se não existir a pasta na Protheus Data, cria ela
	If ! ExistDir(cCaminho)
		MakeDir(cCaminho)
	EndIf
	 
	//Cria o objeto FWMSPrinter
	oPrintPvt := FWMSPrinter():New(cArquivo, IMP_PDF, .F., '', .T., .F., , , .T., .T., , .F.)
	oPrintPvt:cPathPDF := cCaminho
	 
Else
	//Definindo o diretório como a temporária do S.O. e o nome do arquivo com a data e hora (sem dois pontos)
	cCaminho  := GetTempPath()
	cArquivo  := "zTstRel_" + dToS(dDataGer) + "_" + StrTran(cHoraGer, ':', '-')
	 
	//Criando o objeto do FMSPrinter
	oPrintPvt := FWMSPrinter():New(cArquivo, IMP_PDF, .F., "", .T., , @oPrintPvt, "", , , , .T.)
	oPrintPvt:cPathPDF := cCaminho
EndIf
 
//Setando os atributos necessários do relatório
oPrintPvt:SetResolution(72)
oPrintPvt:SetPortrait()
oPrintPvt:SetPaperSize(DMPAPER_A4)
oPrintPvt:SetMargin(60, 60, 60, 60)

/*
	Aqui você coloca a lógica do seu relatório com os comandos de impressões como StartPage, Box, SayAlign, etc
*/


//Se for via job, imprime o arquivo para gerar corretamente o pdf
If lJob
	oPrintPvt:Print()
	 
	//Atenção! - é necessário baixar a função zEnvMail() - disponível em https://terminaldeinformacao.com/2017/10/17/funcao-dispara-e-mail-varios-anexos-em-advpl/
	cPara    := "teste@teste.com"
	cAssunto := "Assunto Teste"
	cCorpo   := "Corpo do e-Mail Teste"
	aAdd(aAnexos, cCaminho + cArquivo)
	u_zEnvMail(cPara, cAssunto, cCorpo, aAnexos)
	 
//Se for via manual, mostra o relatório
Else
	oPrintPvt:Preview()
EndIf

Referências:

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Ca disse:

    Poderia nos dar um exemplo de como devem ser postos os parâmetros no programa, para que o relatório seja enviado corretamente e automaticamente via e-mail.
    Att

Deixe uma resposta

Terminal de Informação