none
Cargar Report.rdlc en control ReportViewer desde codigo‎ en pagina web RRS feed

  • Pregunta

  • Tengo un proyecto web con VB.NET, visual studio 2013 y SQL Server

    He intentado mostrar reportes con ReportViewer, pero no he podido porque tengo el string de conexión variable y algunos parámetros también variables.

    El caso que vi una respuesta que dió Efrain Mejias por algo similar, pero para windows form y es algo que me puede servir.

    ¿Como puedo hacerlo para una página Web?.  

    Analizando el código no parece muy distinto, salvo que no cuento con ReportViewer1.RefreshReport() que sí se cuenta en winform.

    El código completo es

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Dim SQL As String = "SELECT * from invrequisicion"
            ReportViewer1.ProcessingMode = ProcessingMode.Local
            ReportViewer1.LocalReport.ReportPath = "C:\Users\SERVER\Documents\Visual Studio 2013\Projects\Aprendizaje\Aprendizaje\Report1.rdlc"
            Dim ds As EMCINGENIERIADataSet = New EMCINGENIERIADataSet()
            ds = GetData(Sql)
            Dim dsource As ReportDataSource = New ReportDataSource("EMCINGENIERIADataSet", ds.Tables(0))
            ReportViewer1.LocalReport.DataSources.Add(dsource)
            ReportViewer1.LocalReport.Refresh()
            ReportViewer1.RefreshReport()
        End Sub
    
        Private Function GetData(query As String) As EMCINGENIERIADataSet
            Dim cmd As New SqlCommand(query)
            Using con As New SqlConnection("Data Source=SERVEREMC;Initial Catalog=EMCINGENIERIA;Persist Security Info=True;User ID=sa;Password=1234santiago")
                Using sda As New SqlDataAdapter()
                    cmd.Connection = con
    
                    sda.SelectCommand = cmd
                    Using ds As New EMCINGENIERIADataSet()
                        sda.Fill(ds, "invrequisicion")
                        Return ds
                    End Using
                End Using
            End Using
        End Function

    viernes, 14 de diciembre de 2018 20:57

Respuestas

  • Analizando el código no parece muy distinto, salvo que no cuento con ReportViewer1.RefreshReport() que sí se cuenta en winform.

    Aunque no te sé decir exactamente cómo lo tendrías que escribir en WebForms (será bastante parecido), sí te puedo explicar por qué no tiene sentido que exista el Refresh en la versión web.

    En un WinForm, tienes el ReportViewer cargado en memoria todo el tiempo que el Form está abierto. Si le cambias las propiedades, tienes que decirle que se "refresque" para que vuelva a cargar los datos y presente el nuevo informe.

    Pero en Web, el ReportViewer no está cargado en memoria. Aunque lo estés viendo en el navegador, lo único que ves es el html que ha generado. Cada vez que se hace un postback de la página, se instancia la clase en el servidor, se ejecutan todos los eventos del ciclo de vida (incluyendo crear los controles entre los que está el ReportViewer), se genera el html resultante, y se destruye la clase. Por lo tanto, el ReportViewer se va a refrescar forzosamente a cada postback, y no tiene sentido refrescarlo fuera de un postback porque fuera de un postback no existe el reportviewer, la clase no está instanciada.

    sábado, 15 de diciembre de 2018 9:39
  • Muchas gracias por tu respuesta.  

    Seguí un tutorial para hacerlo en Web, con los resultados esperados, pero tengo que tener un script de conexión en el Web.config.  No pude introducir los cambios en la página para hacerlo, porque me entrega mensajes que no encuentra el servidor.

    Seguiré intentando descubrir en qué momento genera el reporte.

    Gracias nuevamente

    lunes, 17 de diciembre de 2018 1:06

Todas las respuestas

  • Analizando el código no parece muy distinto, salvo que no cuento con ReportViewer1.RefreshReport() que sí se cuenta en winform.

    Aunque no te sé decir exactamente cómo lo tendrías que escribir en WebForms (será bastante parecido), sí te puedo explicar por qué no tiene sentido que exista el Refresh en la versión web.

    En un WinForm, tienes el ReportViewer cargado en memoria todo el tiempo que el Form está abierto. Si le cambias las propiedades, tienes que decirle que se "refresque" para que vuelva a cargar los datos y presente el nuevo informe.

    Pero en Web, el ReportViewer no está cargado en memoria. Aunque lo estés viendo en el navegador, lo único que ves es el html que ha generado. Cada vez que se hace un postback de la página, se instancia la clase en el servidor, se ejecutan todos los eventos del ciclo de vida (incluyendo crear los controles entre los que está el ReportViewer), se genera el html resultante, y se destruye la clase. Por lo tanto, el ReportViewer se va a refrescar forzosamente a cada postback, y no tiene sentido refrescarlo fuera de un postback porque fuera de un postback no existe el reportviewer, la clase no está instanciada.

    sábado, 15 de diciembre de 2018 9:39
  • Muchas gracias por tu respuesta.  

    Seguí un tutorial para hacerlo en Web, con los resultados esperados, pero tengo que tener un script de conexión en el Web.config.  No pude introducir los cambios en la página para hacerlo, porque me entrega mensajes que no encuentra el servidor.

    Seguiré intentando descubrir en qué momento genera el reporte.

    Gracias nuevamente

    lunes, 17 de diciembre de 2018 1:06