none
Iniciandome con Reportviewer RRS feed

  • Pregunta

  • Buenos días a todos,

     

    estoy iniciandome con el componente Reportviewer, intentando hacer un maestro detalle, pero para ello he de lograr primero que se muestre el informe que he creado por código. El problema principal que encuentro es la carga de los datos de una tabla de un dataset. El código que utilizo es el siguiente:

     

    public frmInformePacientes()
            {
                InitializeComponent();
            }

            private DataTable LoadOrdersData()
            {
                // Load data from ClinicaInformesDataSet
                DataSet dataSet = new DataSet();           
                //dataSet.ReadXml("OrderData.xml"); --> Está sacado de un ejemplo. Ellos extraen los datos desde un XML, yo, sin embargo lo         quiero   extraer desde mi dataset, pero no se como.
                return dataSet.Tables[0];
            }

            private void frmInformePacientes_Load(object sender, EventArgs e)
            {
                this.Text = "Report de prueba";
                this.ClientSize = new System.Drawing.Size(700, 600);

                ReportViewer reportViewer = new ReportViewer();

                // Set Processing Mode

                reportViewer.ProcessingMode = ProcessingMode.Local;

                // Set RDL file

                reportViewer.LocalReport.ReportPath = "Pacientes.rdlc";

              
                // Supply a DataTable corresponding to each report dataset

                reportViewer.LocalReport.DataSources.Add(
                    new ReportDataSource("DataSet_pacientes", LoadOrdersData()));

                // Add the reportviewer to the form

                reportViewer.Dock = DockStyle.Fill;
                this.Controls.Add(reportViewer);

                // Process and render the report

                reportViewer.RefreshReport();
              
            }
        }

     

    Por favor, comentadme si necesitan más detalles o algo no queda claro.

     

    Gracias.

    sábado, 30 de abril de 2011 9:51

Todas las respuestas

  • hola

    el tema es que el Dataset deberia ser tipado, osea el dataset define los campos que tendra el reporte

     

    How to create local reports RDLC featuring barcode images in ASP.NET

    CodeProject: Using the ASP.NET 2.0 ReportViewer in Local Mode

    Using SQL Server Reporting Services in Client Mode

     

    Microsoft Reporting Services (Sub Reports, Charts, Parameters, Expression Editor, etc.)

    que luego cargas con la informacion que necesites

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 30 de abril de 2011 13:25
  • No me termina de quedar claro el tipado del Dataset. Yo he establecido un origen de datos llamado ClinicaInformesDataset, desde el asistente de Visual Studio, y posteriormente, creo mi informe con los campos que quiero (trabajo en local). ¿No sería esto el tipado del dataset?

     

    domingo, 1 de mayo de 2011 10:48
  • claro, pero tambien debes cargar este mismo dataset ClinicaInformesDataset con registros y asignarlo al reporte
    tu usas esto

    DataSet dataSet = new DataSet();    

    cuando deberias usar esto

    ClinicaInformesDataset dtClinicaInfo = new ClinicaInformesDatase();

    y ese dataset tipado cargarlo en el fill() y asignarlo al reporte

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 1 de mayo de 2011 12:34
  • Ya he logrado hacer que aparezcan los datos del Report principal, ahora tengo que lograr que aparezcan los datos del subreport asociado. Pongo el código y comento sobre el mismo:

     

    public frmInformePacientes()
            {
                InitializeComponent();
            }

            private DataTable LoadOrdersData()
            {
                // Load data from ClinicaInformesDataSet
                ClinicaInformesDataSet ds = new ClinicaInformesDataSet();
                DataTable tabla = new DataTable();
                pacientesTableAdapter.Fill(ds.pacientes); //-->Aquí relleno la tabla
                tabla = ds.Tables["pacientes"];
              
                return tabla;
            }

            private DataTable LoadOrderDetailsData() --> Relleno la tabla del subreport
            {
                ClinicaInformesDataSet ds = new ClinicaInformesDataSet();
                DataTable tabla = new DataTable();
                visitasTableAdapter1.Fill(ds.Visitas);
                tabla = ds.Tables["visitas"];

                return tabla;
            }

            void DemoSubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
            {
               e.DataSources.Add(new ReportDataSource("ClinicaInformesDataSet_visitas", LoadOrderDetailsData())); -->Añado la tabla al datasource
            }

            private void frmInformePacientes_Load(object sender, EventArgs e)
            {
                      
                this.Text = "Report de prueba";
                this.ClientSize = new System.Drawing.Size(700, 600);

                ReportViewer reportViewer = new ReportViewer();

                // Set Processing Mode

                reportViewer.ProcessingMode = ProcessingMode.Local;

                // Set RDL file

                reportViewer.LocalReport.ReportPath = "Pacientes.rdlc";

                // Add a handler for SubreportProcessing

                reportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(DemoSubreportProcessingEventHandler);

                // Supply a DataTable corresponding to each report dataset

                reportViewer.LocalReport.DataSources.Add(new ReportDataSource("ClinicaInformesDataSet_pacientes", LoadOrdersData()));

                // Add the reportviewer to the form

                reportViewer.Dock = DockStyle.Fill;
                this.Controls.Add(reportViewer);

                // Process and render the report

                reportViewer.RefreshReport();          
            }
        }

     

    Lo que no termino de ver claro es si habría que establecer parámetros dentro del Report principal para relacionarlo con el Subreport.

     

    Un saludo.

    lunes, 2 de mayo de 2011 9:32
  • Me he dado cuenta, haciendo la traza del código, que no entra en el manejador del subreport y no sé el motivo, ¿alguien me podría indicar el porque?. Adjunto el código modificado:

     

     private DataTable visitas = null;

     

     private DataTable CargarPacientes()
            {
                // Cargamos los datos del paciente desde ClinicaInformesDataSet
                ClinicaInformesDataSet ds = new ClinicaInformesDataSet();
                DataTable tabla = new DataTable();
               
                pacientesTableAdapter.Fill(ds.pacientes);
                tabla = ds.Tables["pacientes"];
              
                return tabla;
            }

            private DataTable CargarVisitas()
            {
                // Cargamos los datos de la visita ClinicaInformesDataSet
                ClinicaInformesDataSet ds = new ClinicaInformesDataSet();
                DataTable tabla = new DataTable();

                visitasTableAdapter1.Fill(ds.Visitas);          
                tabla = ds.Tables["visitas"];

                return tabla;
              
            }
            void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
            {
                if (visitas == null)
                    visitas = CargarVisitas();
                e.DataSources.Add(new ReportDataSource("ClinicaInformesDataSet_Visitas", visitas));
            }

            private void frmInformePacientes_Load(object sender, EventArgs e)
            {
                this.Text = "Report de prueba";
                this.ClientSize = new System.Drawing.Size(700, 600);

                ReportViewer reportViewer = new ReportViewer();

                // Modo de procesamiento

                reportViewer.ProcessingMode = ProcessingMode.Local;           

                // Establecemos el informe padre

                reportViewer.LocalReport.ReportPath = "Pacientes.rdlc";

                // Establecemos el manejadro del subinforme
              
                reportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
                           
                // Sustituimos las tablas

                reportViewer.LocalReport.DataSources.Add(new ReportDataSource("ClinicaInformesDataSet_pacientes", CargarPacientes()));
               
                // Añadimos el componente

                reportViewer.Dock = DockStyle.Fill;
                this.Controls.Add(reportViewer);

                // Actualizamos el informe           

                reportViewer.RefreshReport();          
            }
          
        }

     

    Un saludo y gracias.

    sábado, 7 de mayo de 2011 10:48