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.
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.
Creamos el reporte usando el dataset que creamos(el reporte mostrara todos los articulos de nuestra base de datos).
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 FunctionEl 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 SubEn 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.
Eso es todo espero les sirva mucho saludos desde El Salvador...
Descargar Proyecto C#
Descargar Proyecto VB.Net
0 Comentarios