Haciendo Reportes para Aplicaciones Web: Parte 3
Bien, continuando con esta última parte de la serie de de reportes para aplicaciones web, vamos a basarnos en el reporte que ya teníamos antes para hacer una construcción de subreportes o reportes anidados.
En primer lugar, debemos decir que un subreporte no es más que un reporte independiente que es definido y llamado desde dentro de otro reporte. En el diseñador de reportes debemos seleccionar el objeto Subreport y arrastrarlo hasta nuestro reporte.
Hay dos requerimientos importantes que debemos mencionar acerca de los subreportes:
1. La estructura del subreporte debe ser por medio de una tabla (diseño en forma de tabla, no se refiere a que los datos deben provenir de una tabla de base de datos).
2. En el reporte padre solamente se muestra la parte de “Body” del subreporte (el header y footer son ignorados).
Entonces, manos a la obra. Empecemos por definir nuestro nuevo reporte que va a ser el subreporte que llamaremos del reporte que ya teníamos (¿parece trabalenguas verdad?). Para empezar, crearemos un nuevo reporte al que llamaremos DetalleOrdenes.rdlc y le agregaremos un objeto Tabla de la caja de herramientas (toolbox).

Arrastramos ahora los campos ProductID, Quantity y UnitPrice a cada uno de los campos en la tabla de la siguiente forma:

Para efectos del artículo no entraremos en detalles del formato y lo dejaremos tal y como está. Ahora es necesario definir un parámetro para el reporte, el parámetro nos servirá para mostrar solamente aquellos registros del detalle de la orden que correspondan con la orden misma, una especie de reporte maestro-detalle. La definición la hacemos en el menú Report y seleccionando la opción Report Parameters. El parámetro lo llamaremos NoOrden y será de tipo Integer (no olvide chequear el checkbox de la opción Allow Null Value).


Ahora seleccionamos la tabla y vamos a las propiedades de la misma seleccionando el Tab de Filters. Esto nos servirá para hacer el filtro del parámetro y que se seleccionen solo los datos que corresponden a la orden.
Para la definición del filtro, es necesario indicar que el valor para el campo OrderID debe ser igual al del parámetro NoOrden.
Bien, eso es todo en el subreporte. Ahora regresamos a nuestro reporte principal y hacemos al objeto List un poco más grande para poder ubicar al objeto Subreport dentro de él:
Ahora debemos configurar nuestro objeto Subreport. Indicaremos primero que utilice el reporte DetalleOrdenes.rdlc que acabamos de crear, para ello entramos a las propiedades del subreport y en el Tab General seleccionamos:
Ahora vamos al Tab Parameters donde le daremos el valor a nuestro parámetro y le decimos que el parámetro NoOrden tomará su valor del campo OrderID:
Ahora, le diremos al objeto List que solamente nos muestre una orden por página, así podremos tener una mejor visión del efecto del subreporte y veremos claramente la información de la orden. Para lograr esto iremos a las propiedades del objeto List y en el Tab General haremos click en el botón “Edit details group”; en la sección Expression seleccionaremos al campo OrderID y luego seleccionaremos la opción “Page break at end”.

Ahora podemos ejecutar el reporte para ver el resultado de todo lo que hemos hecho:

La ejecución produce dos resultados, uno esperado, uno inesperado. El resultado esperado es que efectivamente se muestra solamente una orden en cada página. El resultado inesperado es un error al mostrar el subreporte.
Este error sucede debido a que el modo en que funciona el subreporte. Es necesario indicarle la fuente de datos, como hasta este momento solamente hemos definido la fuente de datos para el reporte padre el subreporte no tiene fuente de datos, entonces es necesario definirla, pero no se define en cualquier lado. Para ello es necesario escribir un poco de código.
Primero vamos al archivo de CodeBehind de la página default, Default.aspx.cs, y definiremos un método para realizar el procesamiento del evento SubreportProcessing del objeto LocalReport que ya hemos visto antes. Agregamos al inicio del archivo la siguiente directiva:
using Microsoft.Reporting.WebForms;
Y ahora escribimos el método:
protected static void LocalReport_SubreportProcessing
(object sender, SubreportProcessingEventArgs e)
{
}
Este método nos servirá como manejador del evento donde diremos que fuente de datos debe usar el subreporte. Observen la estructura, debe ser igual a la mostrada. Ahora indicamos la fuente de datos:
protected static void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
ObjectDataSource ObjectDataSource2 = new ObjectDataSource
(“Report.Part1.DataSet2TableAdapters.Order_DetailsTableAdapter”, “GetData”);
e.DataSources.Add(new ReportDataSource(“DataSet2_Order_Details”, ObjectDataSource2));
}
Pero esto no es todo. Hay que indicarle al evento SubreportProcessing del objeto LocalReport que use ese método. Esto lo logramos agregando la siguiente línea de código al final del evento Page_Load:
ReportViewer1.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
Luego de esto podemos ejecutar nuevamente la aplicación y veremos el siguiente resultado:

Bien, espero les haya gustado y ojalá les sirva mucho para realizar tareas más complejas en sus aplicaciones.
Hasta la próxima.
14 comentarios »
Deja un comentario
-
Archivos
- Junio de 2008 (3)
- Mayo de 2008 (3)
- Abril de 2008 (4)
- Marzo de 2008 (7)
- Febrero de 2008 (12)
- Enero de 2008 (11)
- Diciembre de 2007 (3)
- Noviembre de 2007 (13)
-
Categorías
-
RSS
Subscripciones RSS
RSS de los Comentarios


Hola joseguay estoy haciendo un report(ya he hecho alguno) y ahora me esta dando quebraderos de cabeza:
Te explico:
Hola, me gustaria crear columnas dinamicamente en un reportviewer:
tengo tabla(sql server 2000) y en ella dos campos(entre otros):fecha_inicio y fecha_fin
me gustaria que el reportviewer me generase columnas dinamicamente, tantas columnas como dias haya entre inicio y fin. Ejemplo:
fecha_inicio:01/01/2008 fecha_fin:05/01/2008
Report:
Id Dni Nombre 01/01/2008 02/01/2008 03/01/2008 04/01/2008 05/01/2008
mahoni
tube el mismo dilema, lamentablemte no encontre nada de forma nativa para solucionarlo.
al final opte por realizar un procedimiento almacenado el cual me entrega las tres columnas.
espero que te haya servido para orientarte.
Hola vengo de tu segundo articulo y me parece excelente, ahora estoy tratando de aplicar ese principio a un store procedure que me recibe ciertos parametros para filtrar o traer todos segun el valor del parametro y funciono bien, ahora lo que necesito me ayudes es para imprimirlo, ya que el control en su version 2005 no viene con el boton de imprimir asi como lo muestra el tuyo aunque la opcion ShowPrintButton este en true. muchas gracias
Daniel, el reporte en la versión 2005 si tiene varias limitaciones, pero se puede superar si primero lo exportas a PDF y luego lo imprimes. Es la mejor manera ya que el print del navegador no lo hace bien.
La recomendación sería que te movieras a Visual Studio 2008 y que utilices el ReportViewer de esa versión que ya incluye el botón de imprimir.
Saludos.
José Rolando Guay Paz
gracias por tu pronta respuesta, mira ahora tengo otra duda, tengo un store procedure configurado por un valor por default supuse que al ligarlo a un informe y ejecutarlo aparecerian todos mis datos en pantalla y cuando quisiera filtrarlos pues obviamente le paso el valor al sp por medio de un parametro al informe. Pero resulta que no, cuando mando a llamar al reporte sin mandarle parametro alguno no aparece, y me da un error :
Error al procesar el informe.
ObjectDataSource ” no pudo encontrar un método ‘GetData’ no genérico que no tenga ningún parámetro.
como puedo controlar eso, o es necesario que reacomode mi sp para que al recibir una palabra en especifio me regrese todos mis datos y luego en load de la pagina le envie ese valor al informe ?
gracias de nuevo
Daniel, lo que sucede es que aunque el parámetro del stored procedure tenga un valor default, siempre es necesario que le envíes algo a ese parámetro para que sepa que debe usar el default.
Intenta enviando el valor DBNull.Value para ese parámetro.
Saludos.
José Rolando Guay Paz
Hola, cuando corro el primer ejemplo pra crear reportes me sale que no se peude conectar con el web local host.
He visto que en su página del tercer tema: “subreportes” no se cargan las imágenes.
por favro ayudame no se como hace reso en .net para windows forms solo me falta la ultima parte del codigo
he leido tus articulos y me parece de lo mejorcito que he encotrato para crear report.
al pasarle el parametro por primera vez me funciona perfectamente, pero cuando quiero pasarle otro parametro para volver a filtrar, me sales el siguiente error en la pantalla.
“Error al procesar el informe.
ObjectDataSource ‘ObjectDataSource1′ no pudo encontrar un método ‘GetData’ no genérico que tenga parámetros: valormaximo, valormaximo1. “
Hola, estoy intentando hacer un report grafico introduciendo una variable “valormaximo” al Datased para poder filtrar por esta, cuando introduzco el valor me sale estupendamente, pero cuando intento modificar el valor me sale el siguiente error.
“Error al procesar el informe.
ObjectDataSource ‘ObjectDataSource1′ no pudo encontrar un método ‘GetData’ no genérico que tenga parámetros: valormaximo, valormaximo1.”
te agradecería que me comentases algo.
muchas gracias.
Hola, que tal intente utilizar este metodo creando una grafica y utilizando subreport como una subgraficam pero no funciona alguna idea
Hola veo que si puedo conseguir ayuda por aqui me podes ayudar con este mismo ejemplo pero con aplicacion windows de VB 2005 tengo problemitas con la visualizacion del reporte me visualiza todos los datos y ya lo filtre en Dataset el SqlDataAdapter
Para alos que quieren hacer reporte dinamicos les recominedo que utlizen un Sp y un control MATRIX que trae el reporteador donde:
ROWS = detalle poducto
COLUMNS = es la grupacion de producto = puede crecer..+
DATA = deplega los datos agrupados = crece junto con columns
¡—————¡———-¡
¡ ¡COLUMS ¡
¡—————¡———-¡
¡ROWS ¡DATA ¡
¡—————¡———-¡
ROWS
matrix1_descripcion_art
COLUMS
matrix1_fecha
esta es la que crece…x cada agrupacion x cambio de fecha
DATA = suma valores por cada cambio de fecha crece junto con COLUMS matrix fecha.
Hola
Excelente el tutorial. Mataria si agregas una 4 parte y sobre todo si pudieras poner el codigo para bajarlo.
MIL GRACIASSS