Reportes – ReportViewer

Posted on Actualizado enn


Hola a todos, muchas veces nos hemos preguntado como podemos imprimir o generar archivos en pdf, y si lo que necesitamos hacer es bastante complejo, muchas veces hacerlo todo a pedal resulta bastante tedioso, lo cual nos pone a pensar en una manera más rapida y fácil, en mi caso personal, la primera opción que se vino a la cabeza fue hacer mis reportes con crystal, ya que lo habia trabajado hace bastante tiempo, sin embargo, y más en entorno web, comprar la licencia del crystal a veces es complicado (aunque si peden hacerlo mejor), y algo muy parecido me sucedio con reporting services, además que necesitaba trabajar con versiones de sql express…

Así que tome la decisión de usar un control del toolbox de visual studio, el reportviewer, aunque no tenga la misma potencia de crystal reports, me ha sido de bastante utilidad. Lo que generalmente hago es tener una página exclusiva para mis reportes, asi por código lo que hago es cambiar el reporte y demas datos necesarios acorde a lo que deseo mostrar… sin más carreta comencemos…

Se debe tener en cuenta, que en el servidor en el cual se instale la aplicaciñon se debe correr un runtime para poder generar los reportes (esto sucede igual que con crystal).. es bastente liviano y no molesta para nada, descargalo !!

En ejemplo que voy a mostrar (bastante sencillo), tengo una página inicial la cual me muestra el nombre de algunas personas, con el nombre del país y la ciudad, esto lo hago con el control gridview.. y tengo dos botones, el primero me redirige a la página que muestra mi reporte, y allí puedo elegir si exportarlo o imprimirlo, y el segundo boton, me crea e reporte y automaticamente me permite elegir si abrirlo o guardarlo, sin salir de la página actual (en realidad si voy hasta la otra página, pero el usuario no se dará cuenta)… es decir, mi pantalla inicial es:

Lo único que se ha hecho es llenar el gridview con los datos…ahora lo que nos interesa, el reporte !!.

Creo una nueva página, la cual contiene un control ReportViewer, y ya, ahi acabo el diseño (sencillo verdad); en mi base de datos, he creado un procedimiento almacenado bastante sencillo, el cual me trae la información que vemos en la grilla, dicho procedimiento almacenado, recibe como parametro el codigo de la presona, para el ejemplo voy a enviar un % para que me los traiga todos, así que luego de tener el procedimiento, agrego un nuevo item de tipo dataset, para luego vincularselo al reporte, al agregar el dataset, este se encuentra vacio, asi q con clic derecho > agregar > tableadapter.. y ahi se muestra un asistente, en el cual configuramos la conexion, en este caso, la llamo del webconfig, luego le decimos que use un procedimiento almacenado existente y listo, tenemos nuestro dataset.

Luego agregamos un nuevo item de tipo informe (.rdlc), luego en la barra de menús vamos a Informe > origenes de datos, y alli escogemos el dataset que hemos creado, en mi caso se llamo dataset1_pa_imprimepersonas, y en la parte de la izquierda (generalmente) en el explorador de datos de sitios web, podemos ver que alli se encuentra el dataset, con el procedimiento almacenado, con los campos que nos trae el procedimiento, asi q ahora es solo diseñar el reporte arrastrando los campos, para el ejemplo he usado una tabla…

Ahora, si código.. en la primera página, vamos a programar el evento click de los botones, para ambos botones serña practicamente igual…

Protected Sub ButtonImprimir_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonImprimir.Click
Context.Items.Add(“descargar”, “no”)
Context.Items.Add(“persona”, “%”)
Server.Transfer(“Reporte.aspx”, True)
End Sub

Protected Sub ButtonDownload_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonDownload.Click
Context.Items.Add(“descargar”, “si”)
Context.Items.Add(“persona”, “%”)
Server.Transfer(“Reporte.aspx”, True)
End Sub

Podemos ver, que vamos a enviar a enviar dos variables por contexto, la primera es para saber si dse debe descargar el reporte y la segunda es el valor del parametro del procedimiento almacenado, luego se redirecciona a la página que tiene el reporte

En la página del reporte:
1. En el evento load verificamos por cual lado irnos, si mostrar el reporte o si hacer la descarga de una vez:

Dim sDescargar As String = CType(Context.Items(“descargar”), String)
If sDescargar = “no” Then
Call Reporte()
Else
Call ReporteDownload()
End If

2. Aqui voy a mostrar solor el código cuando seleccionamos que no se debe descargar, en el ejemplo tienen todo:

Private Sub Reporte()
Dim sQuery As String = “PA_IMPRIMEPERSONAS”
cmd = New SqlCommand(sQuery)
cmd.Parameters.AddWithValue(“@_codpersona”, CType(Context.Items(“persona”), String))
Dim dtpersonas As DataTable = oConexion.GetSP(cmd)
If Not dtpersonas Is Nothing AndAlso Not dtpersonas.Rows.Count = 0 Then
reportesReportViewer.Visible = True
reportesReportViewer.LocalReport.ReportPath = “Reportes\Reporte.rdlc”
Dim oReport As New ReportDataSource(“DataSet1_PA_IMPRIMEPERSONAS”, dtpersonas)
reportesReportViewer.LocalReport.DataSources.Clear()
reportesReportViewer.LocalReport.DataSources.Add(oReport)
reportesReportViewer.LocalReport.Refresh()
End If
End Sub

Ahora, como funciona este código?
declaro una variable la cual contiene el nombre del procedimiento almacenado, al command le paso el valor del parametro, luego en mi clase de conexion, la función que ejecuta procedimientos me devuelve un datatable, verifico que el datatable tenga datos, hago el reporte visible, se que en diseño ya lo hice, pero algunas veces si no lo ponia no me lo muestra,luego le asigno el reporte (.rdlc) que he diseñado (aqui podemos ver, que podemos enrutar cualquier reporte), lleno un reportdatasource para vincularselo a mi reportviewer, el primer parametro del constructor, debe ser el nombre del dataset que hemos creado anteriormente,luego se lo asigno al reportviewer y por último le hago un refresh…y amigos eso es todo, espero que este ejemplo un poco largo les sea de utilidad, ahi otras menaras de hacerlo, pero yo lo hago así y me ha funcionado muy bien…en el ejemplo encuentras el proyecto y la copia de la base de datos,en la base de datos ahi una tabla con todos lo paises, creo que les sera util…

Descarga el ejemplo aqui!!

Nos vemos en un proximo post donde vamos a hacer un menu contextual para un gridview, asi evitaresmo tener varios botones (eliminar, editar,imprimir,borrar,etc)

15 comentarios sobre “Reportes – ReportViewer

    Jonathan escribió:
    08/02/2010 en 17:21

    GRacias!!

    Anonymous escribió:
    08/12/2010 en 14:15

    MARVEL RUIZHola… estoy usando aspNet 2008 y visual basic. Trato de generar un reporte con el control microsoft reportViewer pero el problema es que cuando agrego un dataset al reporte y despues quiero arrastrar los campos de una determinada tabla, estos no se muestran. Podrian decirme que paso me esta haciendo falta????Los pasos que hasta ahora he hecho son:1. agregar el nuevo elemento (informe.aspx)2. Agregar un nuevo elemento de tipo rdlc(ejemplo rptVales.rdlc)3. agregar un control microsoft reportviewer4. Agregar un nuevo elemento (DataSet)5. Arrastrar la tabla que necesito al elemento rptVales.rdlc.6. Agregar un elemento "LISTA" a rptVales.rdlc7.arrastar los campos necesarios a la lista (aqui ocurre el problema, cuando arrastro los campos del dataset, no se muestar en el contorl "LIsta").de antemano les doy las gracias…

    Julio Cesar Avellaneda escribió:
    09/13/2010 en 21:07

    Hola..mira hago un ejemplo desde cero y lo subo… y q por la tardanza….si te puedo colaborar en algo mi correo es julito_gtu@hotmail.com…..

    Mercè Bruned escribió:
    03/21/2011 en 14:07

    Hola, muy útil tu post. Hice un informe en visual basic 2008, utilizando el reportviewer. Ahora utilizo visual basic 2010 y no me funciona. Por otro lado, tengo el componente “Reportviewer” marcado, pero no me aparece en la caja de herramientas, por lo que tampoco puedo hacer un informe nuevo. Tienes alguna experiencia con este control en VB 2010?

    Gracias de antemano.

      Julio Avellaneda respondido:
      03/24/2011 en 10:31

      hola, bueno es raro, pq yo he migrado varias app de vs 2008 a 2010 y mis reportes han seguiddo funcionado, te genera algun error? q version de vs 2010 estas usando? revisa q en tu webconfig tengas la version 10 para el microsoft.reportviewer…

    Carlos Arias escribió:
    03/28/2011 en 10:30

    Hola que tal gran ejemplo muy ilustrativo, tengo un problema al mostrar un reporte, como hago para que se muestre abriendo en otra ventana (asp) o poder centrar el reporte en la pantalla??

    Saludos y gracias de antemano.

      Julio Avellaneda respondido:
      03/28/2011 en 10:41

      hola, bueno en el ejmplo puedes ver q tengo una apgina llamada reportes, alli lo q hago es mostrar el reporte, lo unico q cambia es q tengo un codigo para descargar el reporte y devolverme a la pagina anterior, pero mira la funcion Reporte() alli no hago ese proceso… para centrarlo solo dale estilo necesario, puede colarlo dentro d eun div y q el div este centrado…no se si a esto te refieres… cualquier cosa me avisas

    perezolivaeduardo escribió:
    12/10/2011 en 17:05

    hola, como declaro los parametros en reportviewer de visual basic 2010?, antes en la barra de menu de INFORME habia una opcion que decia parametros, ahora no encuetro es opcin. alguna idea?

    RUTH escribió:
    07/28/2012 en 10:12

    muy buen ejemplo, pero yo tengo base de datos en acces y vb 2010 . si me puedes ayudar lo que necesito es mostrar unos registros en particular con dos tablas por codigo.

    jose escribió:
    03/18/2013 en 01:35

    buenas noches pero estoy trabajando en un reporte..de un proyecto y no encuentro la manera para mandar los datos de un datagridview a un ReportViewer ya configure mi reporte no estoy ocupando cristal solo es un informe.rdlc si me podrian ayudar con mi duda para mostrar solo los datos del datagridview al ReportViewer… les estare agradecido por fa ayudenme

      Julio Avellaneda respondido:
      07/16/2013 en 00:21

      Amigo, lo más sencillo que puedes hacer es definir un dataset tipado y establecerlo como origen de datos a tu reporte.

      Saludos.

    Byron Pineda escribió:
    03/25/2013 en 15:03

    hola a todos le he implementado tu código de report a mi aplicación pero al momento de presentarlo no me aparece nada estoy trabajando con vs 2008 y vb.net que puede suceder

    Giovanny escribió:
    08/23/2013 en 11:59

    Que tal amigo, tengo un problema. Cree un reportviewer, dentro de dicho reporte, debo mostrar un codigo de barras, lo hice con una funcion que se encuentra en la nube, implemente la funcion para exportar a PDF, pero el campo que debe mostrar el codigo de barras, lo cambia por completo. No se que debo hacer, agradezco cualquier tipo de ayuda

      Giovanny escribió:
      08/23/2013 en 14:46

      Aclaro que cuando se exporta a Excel o Word, muestra bien el codigo de barras, pero al exportarlo a PDF si lo hace mal.

Responder

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