Gerar relatórios em pdf e enviar por email

O Service Pack 2 do Office 2007 trouxe uma ótima novidade, que é a de poder gerar arquivos de pdf dos objetos do Access, de forma nativa; ou seja, sem ferramentas de terceiros.   O Access 2010 também vem com esta funcionalidade.

É bastante comum nas empresas, o envio de relatórios a clientes e fornecedores, tais como propostas e pedidos de compra.  O arquivo transmitido no formato de pdf é o mais bem aceito no mercado, pois 95% das máquinas têm instalado o leitor de PDF (Adobe Acrobat Reader).

Com o comando OutputTo é possível gerar arquivos pdf de tabelas, consultas, formulários, relatórios e outros.

Com o OutputTo você pode gerar outros formatos de arquivos,  como HTML, XLS, TXT, RTF, SNP, ...

O que é preciso informar ao comando OutputTo para gerar um arquivo pdf de um relatório?

1- Que objeto iremos transformar em pdf - acOutputReport
2- O nome do objeto - rltProposta
3- O formato de saída do objeto - acFormatPDF
4- O local de destino e o nome para o arquivo pdf a ser gerado - c:\Projeto\Proposta02.pdf

Docmd.OutputTo acOutputReport,"rltProposta",acformatPDF,"c:\Projeto\Proposta02.pdf" 

Ao executar o comando OutputTo, ele abrirá o relatório rltProposta, gerando o arquivo proposta02.pdf e gravando na pasta Projeto.

Local para armazenar o arquivos gerados

Na prática, costumo criar uma pasta exclusiva para armazenar os arquivos de pdf no mesmo local do aplicativo.  Assim posso criar um caminho relativo para esta pasta, com o seguinte comando:

CurrentProject.Path & "\enviados\Proposta02.pdf"

CurrentProject.Path informa a localização do aplicativo e a pasta enviados é o local para armazenar os arquivos de pdf gerados.

Se desejar se aprofundar sobre o caminho relativo, acesse aqui.

Nome do arquivo

O nome dado para os arquivos gerados tem que ser o mais sugestivo possível.  O que costumo fazer é associar o número da proposta e/ou pedido no nome do arquivo.  Exemplo:

CurrentProject.Path & "\enviados\Proposta" & me!nProposta & ".pdf"

O exemplo acima está capturando o número da proposta (me!nProposta) de um suposto formulário proposta  e incrementando-o  ao nome do arquivo que será gerado.

Fica a seu critério,  achar a melhor forma de gerar um nome para o seus arquivos de pdf.

Usando variáveis

O uso de variáveis permite uma boa organização na escrita.

Veja o resumo do que foi apresentado até aqui com a escrita mais apurada:

Dim strArquivo as string
Dim strLocal as string
 
strArquivo = "Proposta" & me!nProposta & ".pdf"
strLocal = CurrentProject.Path & "\enviados\" & strArquivo
 
Docmd.OutputTo acOutputReport,"rltProposta",acformatPDF,strLocal
 

Filtrando o relatório

O relatório, quando for aberto pelo OutputTo tem que estar devidamente filtrado para se gerar o arquivo pdf, com as informações desejadas.  As duas formas mais comuns de filtragem são: o uso de  parâmetros na consulta origem do relatório e o uso do argumento WHERE, do comando OpenReport.  

Prefiro utilizar o argumento WHERE do OpenReport, por ser o mais flexível nas possibilidades de filtragem!

O objetivo é abrir o relatório com as informações referentes ao registro que está sendo visualizado no formulário.  Por exemplo, se estou com o formulário aberto na proposta 1325, desejo abrir o relatório filtrado apenas com as informações da proposta 1325.  Para realizar a filtragem, podemos usar o campo do número da proposta, conforme a linha abaixo:

DoCmd.OpenReport "rltProposta",acViewPreview,,"nProposta = " & Me!nProposta

Mantendo o relatório aberto e filtrado para o OutputTo

Quando o OutputTo solicita a abertura do relatório, o mecanismo interno do Access identifica que já se encontra aberto o relatório solicitado e informa ao OutputTo que a abertura já foi realizada.    O comando OutputTo, então, gera o arquivo de pdf, aproveitando o relatório previamente aberto e filtrado.  Para ficar mais elegante, o relatório é aberto de forma oculta.

Veja o resumo do código:

Dim strArquivo as string
Dim strLocal as string
 
strArquivo = "Proposta" & me!nProposta & ".pdf"
strLocal = CurrentProject.Path & "\enviados\" & strArquivo
 
'Abre o relatório devidamente filtrado e oculto
DoCmd.OpenReport "rltProposta", acViewPreview,,"nProposta=" & Me!nProposta, acHidden
 
'Gera arquivo pdf do relatório previamente aberto e filtrado.
Docmd.OutputTo acOutputReport,"rltProposta",acformatPDF,strLocal
 
'Fecha o relatório
DoCmd.Close acReport, "rltProposta"
 

Como enviar o arquivo por email usando o Outlook ?

O código apresentado aqui está bem comentado para você compreender como é possível abrir o formulário de envio do Outlook e inserir o arquivo pdf no anexo.

Private Sub btemail_Click()
Dim strArquivo As string
Dim strLocal As string
Dim objOut As Object
Dim objmail As Object
Dim objAnexo As Object
'---------------------------------------------
'Carregando a coleção do Outlook
'Similar ao abrir o Outlook
'---------------------------------------------
Set objOut = CreateObject("Outlook.application")

'------------------------------------------------------------
'Abrindo o formulário de email para inserir os itens de email
'Similar ao clicar no botão NOVO do Outlook
'------------------------------------------------------------
Set objmail = objOut.CreateItem(olMailItem)

'------------------------------------------------------------
'Abrindo a opção anexo
'Similar ao clicar no botão ANEXO do Outlook
'------------------------------------------------------------
Set objAnexo = objmail.Attachments

'------------------------------------------------------------------------------
'Indico o nome do arquivo pdf e o local que será gravado.
'Neste exemplo gero os nomes dos arquivos, aproveitando o número da proposta, 
'ficando com o seguinte aspecto: proposta1.pdf, proposta2.pdf,...
'------------------------------------------------------------------------------
strArquivo = "Proposta" & me!nProposta & ".pdf"
strLocal = CurrentProject.Path & "\enviados\" & strArquivo

'----------------------------------------------------------------------------
'Abre o relatório filtrado e oculto, de acordo com a proposta selecionada.
'----------------------------------------------------------------------------
DoCmd.OpenReport "rltProposta", acViewPreview,,"nProposta=" & Me!nProposta, acHidden

'----------------------------------------------------------------------------
'Gera o pdf do relatório através do comando OutputTo.
'O mecanismo do Access reconhece que o relatório solicitado pelo OutputTo 
'já está aberto e então o OutputTo usará o relatório já aberto e filtrado.
'----------------------------------------------------------------------------
DoCmd.OutputTo acOutputReport, "rltProposta", acFormatPDF, strLocal

'---------------------------------------------
'Fecha o relatório que está oculto
'---------------------------------------------
DoCmd.Close acReport, "rltProposta"
 
'-------------------------------------------------------------
'Adiciona o arquivo pdf no anexo, capturado da pasta enviados
'-------------------------------------------------------------
objAnexo.Add strLocal, olByValue, 1

'--------------------------------------------------------
'Mostra o formulário de envio de email
'--------------------------------------------------------
objmail.Display

'-------------------------------------------------------
'Tudo já foi entregue ao Outlook; então podemos esvaziar
'a memória do computador usada pelas variáveis objeto.
'-------------------------------------------------------
Set objAnexo = Nothing
Set objmail = Nothing
Set objOut = Nothing
End Sub

Neste artigo eu explico em detalhes como você pode automatizar o Access para o envio de emails , usando o Outlook.  

 

 

 


1 comentários

Luís Augusto   7/4/2010 21:05:31

Excelente explicação Avelino, tentarei implementareste artigo ao meu projeto.
Obrigado.


Envie seu comentário: