none
Report Viewer RRS feed

  • Pregunta

  • Aparentemente yo como que soy el único que intenta tener un Report Viewer único, donde ver los reportes, ya que no le veo el sentido a crear un form Report Viewer por cada reporte. Ya busqué en internet por más de un mes con distintas formas de preguntar y no encuentro nada para un ambiente local.

    Intenté ya varias formas programando en form donde tengo el report viewer y nada, para Microsoft parece que la lógica es crear un form report viewer para cada reporte ya que en MSDN no aparece nada.

    Dentro de lo que he intentado tengo muchas formas, pero nada funciona, si no es un error es otro. Agradecería si alguien con esta inquietud lo ha solucionado me ayude.

    Gracias anticipadas

    • Cambiado Enrique M. Montejo martes, 5 de diciembre de 2017 22:45 Pregunta relacionada con el control de informes de Windows Forms.
    martes, 21 de noviembre de 2017 23:38

Respuestas

  • Hola

    para Microsoft parece que la lógica es crear un form report viewer para cada reporte ya que en MSDN no aparece nada.

    No amigo, de hecho, se utiliza un form y un control ReportViewer para todos los informes, de ahí se configura el control ReportViewer1 por ejemplo que lo llames así, para cada origen de datos y para cada .rdlc de tus informes. Lo que si debes generar un Informe .RDLC para cada informe, por ejemplo:

    Public Class Form1 Public lempleados = New List(Of Empleados) Public lproveedores = New List(Of Proveedores) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'cargar datos lempleados.Add(New Empleados("nombre1", "apellido1", "cargo1")) lempleados.Add(New Empleados("nombre2", "apellido2", "cargo2")) lempleados.Add(New Empleados("nombre3", "apellido3", "cargo3")) lproveedores.Add(New Proveedores("razonsocial1", "domicilio1")) lproveedores.Add(New Proveedores("razonsocial2", "domicilio2")) lproveedores.Add(New Proveedores("razonsocial3", "domicilio3")) End Sub Private Sub binf_empleados_Click(sender As Object, e As EventArgs) Handles binf_empleados.Click Dim mm As New Informe mm.Activate() mm.Show() mm.mostrarInfEmpleados(lempleados) End Sub Private Sub binf_proveedores_Click(sender As Object, e As EventArgs) Handles binf_proveedores.Click Dim mm As New Informe mm.Activate() mm.Show() mm.mostrarInfProveedores(lproveedores) End Sub End Class

    Imports Microsoft.Reporting.WinForms
    Public Class Informe
        Private Sub Informe_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Me.ReportViewer1.RefreshReport
        End Sub
        Public Sub mostrarInfEmpleados(lempleados As List(Of Empleados))
            ReportViewer1.Visible = True
            ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local
            ReportViewer1.LocalReport.ReportPath = "InfEmpleados.rdlc"
            ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DsEmpleados", lempleados))
            ReportViewer1.LocalReport.Refresh()
            ReportViewer1.RefreshReport()
        End Sub
        Public Sub mostrarInfProveedores(lproveedores As List(Of Proveedores))
            ReportViewer1.Visible = True
            ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local
            ReportViewer1.LocalReport.ReportPath = "InfProveedores.rdlc"
            ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DsProveedores", lproveedores))
            ReportViewer1.LocalReport.Refresh()
            ReportViewer1.RefreshReport()
        End Sub
    End Class
    

    Como verás solo uso un solo form: Informe

    Utilizo un solo contol ReportView: ReportViewer1

    Utilizo 2 archivos de informes .rdlc: InfEmpleados.rdlc y InfProveedores.rdlc

    aqui te comparto el ejemplo completo, obviamente que no tiene ningún diseño, solo a modo de ejemplo.

    EJEMPLO ReportViewer

    Bueno, espero te sirva, comenta. Saludos.-

    • Propuesto como respuesta Ramiro Ledesma miércoles, 22 de noviembre de 2017 15:04
    • Marcado como respuesta Enrique M. Montejo viernes, 24 de noviembre de 2017 15:37
    miércoles, 22 de noviembre de 2017 12:54

Todas las respuestas

  • Yo utilizo el componente crystalReportViewer

    

    En el fomulario declaro en Public Class todos los Reports para visualizar:

    Public Class frmVisorInformes
        Private report1 As rpt1
        Private report2 As rpt2
        Private report3 As rpt3
        Private report4 As rpt4
        ....

    finalmente, en función del parámetro correspondiente al report para procesar lo asigno al compomente crVisor:

    crvVisor.ReportSource = report1
    Espero que te sirva. Un saludo.


    miércoles, 22 de noviembre de 2017 10:45
  • Hola

    para Microsoft parece que la lógica es crear un form report viewer para cada reporte ya que en MSDN no aparece nada.

    No amigo, de hecho, se utiliza un form y un control ReportViewer para todos los informes, de ahí se configura el control ReportViewer1 por ejemplo que lo llames así, para cada origen de datos y para cada .rdlc de tus informes. Lo que si debes generar un Informe .RDLC para cada informe, por ejemplo:

    Public Class Form1 Public lempleados = New List(Of Empleados) Public lproveedores = New List(Of Proveedores) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'cargar datos lempleados.Add(New Empleados("nombre1", "apellido1", "cargo1")) lempleados.Add(New Empleados("nombre2", "apellido2", "cargo2")) lempleados.Add(New Empleados("nombre3", "apellido3", "cargo3")) lproveedores.Add(New Proveedores("razonsocial1", "domicilio1")) lproveedores.Add(New Proveedores("razonsocial2", "domicilio2")) lproveedores.Add(New Proveedores("razonsocial3", "domicilio3")) End Sub Private Sub binf_empleados_Click(sender As Object, e As EventArgs) Handles binf_empleados.Click Dim mm As New Informe mm.Activate() mm.Show() mm.mostrarInfEmpleados(lempleados) End Sub Private Sub binf_proveedores_Click(sender As Object, e As EventArgs) Handles binf_proveedores.Click Dim mm As New Informe mm.Activate() mm.Show() mm.mostrarInfProveedores(lproveedores) End Sub End Class

    Imports Microsoft.Reporting.WinForms
    Public Class Informe
        Private Sub Informe_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Me.ReportViewer1.RefreshReport
        End Sub
        Public Sub mostrarInfEmpleados(lempleados As List(Of Empleados))
            ReportViewer1.Visible = True
            ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local
            ReportViewer1.LocalReport.ReportPath = "InfEmpleados.rdlc"
            ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DsEmpleados", lempleados))
            ReportViewer1.LocalReport.Refresh()
            ReportViewer1.RefreshReport()
        End Sub
        Public Sub mostrarInfProveedores(lproveedores As List(Of Proveedores))
            ReportViewer1.Visible = True
            ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local
            ReportViewer1.LocalReport.ReportPath = "InfProveedores.rdlc"
            ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DsProveedores", lproveedores))
            ReportViewer1.LocalReport.Refresh()
            ReportViewer1.RefreshReport()
        End Sub
    End Class
    

    Como verás solo uso un solo form: Informe

    Utilizo un solo contol ReportView: ReportViewer1

    Utilizo 2 archivos de informes .rdlc: InfEmpleados.rdlc y InfProveedores.rdlc

    aqui te comparto el ejemplo completo, obviamente que no tiene ningún diseño, solo a modo de ejemplo.

    EJEMPLO ReportViewer

    Bueno, espero te sirva, comenta. Saludos.-

    • Propuesto como respuesta Ramiro Ledesma miércoles, 22 de noviembre de 2017 15:04
    • Marcado como respuesta Enrique M. Montejo viernes, 24 de noviembre de 2017 15:37
    miércoles, 22 de noviembre de 2017 12:54
  • Gracias Jordi, pero soy enemigo de terceras partes, en el pasado ese producto me dejó muy mal parado
    miércoles, 22 de noviembre de 2017 14:08
  • Gracias Ramiro tu información es bastante útil ya que me ideas adicionales, pero sigo en el mismo problema. Ya que tengo las Vistas (store procedures) ya hechas y cuando intento agregarlas, como por ejemplo la de proveedores:

                    RV.LocalReport.DataSources.Add(New ReportDataSource("dsProv", dsProv))

    la parte que dice dsProv me dice que es un tipo de clase y no se puede usar como expresión, aparentemente por lo que veo hay que declarar cada vista o store procedure en el código primero en ve< de la BD, lo cual no es eficiente.

    Si tienes alguna idea te lo agradeceré

    miércoles, 22 de noviembre de 2017 15:16
  • Maximiliano, claro, el ejemplo que te pase fue para demostrar que si se puede previsualizar varios .rdlc con un solo control reportviewer y un solo form ya que interpreté que esa era tu duda, en el ejemplo está orientado a dos clases creadas a modo de ejemplo.

    aparentemente por lo que veo hay que declarar cada vista o store procedure en el código primero en ve< de la BD, lo cual no es eficiente.

    No amigo, esto es incorrecto, ya tienes los store procedure en tu sql server, lo que tienes que hacer es cargarlo en una colección de datos en c# para atravez de esto utilizarlo y mostrarlo en el informe:

    Puedes hacerlo como un DataSet:

    SqlDataAdapter adapter = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);
        cmd.CommandType = CommandType.StoredProcedure;
        adapter.SelectCommand = cmd;
        DataTable dt = new DataTable();
        adapter.Fill(dt);

    o puedes hacerlo como entidad o clase usando el reader por ejemplo:

    SqlConnection connection = new SqlConnection(ConnectionString);
    
    command = new SqlCommand("TestProcedure", connection);
    command.CommandType = System.Data.CommandType.StoredProcedure;
    connection.Open();
    reader = command.ExecuteReader();
    
    List<Test> TestList = new List<Test>();
    Test test;
    
    while (reader.Read())
    {
        test = new Test();
        test.ID = int.Parse(reader["ID"].ToString());
        test.Name = reader["Name"].ToString();
        TestList.Add(test);
    }

    Todo esto te digo sin saber, Que tipo de colección de datos utilizas? dataset dinámicos o clases? Que lenguaje? 

    Bueno, comentá, saludos.-

    miércoles, 22 de noviembre de 2017 15:48
  • Ramiro gracias por tu pronta repuesta, el sistema que estoy terminando (Ya que solo faltan los reportes) me fue pedido en VB.NET, el dataset ya existe y se llama dsProv (Proveedores), lo que no entiendo es el por qué la linea

    RV.LocalReport.DataSources.Add(New ReportDataSource("dsProv", dsProv))

    da ese error, se supone que es para declarar nuevo origen de datos. Y como es que no acepta un dataset ya creado dentro del proyecto?

    miércoles, 22 de noviembre de 2017 15:56
  • Me pasas una captura de pantalla del error por favor?

    pregunto, agregaste la referencia al proyecto?

    Imports Microsoft.Reporting.WinForms


    miércoles, 22 de noviembre de 2017 16:00
  • Como podrás ver en la captura, donde agrego el dataset, me lo subraya en rojo y ve el error

    miércoles, 22 de noviembre de 2017 17:07
  • Estimado, claro porque lo que estas pasando es el nombre de la clase no la instancia, fíjate en la siguiente imagen:

    Como verás con el ejemplo que te compartí si yo pusiera Proveedores que es el nombre de la clase me informa el mismo error que a vos, pero lo correcto es la linea de arriba donde la paso una lista de la clase proveedores que la defino antes así: 

    Ahí la defino y después le agrego información con el método ADD

    De todos modos me parece raro que te estés refiriendo a clases cuando me dijiste que tienes datasets dinámicos:

    el dataset ya existe y se llama dsProv (Proveedores)

    De la línea de código que está dando error tenes que tener en cuenta dos cosas:

    RV.LocalReport.DataSources.Add(New ReportDataSource("dsProv", dsProv))

    el primer parámetro que está entre comillas asi "dsProv" es el nombre que tiene que ser igual al nombre que pusiste en el .RDLC es el nombre del dataset o de tu colección de datos.

    el segundo es la colección de datos en sí, no la clase sino el contenedor de los datos, fíjate que en tu print para el caso en el que tRpt es Bcos llenas un Dataset con esto:

    BancosTableAdapter.Fill(dsBancos.Bancos), bien, BancosTableAdapter es el adaptador tu contacto mas cercano al sql sea sql server o mysql y el dataset  dsBancos.Bancos es la colección de datos en cuestión.

    Esto mismo debería haber en tu código para cargarle información del sql a tu dataset dsProv y este dataset es el que tenes que pasárselo a la linea que te está generando error.

    Espero te sirva, saludos.-

    miércoles, 22 de noviembre de 2017 20:30
  • Gracias de nuevo Ramiro, me das luces pero sigo enredado, acá tienes un print screen del reporte (rdlc), si bien te entiendo lo que va en comillas es el nombre que coloqué en el rdlc y podrás ver que es dsProv, en el caso de bancos es ya colocado por VS cuando cree el reporte para Bancos, que es el primero que hice.

    Disculpa el tanto molestar, pero esto pelea con mi lógica o tal vez no entiendo por completo que quiso hacer Microsoft. De todas maneras agradezco mucho tu ayuda

    Disculpa si te molesto mucho, pero aún cuando tengo experiencia en programación, esta parte parece que no la acepta mi lógica.

    miércoles, 22 de noviembre de 2017 21:49
  • Bueno Maximiliano, veo que si estás un poco enredado, no tanto ya que estás cerca de generar el reporte, tu duda es como llenar un data set a través del table adapter desde código que lo generes vos, no automático hecho por VS, para poder ayudarte un poco mas de información, necesito:

    1) el print de pantalla que me pasas en el último mensaje pero con la pestaña de Conjunto de datos desplegada en los Datos del informe.

    2) Necesito por lo menos un print de pantalla de tu archivo .xsd del diseñador de datasets con el dataset dsProv desplegado como para saber como se llama tu table adapter y que métodos invocar.

    Si no deseas compartirlo comunícate conmigo a ramledes@gmail.com y lo veo remotamente o me lo pasas x mail como quieras. Saludos.-

    • Propuesto como respuesta Pablo Rubio jueves, 23 de noviembre de 2017 16:06
    miércoles, 22 de noviembre de 2017 22:43
  • Lamentablemente parece que llegamos al límite de 9 imágenes, te envio las mismas via Email. y Gracias de nuevo Ramiro
    miércoles, 22 de noviembre de 2017 23:09