Jose R. Guay Paz

Most of the time on
ASP.NET, C# & SQL Server

Sponsors

News

INETA Community Speakers Program

My latest tweets

this.blog.owner=

  • CSW Solutions
  • Follow Me
  • Works On My Machine

.NET Communities

  • INETA Latam

Blogs I Read

Websites I like

Construyendo Reportes Para Aplicaciones Web: Parte 1

Muchas veces nos encontramos realizando sistemas de información que se dedican a capturar datos pero que también necesitan una manera de procesarlos y mostrarlos. Para esta tarea entran en juego los famosos Reportes que no son más que objetos que entregan información en un formato particular y que permiten realizar ciertas operaciones como imprimirlos, enviarlos por email, guardarlos a un archivo, etc.

Es importante mencionar que los datos almacenados son útiles en la misma medida que se puedan convertir en información para las personas que los necesitan. También es importante subrayar que la plataforma tecnológica que utilicemos debe poder tener facilidades para convertir los datos en información y poder entregarlos a los usuarios de forma que sean útiles.

Pues bien, el caso es que el .net Framework no es la excepción. Al instalar cualquiera de los productos, desde las versiones express hasta la versión TeamSuite podemos realizar reportes y presentarlos a los usuarios para que puedan utilizar la preciada información.

Primero debemos entender que estamos haciendo y porqué. El caso es el siguiente, por lo regular, un reporte será impreso en hojas de papel con un tamaño específico, esto nos lleva al primer desafío, tenemos que poder entregar información que quepa dentro de estas hojas de papel y que pueda ser impreso sin problemas a una impresora local o remota. El segundo desafío es poder realizar esta operación desde una aplicación web; pero ¿Cuál es el problema aquí? Pues muy sencillo, lo que sucede es que una página web es un objeto que tiene un despliegue único, es decir, todos los datos se muestran en una “tira” continua de información lo que hace difícil sino imposible hacer que la impresión sea consistente y predecible. El tercer desafío es poder hacer que la solución sea utilizable para “cualquier navegador” lo que en si es todo un reto.

Entonces, la solución que encontramos en el .net Framework es la del objeto Microsoft.ReportViewer.WebForms. Este objeto nos permite realizar todas las operaciones descritas con anterioridad y permite también superar los desafíos planteados.

En primer lugar, debemos decir que un reporte en una aplicación web se compone de 4 partes principales: 1) Un documento reporte. 2) Un objeto ReportViewer. 3) Una fuente de datos. 4) Una página que permita mostrar al ReportViewer.

Entonces, manos a la obra. Hagamos un reporte que: pueda controlar los saltos de página por medio de una configuración de tamaño de papel, tenga una forma de imprimir correctamente la información y sea “crossbrowser” (pueda ser visto en cualquier navegador).

Inicialmente debemos crear una aplicación web (o website si lo prefieren) y para ello vamos a Visual Studio 2008 y seleccionamos el tipo de proyecto que nos interesa:

Proyectoweb

Esto creará una estructura similar a la siguiente:

EstructuraProyecto

Al abrir la página Default.aspx ubicaremos un objeto Microsoft.ReportViewer.WebForm en ella y quedará de la siguiente forma:

ReportViewer

Ahora ya tenemos dos de las cuatro cosas necesarias para el reporte, vamos por la tercera. Es necesario crear un documento de reporte que contenga la definición de los datos que quiero mostrar.

El ejemplo que voy a demostrar utilizará la base de datos Northwind y los datos almacenados en las tablas dbo.Orders y dbo.Order Details. En esta primera parte solamente veremos la tabla dbo.Orders y dejaremos la otra tabla para las siguientes partes de este artículo.

Entonces es necesario agregar un documento reporte a nuestra solución de la siguiente forma. El nombre del documento será Ordenes.rdlc :

Report

Esto nos presentará la siguiente ventana en Visual Studio:

ReportWindow

Ahora es necesario decirle al reporte que datos quiero que muestre, para ello agregamos un Data Source hacia SQL Server por medio de Server Explorer y seleccionamos la base de datos Northwind, lo que debería mostrar la siguiente información:

ServerExplorer

Luego al crear el nuevo Data Source tenemos que se creó en realidad un objeto DataSet, el cual tendrá la definición de nuestros objetos de datos. Entonces solamente arrastramos del Server Explorer las tablas que nos interesan hacia el objeto DataSet. En este caso es dbo.Orders. Una vez grabado el DataSet, en la ventana de Website Data Sources se mostrará la tabla y los campos disponibles.

DataSet1

Ahora agregamos un objeto List a nuestro reporte para que contenga los datos de la tabla:

List

Y por último arrastramos los campos que queremos de nuestra tabla hacia el objeto list. Para nuestro ejemplo y con fines ilustrativos solamente arrastraremos 4 campos: OrderID, OrderDate, ShipName, ShipCity. También agregaremos unas etiquetas para saber de qué datos estamos hablando. Cabe mencionar que el documento report no tiene Labels como los conocemos para esta tarea así que tendremos que utilizar TextBoxes para poder poner títulos a los campos:

Fields

Bien, grabamos nuestro reporte y nos pasamos a la página Default.aspx que es donde tenemos nuestro objeto ReportViewer y ahora le decimos que utilice el reporte que recién acabamos de crear:

ChooseReport

El seleccionar el reporte debe haber creado también en la página un objeto ObjectDataSource que será el encargado de la tubería de información entre la fuente de datos (DataSet1) y el ReportViewer; y con esto tenemos ya las 4 cosas necesarias para correr el reporte. Ahora podemos ejecutar nuestra aplicación y ver cómo funciona el reporte:

WorkingReport

Aquí podemos ver claramente en la página que el reporte funciona correctamente, tiene 76 páginas y se muestra con un zoom de 100%.

Espero que este artículo les sirva, seguramente se encontrarán con alguna necesidad para utilizar estos objetos y ojalá les ayude a lograr su cometido.

Espero vean los siguientes artículos relacionados:

  • Parte 2: Reportes por código y paso de parámetros
  • Parte 3: Subreportes

Hasta la próxima.

Comments

giraldo said:

hola jose

entiendo esta parte pero cuando llego a laparte del codigo me enredo dado que estoy manejando vb y de c# no lo conozco muy bien me podrias colaborar con el para porder terminar el reporte

gracias

# September 9, 2008 4:07 PM

Edw said:

Buenos dias:

El boton de impresion en visual studio 2005 no aparece. Seria bueno especificar como imprimir reportes web en vb 2005.

Gracias.

# September 29, 2008 10:32 AM

Enzo said:

Buenas Jose,

pasa q mi origen de datos en el dataset es un procedimiento almacenado, entonces creo un tablaadapter y lo llemo con el procedimiento almacendo, pero al enlazar mi ReportViewer al Reporte me crea 3 ObjectDataSource, se me imagina q lo hace por q este procedimeinto almacenado trae datos de 2 tablas y crea una tercera(TablaAdapter), se debera a esto y me da un error al ejecutar el ReportViewer.

Error al procesar el informe.

No se pudo encontrar el tipo especificado en la propiedad TypeName de ObjectDataSource 'ObjectDataSource1'.

estas son las propiedades TyprName de cada ObjectDataSource

ObjectDataSource1 = VetoNet.DataSet1TableAdapters.Guia_LaboratorioTableAdapter

ObjectDataSource2 = VetoNet.DataSet1TableAdapters.Item_LaboratorioTableAdapter

ObjectDataSource3 = VetoNet.DataSet1TableAdapters.ReporteGuiaLaboratorioTableAdapter

donde Guia_Laboratorio e Item_Laboratorio son tablas q uno el procedimiento almacenado y ReporteGuiaLaboratorio es mi Procedimiento Almacenado.

gracias por la ayuda...

Enzo

# March 4, 2009 10:31 AM

Jose Rolando Guay Paz said:

Hola Enzo.

Definitivamente el stored procedure generara mas objetos que un SELECT comun y corriente.

Mi recomendacion seria que hagas un DataSet dentro de tu proyecto que haga la llamada al stored procedure y luego enlaces ese DataSet al reporte.

Saludos.

Jose Guay

# March 4, 2009 5:32 PM

Estefania said:

Hola!!

Oye he intentado seguir el ejemplo que pones aqui, pero me quedo atrancada en una parte...

Resulta que tengo la version express de .net, y no me aparece la opción "Report", para agregar el documento reporte...

Puedes ayudarme con eso, Por favor!!!

Te agradezco!!

Estefania

# June 17, 2009 6:33 PM

Jaime said:

Hola José

muy buen turorial, lo hice pero tengo problemas al momento de ver reporte me muestra el siguiente error en el explorador

"Error al procesar el informe.

Se produjo una excepción en el destino de la invocación.

Error de inicio de sesión del usuario 'sa'. "

sabes a que se debe y como puedo solucionarlo, gracias por adelantado.

Jaime

# July 24, 2009 12:03 PM

Jose Rolando Guay Paz said:

@Jaime: tienes un problema de conexion con la base de datos, debes crear un usuario (login) de SQL Server con permisos para leer datos en la base de datos Northwind (o la base de datos que sea que estes usando). Luego modificar tu string de conexion para que use este usuario y su contrasena. Eso es todo.

Saludos y gracias!

# July 24, 2009 12:13 PM

Esther Gaxiola said:

Hola Jose

Soy nueva en esto y he seguido tu ejemplo y todo sale bien, pero he querido hacerlo con un store procedure y en el dataset no me muestra las columnas que regresa el store. el store crea una tabla temporal y procesa datos y al final el select es de dicha tabla temporal.

Me podrias ayudar para poder hacer el reporte

Gracias

# July 27, 2009 2:21 PM

Jose Rolando Guay Paz said:

@Esther.

Realmente no se como ayudarte. Si ejecutas tu stored procedure dentro de SQL Server Management Studio funciona bien? Devuelve la informacion como lo necesitas?

Si es asi, entonces no debe haber problemas con el dataset. La diferencia en el dataset es que debes seleccionar para el DataAdapter el stored procedure de la base de datos y no una tabla o query.

Espero te ayude.

# July 27, 2009 5:42 PM

Esther Gaxiola said:

Si el store me devuelve la informacion bien en el SQL Server Managment Studio.

En el dataset si seleccion el store y todo pero ps como en ese store creo tablas temporales y el select final del store es de la tabla temporal.

Me marca un warning:

The wizard detected the following when configuring the tableAdapter: "Pr_Eca_Reporte":

Details:

Generated SELECT statement.

Invalid object name '#Tmp_Reporte'

# July 27, 2009 6:35 PM

Esther Gaxiola said:

Hola Jose.

Ya pude con el reporte ya me muestra las columnas que regresa el store.

Buscando en internet el error encontre que agregando el sig codigo se solucionaba.

IF 1=0 BEGIN  

   SET FMTONLY OFF  

END

nunca se ejecuta pero ps funciono.

Muchas Gracias.

Ahora estoy atorada en que no se como pasarle parametros al subreporte ya que tambien es un store.

ya hice los pasos que indicas en la parte 3 pero me sigue marcando el mismo error

# July 28, 2009 2:19 PM

Janet Gutierrez said:

Hola, soy nueva en esto y pues hice lo que decia tu manul lo unico que no me aparece es el boton de imprimir y tambien como le hago para que a darle click en un boton solo lo mande a imprimir sin que lo visualice

# September 7, 2009 2:24 PM

Yolanda said:

Es muy buen artículo y me ha servido para crear muchos reportes, me podrías indicar como puedo configurar el reporting services, porque cada vez que envío a cargar un reporte me aparece una pantalla de autenticación, donde ingreso el nombre y pass del administrador. Pero esto no puede continuar así porque tengo que publicar el sistema en el hosting y ahí también me pide nombre y pass.

Por favor cualquier ayuda sería muy importante para mi.

# September 23, 2009 10:06 AM

Angel said:

ya realice los mismos pasos pero al momento de ejecutar carga la página, muestra el marco del reporte pero no jala los datos de la base de datos que puedo hacer???

# September 30, 2009 3:55 PM

Leyla said:

Simplemente genial, he buscado y buscado algún ejemplo claro y sencillo de seguir para hacer reportes en Web, y este es una muy buena base, gracias!!!... :)

# November 11, 2009 4:06 PM

erika julissa said:

Hola, yo tengo instalado en visual studio 2008 express y visual  basic 2008 express, pero busco en visual studio las opciones para crear un proyecto de informes .rdlc y no lo encuentro solo me da opcion de crear proyecto de servidor de informes y eso me crea archivos .rdl. Alguien puede decirme porque no puedo crear en mi visual los .rdlc???? será porque es express????? Gracias

# December 3, 2009 9:17 PM

Jose Rolando Guay Paz said:

@erika: no debes buscar un proyecto de informes. Es un documento de informes, haces un click derecho sobre el nombre de tu proyecto web y agregas un nuevo elemento, en la lista buscas el informe .rdlc.

# December 3, 2009 10:10 PM

Lucia Gonzalez said:

Hola, espero me puedan ayudar, dese crear una aplicacion web, osea en asp, pero no me aparece la plantilla de aplicacion paa web al momento de crear el proyecto nuevo no se si me puedan ayudar, si se pueda descargar y si saben en donde o que onda porfavor espero su ayuda

Gracias

# December 9, 2009 10:45 AM

Alfonso Ruiz Velasco said:

Te felicito por la claridad y coherencia de estos articulos de reporets locales.

Sin embargo me atrevo a sugerir un cuarto articulo, en este se peuden ver las bondades del empleo de objetos comerciales(clases que exponen listas) para el diseño y ejecucion de los reportes. En el arttilo se podria mostrar las fosmas como prograamticamente se pude alimentar de tablas, vistas y listas los reportes y subreportes, de esta forma se mostraria la flexibilidad y potencialidad de programación procedurial para apliaciones locales y /o de algoritmos complejos.

Si te interesa te mando algunas notas y ejemplos que he hecho, todos partieron de que me enseñaste en tus articulos

# January 7, 2010 12:11 PM

Frank A.R said:

Muy buen tutorial, ya realicé todo tal cual describes en él, pero cuando ejecuto la aplicacion me arrja un error que dice: Se ha quitado el recurso que está buscando, se le ha cambiado el nombre o no está disponible en estos momentos. Y ya revicé todo y los archivos estan y todo normal, no sé que será, te agradezco cualquier ayuda. gracias.

# March 16, 2010 12:01 PM

Beto said:

Tiene problemas de compatibilidad,porque el icono de  impresión solo se muestra cuando se usa internet explorer mas no en otros navegadores

# April 26, 2010 8:19 PM

Tedder Niño Drago said:

Muy buenas a todos. Muchas gracias por todos los aportes. Excelente material. Me ha sido muy útil para obtener reportes de buena calidad dentro de un proyecto que estoy desarrollando. No obstante no he conseguido que aparezca el icono de imprimir directamente sin necesidad de exportar el reporte. Conmigo son cuatro las personas que han expuesto el mismo caso, pero aun no hay claridad al respecto. Estoy usando el IEXPLORE 8.0, pero aun así, nada.

:-S

# May 18, 2010 11:53 AM

Oscar said:

Hola Jose

Soy nuevo en este, y tengo una pregunta estoy trabajando en visual 2005 y oracle, al momento de crear el dataset con el tableadapter solo me deja escoger la parte de consulta con select la parte de procedimientos almacenados u creaion de estos me aparece deshabilitado, me podrias ayudar.

Ademas con el ejemplo completo enviandomelo al correo si no es mucha molestia, mi correo es oleon@solucionesbolivar.com

# August 17, 2010 5:50 PM

Daniela said:

Hola, espero puedan apoyarme.

Deseo hacer un reporte por ejemplo que muestre un encabezado con el nombre del cliente y abajo una tabla con las compras de ese cliente.

El detalle es que deseo que imprima una hoja por cada cliente. mas bien habra un encabezado por cada cliente y abajo la informacion (no importa cuantas hojas sean) pero por cada cliente haga un breakePage

Espero su ayuda.... Gracias

# October 15, 2010 12:11 PM

JuandeDios said:

Gracias por la ayuda, se lee bastante claro, espero probarlo y comentar que tal. Gracias desde Honduras

# November 16, 2010 1:15 PM

william said:

Muy bueno gracias

# November 23, 2010 9:20 PM

Selene said:

Hola, muy buen artículo, pero tengo un problema al crear un dataset seleccionando un procedimiento almacenado que regresa una tabla temporal, no me aparece el procedimiento almacenado, es decir, en la pantalla para seleccionar SP, aparece y lo marco, pero al momento de dar Terminar, pues no muestra nada! Cambie el código del sp con un simple select * from tblRegiones y funciona... estoy intentango conectar por código y no logro hacerlo funcionar...¿tendrás algun ejemplo pero usando un SP con tablas temporales ?

Gracias!!

# December 9, 2010 6:55 PM

Agustin said:

Hola queria saber como se puede hacer para que el reporte ocupe todo el tamaño de la pagina del explorador y para controlar el formato al que se exporta

Gracias

# January 24, 2011 8:06 PM

Rolph said:

Disculpa, pero me genera un error de este tipo:

Microsoft.Reporting.WebForms.ScriptManagerNotFoundException: El control web del visor de informes requiere un System.Web.UI.ScriptManager en el formulario web.

y no se que pueda ser. Ya importe algo asi: Imports System.Web.UI.ScriptManager pero tal vez no va por ahi. Podrias ayudarme con esa parte

# February 15, 2011 10:28 AM

Rolph said:

bueno ya lo solucione agregando este tag:

<asp:ScriptManager ID="ScriptManager1" runat="server" />

al contentmain

# February 15, 2011 11:13 AM

Rolph said:

ya pude solucionar el problema. Pero ahora por que razon no me aparecerá el boton de imprimirlo. Acaso tengo que activarlo desde algun lugar. Revise en sus propiedades del reporte viewer y si esta en true lo de visualizar el boton de imprimir. Que podría ser.

Nota:Utiliza Visual Studio 2010

# February 15, 2011 2:34 PM

Javier said:

Buenas tardes, ¿por qué me puede salir este error al ejecutar un report?

<<El procesamiento remoto de informes requiere Microsoft SQL Server 2008 Reporting Services o posterior>>

¿¿¿Puede ser que mi solución esté accediendo a sql2008 y que el servidor de reporting sea 2005???

gracias

# March 2, 2011 10:52 AM

Alberto said:

HOLA JOSE.

ME GUSTARIA SABER COMO DEFINIR PROGRAMATICAMENTE EN OBJECTODATASOURCE LA SECCION  <SelectParameters> YA QUE TENGO UN METODO QUE RECIBE COMO PARAMETRO UNA LISTA

GRACIAS

<rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana"

           Font-Size="8pt" InteractiveDeviceInfos="(Collection)"

           WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt">

           <LocalReport ReportPath="Reportes\Report1.rdlc">

               <DataSources>

                   <rsweb:ReportDataSource DataSourceId="DataSourceReporteGeneracionDeRegistro"

                       Name="MyDataSet" />

               </DataSources>

           </LocalReport>

       </rsweb:ReportViewer>

       <asp:ObjectDataSource ID="DataSourceReporteGeneracionDeRegistro" runat="server"

           SelectMethod="ObtenerParaRegistroDeAsunto"

           TypeName="Proyecto.Web.Reportes.ReporteManejador">

           <SelectParameters>

               <asp:Parameter Name="asuntoBandejaRegistro" Type="Object" />

           </SelectParameters>

       </asp:ObjectDataSource>

# April 7, 2011 1:20 PM

celebritiesnakedt said:

rentno varcevanje izracun <a href=http://www.nalozba.info>moja naložba</a>

# February 19, 2012 3:10 AM
Leave a Comment

(required) 

(required) 

(optional)

(required)