Programación, Tecnología y Más...

Programación, Tecnología y Más...

Filtrar Datos de Reporte - Crystal Report

Primeramente les deseo feliz año 2013 a todos los lectores de mi blog espero que este año este lleno de muchas bendiciones para todos.

Quiero empezar este año con un ejemplo que es muy común y necesario a la hora de hacer reportes con crystal report, y es que cuando creamos reportes en ocasiones tenemos la necesidad de filtrar los datos por medio de uno o varios campos.

 El ejemplo sera uno simple para que puedan entenderlo, la base de datos que usare para el ejemplo solo cuenta con 2 tablas Categoría y Articulo.


base de datos

Creamos un dataset(DsReporte) y agregamos 2 datatable que representaran las 2 tablas de la base de datos ademas le agregamos los campos correspondiente de cada tabla y también indicamos el tipo de dato de cada campo. Importante que cada datatable tiene que llamarse como el nombre de la tabla en la base de datos y ademas tener los mismos campos y mismo tipo de dato que tienen en la base de datos.

dataset 


tipo de dato 


Creamos el reporte usando el dataset que creamos(el reporte mostrara todos los articulos de nuestra base de datos).

crear reporte


Ahora crearemos el código que usaremos para llenar el dataset y mostrar los datos en el reporte así que agregamos una clase(modulo en el caso de vb) llamada Datos y agregamos el siguiente codigo.
        public static DataTable CargarCategoria()
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                DataTable dt = new DataTable();
                string query = "SELECT * FROM Categoria";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                return dt;
            }
        }

        public static DsReporte CargarArticulos()
        {
            DsReporte ds = new DsReporte();
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                string query = "SELECT * FROM Articulo";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Articulo");
                return ds;
            }
        }

        public static DsReporte FiltrarArticulos(int categoria)
        {
            DsReporte ds = new DsReporte();
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                string query = "SELECT * FROM Articulo WHERE CatId=@cat";
                SqlCommand cmd = new SqlCommand(query, cnn);
                cmd.Parameters.AddWithValue("@cat", categoria);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Articulo");
                return ds;
            }
        }
    Public Function CargarCategoria() As DataTable
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim dt As New DataTable()
            Dim query As String = "SELECT * FROM Categoria"
            Dim cmd As New SqlCommand(query, cnn)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
            Return dt
        End Using
    End Function

    Public Function CargarArticulos() As DsReporte
        Dim ds As New DsReporte()
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim query As String = "SELECT * FROM Articulo"
            Dim cmd As New SqlCommand(query, cnn)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(ds, "Articulo")
            Return ds
        End Using

    End Function

    Public Function FiltrarArticulos(ByVal categoria As Integer) As DsReporte
        Dim ds As New DsReporte()
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim query As String = "SELECT * FROM Articulo WHERE CatId=@cat"
            Dim cmd As New SqlCommand(query, cnn)
            cmd.Parameters.AddWithValue("@cat", categoria)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(ds, "Articulo")
            Return ds
        End Using
    End Function
El metodo CargarCategoria() obtiene todos los datos de la tabla categoría en un datatable.
El metodo CargarArticulos() llena el dataset con los datos de la tabla articulos.
El metodo FiltrarArticulos() también llena el dataset con los datos de la tabla artículos pero a diferencia del anterior este los llena aplicando un filtro que en este caso es por medio del campo CatId.

Ahora programaremos el código que tendrá nuestro Form.
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = Datos.CargarCategoria();
            comboBox1.DisplayMember = "CatNombre";
            comboBox1.ValueMember = "CatId";
            comboBox1.SelectedIndex = -1;

            DsReporte datos = Datos.CargarArticulos();

            CrpReporte report = new CrpReporte();
            report.SetDataSource(datos);
            crystalReportViewer1.ReportSource = report;

        }

        private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            DsReporte datos = Datos.FiltrarArticulos(Convert.ToInt32(comboBox1.SelectedValue));

            CrpReporte report = new CrpReporte();
            report.SetDataSource(datos);
            crystalReportViewer1.ReportSource = report;
        }
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = Datos.CargarCategoria()
        ComboBox1.DisplayMember = "CatNombre"
        ComboBox1.ValueMember = "CatId"
        ComboBox1.SelectedIndex = -1

        Dim da As DsReporte = Datos.CargarArticulos()

        Dim report As New CrpReporte()
        report.SetDataSource(da)
        CrystalReportViewer1.ReportSource = report
    End Sub

    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
        Dim da As DsReporte = Datos.FiltrarArticulos(Convert.ToInt32(ComboBox1.SelectedValue))

        Dim report As New CrpReporte()
        report.SetDataSource(da)
        CrystalReportViewer1.ReportSource = report
    End Sub
En el evento Load cargamos las categorias en un combobox y tambien cargamos en el reporte todos los artículos.
En el evento SelectionChangeCommitted del combobox cargamos los datos en el reporte dependiendo la categoría seleccionada en el combobox, asi cada vez que el usuario seleccione una categoría del combobox los datos del reporte solo mostraran los artículos que pertenecen a la categoría seleccionada.

Capturas


Eso es todo espero les sirva mucho saludos desde El Salvador...

Descargar Proyecto C#

Descargar Proyecto VB.Net

Publicar un comentario

0 Comentarios