Recuperar contraseña
  • Página principal
  • /
  • Blogs
  • /
  • Cómo repartir informes por correo desde la base de datos de una aplicación WinForms

Cómo repartir informes por correo desde la base de datos de una aplicación WinForms

Dmitriy Fedyashov

Los informes son una parte integral del flujo de trabajo y los informes electrónicos, del flujo de trabajo electrónico. Uno de los mecanismos principales para repartir informes electrónicos es através del correo electrónico. Quizás todos los generadores de informes modernos tengan un cliente de correo instalado para poder enviar informes directamente desde el programa.

FastReport.Net no es una excepción. Puede enviar informe en el modo de vista previa o directamente a través del código de la aplicación. Esto es conviniente si envia informe a un recipiente único. Aunque sea possible añadir varios recipientes, no es siempre oportuno. Por ejemplo, cuando quiere crear un boletín con el nombre del usario: “Querido Ivan Ivanovich...”. Por lo tanto, vamos a examiner un ejemplo de cómo enviar un informe a varios recipientes cuyos direcciones y nombres se cogen de la base de datos. Primero, cree una base de datos y una tabla dentro. Por ejemplo, base de datos acces en el formato mdb :

Cree una aplicación WinForms : Añada dos botones y campos de texto para los ajustes de e-mail:

El primer botón sirve para mandar informe separadamente y el segundo sirve para mandar informe a una lista de direcciones. Entenderá como funciona todo más tarde del código.

Cada campo tiene un valor por defecto; si quiere, puede establecer un valor distinto.

Cree una fuente de datos de aplicación utilizando el asistente:

A continuación, ajuste la cadena de conexión a la base de datos y seleccione tabla:

Añada al proyecto un hipervínculo a la biblioteca FastReport . También necesitamos un archivo con un modelo de informe que vamos a repartir por correo. Añádalo al proyecto. Por ejemplo, vamos a utilizar el informe text.frx de la carpeta Demo 

Ahora cree un manipulador del evento "pulsar el botón Direct email".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Data;
using System.Windows.Forms;
using FastReport;
using FastReport.Utils;
using FastReport.Export.Pdf;
using FastReport.Export.Email;
 
 private void SendReport_Click(object sender, EventArgs e)
 {
 Config.ReportSettings.ShowProgress = false; //Disable progress window
 
 Report report1 = new Report(); //Create new report object
 report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report
 report1.Prepare(); //Prepare report
 PDFExport pdf = new PDFExport(); //Cteate PDF export
 EmailExport email = new EmailExport(); //Create Email export
 EmailsDataSet ds = new EmailsDataSet();
 EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter();
 adapter.Fill(ds.Customer);
 DataTable table = ds.Customer;
 
 foreach (DataRow row in table.Rows)
 {
 SendMessage(report1, pdf, email, row["Email"].ToString(), row["Name"].ToString());
 }
 }

Aquí primero cree objeto del informe, cargue el modelo en él y cree Exportar en PDF y E-mail. El informe se adjuntará al correo  en el formato PDF.

A continuación, tenemos que crear una fuente de datos y rellenar la tabla con datos. Revise las entradas de la tabla y mande un mensaje para cada una. Claro, si tiene una lista larga, este método es muy lento. Pero puede insertar en el texto del correo el nombre del cliente.

Como ve, hemos sacado el enviar del correo a un método separado, SendMessage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName)
 {
 email.Account.Address = AddressFromTxt.Text;
 email.Account.Name = SenderNameTxt.Text;
 email.Account.Host = HostTxt.Text;
 email.Account.Port = Convert.ToInt16(PortTxt.Text);
 email.Account.UserName = UserNameTxt.Text;
 email.Account.Password = PasswordTxt.Text;
 email.Account.MessageTemplate = "Test";
 email.Account.EnableSSL = true;
 email.Address = recipient;
 email.Subject = MailSubjectTxt.Text;
 email.MessageBody = custName is null? MessageTxt.Text : string.Format("Dear, {0}! {1}", custName, MessageTxt.Text);
 email.Export = pdf; //Set export type
 email.SendEmail(report); //Send email
 }

Y para el botón Send to all vamos a crear otro manipulador de evento, OnClick .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void Send_to_all_Click(object sender, EventArgs e)
{
Config.ReportSettings.ShowProgress = false; //Disable progress window
Report report1 = new Report(); //Create new report object
report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report
report1.Prepare(); //Prepare report
PDFExport pdf = new PDFExport(); //Cteate PDF export
EmailExport email = new EmailExport(); //Create Email export
 
string emails = "";
EmailsDataSet ds = new EmailsDataSet();
EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter();
adapter.Fill(ds.Customer);
DataTable table = ds.Customer;
 
foreach (DataRow row in table.Rows)
{
if (emails == "")
emails = row["Email"].ToString();
else
emails = emails + ", " + row["Email"].ToString();
}
SendMessage(report1, pdf, email, emails, null);
MessageBox.Show(emails);
}

A diferencia del código anterior, aquí en el ciclo añadimos direcciones para enviar a una variable y después la mandamos al método de enviar correos. Este método funciona mucho más rápido que el anterior, sobre todo si la lista de correo es larga. Aquí mandamos un correo en lugar de varios.

De esta manera, la tarea de enviar informes se reduce a exportar en e-mail y enviar correo a cada dirección desde la base de datos..

Similar articles:

Volver