none
Generar un reporte con DataTable

    Question

  • Buen dia a todos! acabo de ver un post parecido a mi pregunta... pero es algo distinto... Necesito saber como pasar un DataTable a un reporte en blanco... Les Detallo un poco el proceso :

    Tengo una pagina web cgi-bin que consume un web service..., yo hago un post a una pagina enviandole un comando en xml y recibo como respuesta un xml, posteriormente leo ese xml recorriendo sus atributos y almacenandolos en un datatable... hasta aqui todo bien pero ¿Como paso este Datatable al crystal report? porque de alli una vez que se logre realizar el reporte lo convierto en pdf(que no tengo problemas al convertirlo). Mi incognita es pasar este datatable al RPT. Espero su ayuda. Dejo parte del codigo que realizo desde la lectura del xml :

                DataTable tabla = new DataTable();

     

                tabla.Columns.Add("TANQUE", typeof(string));

                tabla.Columns.Add("FECHA", typeof(DateTime));

                tabla.Columns.Add("HORA", typeof(string));

                tabla.Columns.Add("NIVEL", typeof(Decimal));

                tabla.Columns.Add("V_BRUTO", typeof(Decimal));

                tabla.Columns.Add("V_NETO", typeof(Decimal));

                tabla.Columns.Add("V_LLENAR", typeof(Decimal));

                tabla.Columns.Add("AGUA", typeof(Decimal));

                tabla.Columns.Add("TEMP", typeof(Decimal));

                tabla.Columns.Add("CAPACIDAD", typeof(Decimal));

     

     

    try

                {

                    using (XmlTextReader reader = new XmlTextReader(url))

                    {

                        reader.MoveToContent();

                        reader.ReadStartElement();

     

                        while (reader.Read())

                        {

                            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "TANK_STATUS"))

                            {

                                for (int i = 0; i < reader.AttributeCount; i++)

                                {

                                    reader.MoveToAttribute(i);

                                    {

                                        switch (reader.Name)

                                        {

                                            case "TANK_ID":

                                                id = reader.Value;

                                                hora = DateTime.Now.ToString("HH:mm:ss");

                                                break;

                                            case "WATER_LEVEL":

                                                nivel_a = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((nivel_a * 100), 2));

                                                nivel_a = Convert.ToDecimal(p);

                                                break;

                                            case "PRODUCT_LEVEL":

                                                product = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((product * 100), 2));

                                                product = Convert.ToDecimal(p);

                                                break;

                                            case "TEMPERATURE":

                                                temp = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((temp), 2));

                                                temp = Convert.ToDecimal(p);

                                                break;

                                            case "GROSS_PRODUCT_VOLUME":

                                                bruto = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((bruto * barriles), 2));

                                                bruto = Convert.ToDecimal(p);

                                                break;

                                            case "NET_PRODUCT_VOLUME":

                                                neto = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((neto * barriles), 2));

                                                neto = Convert.ToDecimal(p);

                                                break;

                                            case "WATER_VOLUME":

                                                vol_a = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((vol_a * barriles), 2));

                                                vol_a = Convert.ToDecimal(p);

                                                break;

                                            case "ULLAGE_VOLUME":

                                                vacio = Convert.ToDecimal(reader.Value);

                                                p = Convert.ToString(Decimal.Round((vacio * barriles), 2));

                                                vacio = Convert.ToDecimal(p);

                                                et.id = Convert.ToInt32(id);

                                                //FILA QUE AGREGO AL DATATABLE

                                                tabla.Rows.Add(nt.idProducto(et), DateTime.Now.Date, hora, product, bruto, neto, bruto + vacio, nivel_a, temp, Decimal.Round(((bruto * 100) / Decimal.Round(Convert.ToDecimal(nt.maxCapacidadT(et)), 2)), 2));

                                                break;

                                        }

                                    }

                                }

     

                            }

                        }

     

                    }

                    /* E AQUI EL PROBLEMA COMO PASARLO? */

                    cryRpt = new ReportDocument();

                    cryRpt.Load("C:\\Documents and Settings\\Monza_02\\Escritorio\\tanques.rpt");

                    cryRpt.SetDataSource(tabla);

                    crystalReportViewer1.ReportSource = cryRpt;

                    //crystalReportViewer1.Refresh(); 

                    /************************************/

                    /*            CODIGO DE RPT A PDF                */

                    try

                    {

                        ExportOptions CrExportOptions;

                        DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();

                        PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();

                        CrDiskFileDestinationOptions.DiskFileName = "C:\\Documents and Settings\\Monza_02\\Escritorio\\tanques.pdf";

                        CrExportOptions = cryRpt.ExportOptions;

                        {

                            CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;

                            CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;

                            CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;

                            CrExportOptions.FormatOptions = CrFormatTypeOptions;

                        }

                        cryRpt.Export();

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show(ex.ToString());

                    }

                }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.Message, "GRYPHOS", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

     

     

     


    John Barboza.
    Saturday, March 19, 2011 2:15 PM

Answers

  • hola

    para esto usa dataset tipados

    aqui

    [Crystal Reports] - Exportar DataGridView a Crystal

    el origen de lso datos es diferente, no es un servicio con xml sino que es un datagridview, pero el objetivo es el mismo

    veras que desde codigo puedes crear las rows del datasset tipado y luego asignarle este como origen de datos del reporte

    bueno esta misma tecnica es la que debes aplicar, del xml lo parseas y creas als rows del dataset tipado que luego usas en el reporte

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Aquaventus Saturday, March 19, 2011 3:18 PM
    Saturday, March 19, 2011 2:37 PM
  • Si es una Aplicación de Escritorio perfectamente el codigo que te mostre arriba te será de mucha utilidad. 

    DataTable tuDataTable = PersonalDAL.GetAgentesPorUnidad(this.cboUnidad.SelectedValue);
    
    
    
    //objeto reporte
    
    ReporteAgentesUnidad rpt = new ReporteAgentesUnidad();
    
    
    
    //Cargamos el reporte mediante su ruta.
    
    rpt.Load(Application.StartupPath + "\\ReporteAgentesUnidad.rpt");
    
    
    
    //Origen de Datos para el Reporte.
    
    rpt.SetDataSource(dt);
    
    
    
    //Titulo del Reporte
    
    rpt.SummaryInfo.ReportTitle = "LISTADO DE AGENTES DE LA UNIDAD " + this.cboUnidad.Text;
    
    
    
    //Enlazamos el Reporte al Visor de Informes
    
    CrystalReportViewer1.ReportSource = rpt;
    
    Ten en cuenta que el DataTable y DataSet, tienen metodos que te permiten Serializar a XML,
    igualmente si recibes un XML, perfectamente puedes convertir ese XML A UN DATASET, mediante ReadXML.
    La manera en la que trabajas tu es valida, y me paece bien que tengas tu propia logica.
    Mi respuesta a tu pregunta es respecto al reporte en Crystal Report, y espero haber contribuido con un granito de arena.
    Saludos desde Trujillo-Perú

    Programador .NET - Desarrollador 5 Estrellas.
    • Marked as answer by Aquaventus Saturday, March 19, 2011 3:18 PM
    Saturday, March 19, 2011 2:39 PM

All replies

  • Pues solo debes asignar tu DataTable con los datos devueltos a la propiedad SetDataSource del objeto CR que anteriormente debes declarar.

    Aca te pongo un fragmento de codigo que ojala pueda ayudarte y darte una idea.

      Dim tuDataTable As DataTable = PersonalDAL.GetAgentesPorUnidad(Me.cboUnidad.SelectedValue)
    
    
    
    	'objeto reporte
    
      Dim rpt As New ReporteAgentesUnidad
    
    
    
      'Cargamos el reporte mediante su ruta.
    
      rpt.Load(Application.StartupPath + "\ReporteAgentesUnidad.rpt")
    
    
    
      'Origen de Datos para el Reporte.
    
      rpt.SetDataSource(dt)
    
    
    
      'Titulo del Reporte
    
      rpt.SummaryInfo.ReportTitle = "LISTADO DE AGENTES DE LA UNIDAD " + Me.cboUnidad.Text
    
    
    
      'Enlazamos el Reporte al Visor de Informes
    
      CrystalReportViewer1.ReportSource = rpt

     

    El codigo esta en Visual Basic, pero no creo que tengas problemas en adaptarlo a C#, otro aclaracion es que en el codigo, el metodo que llena el DataTable llama a un metodo de una CLASE DAL, y no a un WebService, sin embargo esa parte puedes modificarla usando tu WebService que previamente debes de haber sido declarado.

    Tambien debes agregar un Visor de Informes para que puedas mostrarlo en el Browser.


    Programador .NET - Desarrollador 5 Estrellas.
    Saturday, March 19, 2011 2:23 PM
  • Pues solo debes asignar tu DataTable con los datos devueltos a la propiedad SetDataSource del objeto CR que anteriormente debes declarar.

    Aca te pongo un fragmento de codigo que ojala pueda ayudarte y darte una idea.

     Dim tuDataTable As DataTable = PersonalDAL.GetAgentesPorUnidad(Me.cboUnidad.SelectedValue)
    
    
    
    	'objeto reporte
    
     Dim rpt As New ReporteAgentesUnidad
    
    
    
     'Cargamos el reporte mediante su ruta.
    
     rpt.Load(Application.StartupPath + "\ReporteAgentesUnidad.rpt")
    
    
    
     'Origen de Datos para el Reporte.
    
     rpt.SetDataSource(dt)
    
    
    
     'Titulo del Reporte
    
     rpt.SummaryInfo.ReportTitle = "LISTADO DE AGENTES DE LA UNIDAD " + Me.cboUnidad.Text
    
    
    
     'Enlazamos el Reporte al Visor de Informes
    
     CrystalReportViewer1.ReportSource = rpt

     

    El codigo esta en Visual Basic, pero no creo que tengas problemas en adaptarlo a C#, otro aclaracion es que en el codigo, el metodo que llena el DataTable llama a un metodo de una CLASE DAL, y no a un WebService, sin embargo esa parte puedes modificarla usando tu WebService que previamente debes de haber sido declarado.

    Tambien debes agregar un Visor de Informes para que puedas mostrarlo en el Browser.


    Programador .NET - Desarrollador 5 Estrellas.
    hola luis muños! gracias por tu respuesta. la aplicacion es winform, mi proyecto no consume un web service. el proceso es que yo envio un parametro a una pagina web que consume un webservice y ese webservice retorna a la pagina como respuesta una cadena en formato xml que yo lo obtengo de la peticion que le hice a la web, luego esta cadena la convierto en un archivo xml pasandole la cadena. y es de alli donde hago el recorrido y obtengo los datos. Ahora con respecto del datatable... le construyo columnas que al finalizar el recorrido de un item del xml se lo agrego con los datos obtenidos en el recorrido.
    John Barboza.
    Saturday, March 19, 2011 2:31 PM
  • hola

    para esto usa dataset tipados

    aqui

    [Crystal Reports] - Exportar DataGridView a Crystal

    el origen de lso datos es diferente, no es un servicio con xml sino que es un datagridview, pero el objetivo es el mismo

    veras que desde codigo puedes crear las rows del datasset tipado y luego asignarle este como origen de datos del reporte

    bueno esta misma tecnica es la que debes aplicar, del xml lo parseas y creas als rows del dataset tipado que luego usas en el reporte

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Aquaventus Saturday, March 19, 2011 3:18 PM
    Saturday, March 19, 2011 2:37 PM
  • Si es una Aplicación de Escritorio perfectamente el codigo que te mostre arriba te será de mucha utilidad. 

    DataTable tuDataTable = PersonalDAL.GetAgentesPorUnidad(this.cboUnidad.SelectedValue);
    
    
    
    //objeto reporte
    
    ReporteAgentesUnidad rpt = new ReporteAgentesUnidad();
    
    
    
    //Cargamos el reporte mediante su ruta.
    
    rpt.Load(Application.StartupPath + "\\ReporteAgentesUnidad.rpt");
    
    
    
    //Origen de Datos para el Reporte.
    
    rpt.SetDataSource(dt);
    
    
    
    //Titulo del Reporte
    
    rpt.SummaryInfo.ReportTitle = "LISTADO DE AGENTES DE LA UNIDAD " + this.cboUnidad.Text;
    
    
    
    //Enlazamos el Reporte al Visor de Informes
    
    CrystalReportViewer1.ReportSource = rpt;
    
    Ten en cuenta que el DataTable y DataSet, tienen metodos que te permiten Serializar a XML,
    igualmente si recibes un XML, perfectamente puedes convertir ese XML A UN DATASET, mediante ReadXML.
    La manera en la que trabajas tu es valida, y me paece bien que tengas tu propia logica.
    Mi respuesta a tu pregunta es respecto al reporte en Crystal Report, y espero haber contribuido con un granito de arena.
    Saludos desde Trujillo-Perú

    Programador .NET - Desarrollador 5 Estrellas.
    • Marked as answer by Aquaventus Saturday, March 19, 2011 3:18 PM
    Saturday, March 19, 2011 2:39 PM
  • Pruebo y les comento... Saludos!
    John Barboza.
    Saturday, March 19, 2011 2:43 PM
  • Señores Perfecto! ya resolvi el problema! lo tuve que hacer de una manera distinta... lo que pasa es que uso el vs team system 2008 y no agregamos el crystal que viene por defecto, sino que tenemos el crystal report XI y de alli  tuve que crear un reporte... y enlazarlo al dataset que tenia en mi proyecto..., gracias leandro y gracias luis!.

    este fue mi guia : http://ltuttini.blogspot.com/2010/05/crystal-reports-exportar-datagridview.html


    John Barboza.
    Saturday, March 19, 2011 3:17 PM