Aplicación web con ASP.NET MVC 2 – parte 12 – Reportes en PDF

Ahora generaremos un reporte local en nuestra aplicación y lo presentaremos como documento PDF en el navegador para que pueda ser impreso o guardado, para ello, utilizaremos el elemento Report Document, y la clase LocalReport que se encuentra en el espacio de nombres Microsoft.Reporting.WebForms (visite http://msdn.microsoft.com/es-mx/library/microsoft.reporting.webforms.localreport.aspx).

Antes de continuar, modifiquemos la vista Index y nuestro código JS para que se muestre un nuevo link junto al link “Registrar nuevo alumno en este grupo”, el nuevo link lo apuntaremos hacia una nueva acción que la llamaremos ImprimirLista.

Img. 1. Agregar link para imprimir lista.

El código a modificar en la vista Index para generar el link lo dejaremos como:


<p id="LinkAltaAlumno">
<% if (ViewData["IdGrupo"] != "")
{ %>
<%: Html.ActionLink("Registrar nuevo alumno en este grupo.", "Registrar", new { idgrupo = ViewData["IdGrupo"] }, null)%> |
<%: Html.ActionLink("Exportar como PDF", "ImprimirLista", new { idgrupo = ViewData["IdGrupo"] }, null)%>
<% } %>
</p>

Y en el JS modificado quedará como:

//habilitar el link para registrar un nuevo alumno en este grupo
$("#LinkAltaAlumno").html("<a href=\"/AdministrarAlumnos/Registrar?idgrupo=" + idgrupo + "\">Registrar nuevo alumno en este grupo.</a>" +
" | " +
"<a href=\"/AdministrarAlumnos/ImprimirLista?idgrupo=" + idgrupo + "\">Exportar como PDF</a>");

Creando el reporte.

El reporte a crear solo consiste en llenarlo con la lista de alumnos del grupo que se este mostrando en Index, por lo tanto, el reporte será llenado con una colección de objetos de la clase Alumno, ahora, para poder establecer una fuente de datos (DataSource) a través de la cual se llenará el reporte, debemos implementar un método en nuestra clase Alumno (puede ser también en una clase que en el servidor es una vista o directamente podría llenarse a través de una función que es un procedimiento almacenado en el servidor SQLServer).

Modificar la clase Alumno

Agregue una nueva clase Alumno en la carpeta Models (la clase será declarada como PARTIAL CLASS, si ya implementó la validación del formulario para el registro y edición de Alumno, entonces ya no es necesario volver a agregarla).

La partial class Alumno con nuestro nuevo método que será el DataSource de nuestro reporte quedará de esta forma.

public partial class Alumno
{
/*
* Aquí pueden ir o van las reglas de validación (Clase MetaData) si es que ya implementó la validación del form
*/
//Agregamos un nuevo método estático que devuelva la lista de alumnos
//que forman parte del grupo especificado
//utilizamos la interfaz IList para nuestra colección
public static IList<Alumno> ListaAlumnos(int idgrupo)
{
BDEscolarEntities BD = new BDEscolarEntities();
//recuperar la lista de alumnos desde la BD
var alumnos = BD.Alumno.Where(a => a.IdGrupoActual == idgrupo).OrderBy(a => a.Apellidos);
return alumnos.ToList();
}
}

Agregando el reporte:

Antes de agregar el reporte, agregaremos una nueva carpeta llamada Reportes en la carpeta Content.

Img. 2. Agregar carpeta Reportes.

Ahora sobre la carpeta Reportes vamos a agregar un nuevo elemento de tipo Informe llamado AlumnosGrupo.

Img. 3. Agregar el reporte.

Ahora tendremos el diseñador de informes, entonces agregaremos el DataSource para nuestro informe, para esto, en la ventana Datos del informe, seleccione Nuevo > Conjunto de datos.

Img. 4. Agregando nuevo conjunto de datos al informe.

Ahora especifique el nombre para el conjunto de datos, en origen de datos, seleccione el espacio de nombres (NombreProyecto.Models), y ahora en el conjunto de datos disponibles busque la clase Alumnos la cual ya nos muestra que disponemos de un método llamado ListaAlumnos, así que lo seleccionamos y damos en Aceptar.

Img. 5. Seleccionar el conjunto de datos.

Agregamos el encabezado y pie al reporte, agregamos también la tabla en cuerpo del reporte.

Img. 6. Agregar partes al reporte.

Agreguemos parámetros al reporte, a traves de los cuales podamos especificar el nombre del PE, cuatrimestre, grupo y nombre del tutor.

En la ventana de Datos de informe, nos ubicamos sobre Parámetros, y agregamos los parámetros correspondientes especificando el Nombre, Tipo de dato, etc.

Img. 8. Agregar parámetro.

Tendremos que agregar los parámetros que comentamos.

Img. 8. Agregar los parámetros correspondientes.

Ya con los parámetros y el conjunto de datos, terminemos el diseño de nuestro reporte.

Img. 9. Diseño del reporte.

La acción ImprimirLista.

Esta acción que se encargará de llenar el reporte y enviarlo al navegador, comentamos que recibirá el ID del grupo que se pretende exportar al reporte.

En esta acción utilizamos clases que se encuentran en el espacio de nombres Microsoft.Reporting.WebForms, por lo tanto, debemos agregar la referencia correspondiente:

Img. 10. Agregar referencia al componente Microsoft.ReportViewer.WebForms.

El código de la acción:

public ActionResult ImprimirLista(int idgrupo)
{
//comprobar que el grupo exista

  var grupo = BD.Grupo.Where(g => g.IdGrupo == idgrupo).FirstOrDefault();
if (grupo != null)
{
//declarar el objeto de la clase LocalReport
LocalReport localReport = new LocalReport();
localReport.ReportPath = Server.MapPath("~/Content/Reportes/AlumnosGrupo.rdlc");
//Llenar los 4 parámetros que creamos en el reporte
ReportParameter[] parametros = new ReportParameter[4];
parametros[0] = new ReportParameter("ProgramaEducativo", grupo.Cuatrimestre.ProgramaEducativo.NombreCorto.Trim());
parametros[1] = new ReportParameter("Cuatrimestre", grupo.Cuatrimestre.PeriodoInicio.Trim() + " - " +
grupo.Cuatrimestre.PeriodoFin.Trim() + " "+grupo.Cuatrimestre.Anio);
parametros[2] = new ReportParameter("Grupo", grupo.Nombre.Trim());
parametros[3] = new ReportParameter("Tutor", grupo.Tutor.Nombre.Trim() + " "+grupo.Tutor.Apellidos.Trim());
//agregar los parámetros al reporte
localReport.SetParameters(parametros);
//Preparar el DataSource del reporte
//aquí invocamos al método ListaAlumnos que agregamos a la clase Alumno
//pasandole como valor de parámetro el id del grupo que se quiere imprimir
//No hemos hablado de vistas o procedimientos almacenados, sino, aquí se invocarían directamente
ReportDataSource reportDataSource = new ReportDataSource("DatosAlumnos", Alumno.ListaAlumnos(idgrupo));
//Ahora pasamos los datos al reporte
localReport.DataSources.Add(reportDataSource);
//declaramos las variables de configuración para el reporte
string reportType = "PDF";
string mimeType;
string encoding;
string fileNameExtension;
//En la configuración del reporte debe especificarse para el tipo de reporte
//consulte el sitio para más información
//http://msdn2.microsoft.com/en-us/library/ms155397.aspx
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
//Transformar el reporte a bytes para transferirlo como flujo
renderedBytes = localReport.Render(reportType, null, out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
//enviar el archivo al cliente (navegador)
return File(renderedBytes, mimeType);
}
else
return View("Error");
}

Ejecutemos ahora nuestra app e intentemos ver un grupo en un reporte como PDF en nuestro navegador.

Ejemplo: quiero ver el documento para el grupo con el ID=1, 2, etc. ingreso a la url http://localhost:2958/AdministrarAlumnos/ImprimirLista?idgrupo=1 y obtengo

Img. 11. Reporte generado como PDF.

Y hasta aquí terminamos nuestra implementación de reportes en nuestra aplicación de ASP.NET  MVC 2.

En la última parte implementaremos los Roles y Usuarios.

Anuncios

2 comentarios en “Aplicación web con ASP.NET MVC 2 – parte 12 – Reportes en PDF

  1. amigo que buenos tutoriales me han servido de algo . mira hermano tengo que entregar un proyecto pero aun me falta un poco, te agradeceria si me ayudaras un poco , mi proyecto es de un restaurant , ya tengo las vistas donde se agregan, borran , editan los platillos , postres y bebidas ……. ahora hay otra vista donde se generará lo que el cliente pagara ahi tengo 3 dropdownlist donde selecciono que comida elijio , otra que postre , otra la bebida , ahora lo que quiero es que conforme a la base de datos al elejir digamos un refresco en la lista de bebidas lo que quiero es pasar ese refresco y su precio a un datagrid o solo el precio a una caja de texto para posteriormente sumar el del refresco con el postre y la comida elejida y tener la cuenta total … osea lo que me falta es mandar a traer los datos de la base a algo para hacer la suma .. te agraderia mucho hermano si me pudieras ayudar , te dejo mi correo si puedes contactarme por mail o msn , de antemano gracias

Escribe tu comentario:

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s