19 de diciembre de 2012

ReportViewer con DataSet Tipado

Que pasa si hacemos una aplicación para un vecino, una empresa pequeñísima o incluso un proyecto para la universidad y nos piden mostrar información en un reporte? pues fácil lo podemos hacer super practico e incluso visualmente atractivo en Crystal Report asi: Reportes con Crystal Report.

Pero y si se da el típico caso del profesor que te dice: "pues ustedes sabrán como lo hacen pero yo no voy a instalar nada mas que el Framework para Visual Studio" entonces toca que buscar una solución y esa es crear reportes locales a la aplicación, a lo mejor no sea tan buena comparando esta solución con usar Crystal Report pero el resultado termina siendo el mismo, entregar al usuario un reporte con la información que necesita y listo para imprimir.

Vamos a hacer un reporte casero(local) para una aplicación de escritorio tanto en VB como en C#, la tabla que usaremos se llama empleado y tiene los siguientes campos:


Creamos un nuevo proyecto para escritorio y luego lo primero sera tener el Dataset y lo haremos desde la pestaña Data Sources en nuestro proyecto y seleccionamos agregar un nuevo Data Source al que llamaremos Datos con un DataTable llamado empleado, tal como se muestra:


listo, ya creamos un Dataset para nuestro reporte, ahora falta crear el reporte, para eso damos click derecho sobre nuestro proyecto en el Solution Explorer y agregamos un nuevo item que sera un reporte local y le dejamos como nombre Report1.rdlc(ten presente que el nombre que le des al reporte es muy importante para enlzar los datos) y lo guardamos en la misma carpeta de nuestro proyecto(igualmente la ubicacion de tu reporte es importante).




al hacer lo anterior tendremos una pantalla para diseñar nuestro reporte y en la parte izquierda una pestaña Toolbox desde la cual agregamos una tabla para nuestro ejemplo, tu puedes agregar una Matrix, Rectangle, List según lo necesites:


y al hacerlo se abrirá una ventana llamada Dataset Properties donde se nos pedirá definir una fuente de datos para poblar el reporte, aquí es donde usaremos el Dataset que creamos(aquel que se llamaba Datos) y el Datatable respectivo, se llena así:

Name: como nombre para nuestra fuente de datos para el reporte ponemos Datos.
Data source: el Dataset que creamos desde Data Sources y cuyo nombre es Datos
Avaible datasets: el nombre del Datatable del Dataset que creamos: empleado
si tienes alguna duda regresate a ver la segunda imagen de este blog


Ahora en la parte izquierda tendremos una pestaña llamada Report Data y desde ahí jalamos los campos del Dataset hacia la tabla que agregamos en nuestro reporte así:


este es nuestro reporte, de lo mas sencillo, aquí solo muestro como poblar el reporte desde un Dataset, ustedes sabrán cual es el diseño que quieran aplicar


Lo ultimo sera regresar a nuestro formulario que el proyecto crea por defecto: Form1.vb le especificamos que reporte utilizar al ReportViewer desde el Choose Report y vamos a agregar desde el Toolbox los siguientes elementos un reportViewer asi como un label, un textbox y un botón a fin que quede como la imagen:

Buscar un empleado en especifico o mostrarlos todos

como? si, a continuación muestro el código para el evento click del botón, lo que se hará es que al presionar el botón va buscar un dato es especifico según sea el código que se introduce en el textbox, pero en caso no se introduzca ningún código y se presione el botón Buscar entonces mostrara todos los datos de la tabla empleado y los mostrara en el reporte, dos pajaros de un tiro verdad? te muestro como listar todos lo datos de una tabla o solo uno en particular.

Codigo VB

Imports Microsoft.Reporting.WinForms
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1

Private Sub BBuscar_Click(sender As System.Object, e As System.EventArgs) Handles BBuscar.Click

Dim info As New Datos                    'instancia a Dataset Datos creado con el asistente
Dim da As New SqlDataAdapter
Dim cmd As New SqlCommand

Using Sql As New SqlConnection(My.Settings.cnn)
Sql.Open()
Using cmd
cmd.Connection = Sql

If (Not (String.IsNullOrEmpty(TextBox1.Text))) Then
cmd.CommandText = "select * from empleado where codigo=@codigo"
cmd.Parameters.AddWithValue("@codigo", TextBox1.Text)
Else
cmd.CommandText = "select * from empleado"
End If

da.SelectCommand = cmd
da.Fill(info, "empleado")
End Using
End Using

ReportViewer1.ProcessingMode = ProcessingMode.Local         'Tipo de procesamiento del visor
ReportViewer1.Visible = True
ReportViewer1.SetDisplayMode(DisplayMode.Normal)
ReportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report1.rdlc"
Dim rds As New ReportDataSource("Datos", info.Tables(0))   'Dataset utilizado para poblar el reporte y la tabla que se utilizara
ReportViewer1.LocalReport.DataSources.Clear()              'limpio la fuente de datos
ReportViewer1.LocalReport.DataSources.Add(rds)             'Agrego el ReportDatasource
ReportViewer1.RefreshReport()
End Sub
End Class


Codigo C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
using Microsoft.Reporting.WinForms;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form  {
SqlConnection sql = new SqlConnection(ConfigurationManager.ConnectionStrings["cnn"].ConnectionString);
SqlDataAdapter da;
SqlCommand cmd;
Datos info;

public Form1()       {
InitializeComponent();
da=new SqlDataAdapter();
info=new Datos();    }

private void Form1_Load(object sender, EventArgs e){ }

private void BBuscar_Click(object sender, EventArgs e){
using (sql){
sql.Open();
using (cmd = new SqlCommand()){
cmd.Connection = sql;
if (string.IsNullOrEmpty(textBox1.Text)){
cmd.CommandText = "select * from empleado";
}else{
cmd.CommandText = "select * from empleado where codigo=@codigo";
cmd.Parameters.AddWithValue("@codigo", textBox1.Text);}
da.SelectCommand = cmd;
da.Fill(info, "empleado");}}
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
this.reportViewer1.LocalReport.ReportEmbeddedResource = @"WindowsFormsApplication1.Report1.rdlc";
ReportDataSource rds = new ReportDataSource("Datos", info.Tables[0]);
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(rds);
this.reportViewer1.RefreshReport();}}}


 y eso es todo ;)