jueves, 28 de marzo de 2013

Crear un informe con Crystal Report en Visual Studio 2010


Lo primero que deberemos realizar es instalar el Crystal Report en nuestra máquina para poderlo utilizar dentro de nuestro Visual Studio 2010. Para ello tendremos que irnos a su página oficial y descargárnoslo.
Una vez tengamos instalado el Crystal Report realizaremos un pequeño programa de ejemplo. En que crearemos un DataSet y le introduciremos datos con los que generaremos el informe.

IMPORTANTE: en el proyecto tenemos  que estar trabajando con el Framework 3.5 ya que con el 4 algunos controles del Crystal Report no aparecen.

El aspecto de la aplicación podría ser una cosa parecida a esto:




Como veis simplemente es un DataGridView que hemos llenados con un DataSet y dos botones. Aquí os dejo el código para llenar el DataSet y llenar el DataGridView.


Los primero será un objeto DataSet a nuestra clase principal.

// Creamos el DataSet
DataSet MisDatos = new DataSet();


Después en el evento “Load” del formulario llenaremos el DataSet y con el mostraremos los datos en un DataGridView.

private void Form1_Load(object sender, EventArgs e)
{

       // Añadimos una tabla al Dataset
       MisDatos.Tables.Add("Empleados");

       // Agremos las columnas a la Tabla
MisDatos.Tables["Empleados"].Columns.Add("DNI");
MisDatos.Tables["Empleados"].Columns.Add("Nombre");
MisDatos.Tables["Empleados"].Columns.Add("Apellidos");
MisDatos.Tables["Empleados"].Columns.Add("Telefono");


// Creamos varias filas y se las agregamos al DataSet
DataRow fila1 = MisDatos.Tables["Empleados"].NewRow();
fila1["DNI"] = "54090909Z";
fila1["Nombre"] = "Pepe";
fila1["Apellidos"] = "Sanchez Vega";
fila1["Telefono"] = "928721102";

DataRow fila2 = MisDatos.Tables["Empleados"].NewRow();
fila2["DNI"] = "33012909Z";
fila2["Nombre"] = "David";
fila2["Apellidos"] = "Perez Santana";
fila2["Telefono"] = "928091502";

DataRow fila3 = MisDatos.Tables["Empleados"].NewRow();
fila3["DNI"] = "10033909Z";
fila3["Nombre"] = "Maria";
fila3["Apellidos"] = "Hernadez Peñate";
fila3["Telefono"] = "928512502";

// Agregamos las filas
MisDatos.Tables["Empleados"].Rows.Add(fila1);
MisDatos.Tables["Empleados"].Rows.Add(fila2);
MisDatos.Tables["Empleados"].Rows.Add(fila3);


// Rellenamos el nuestro Datagrid
dtgEmpleados.DataSource = MisDatos.Tables["Empleados"];

}

Vale ahora vamos a la parte de generar el informe. Para ello deberemos agregar a nuestro proyecto un nuevo elemento para ello tendremos que ir a la ventana de explorador de soluciones y pulsar ratón secundario y seleccionar la acción de “Agregar nuevo elemento”.




Y Agregaremos un conjunto de datos. Este será el DataSet que se le pasara el Crystal para generar el informe y que contiene la estructura de datos que usara.





Ahora tendremos que definir los datos del DataSet que vamos a usar para el informe. Para ello tendremos que agregar un “DataTable” y después ir agregando las columnas que vamos a usar en nuestro informe.



Ahora tendremos que repetir la acción anterior y agregar  un “Nuevo elemento” pero esta vez agregaremos ya el informe.


Este informe lo vamos a generar con el asistente así que siguiente.


Después de ventana anterior se nos mostrara esta otra.


Esta ventana es donde definimos el origen de datos en nuestro caso el DataSet que  hemos creado anteriormente. Para ello tendremos que abrir el árbol que pone “ADO.NET DataSets” y agregar nuestro DataSet.


En esta ventana tendremos que agregar los campos que queremos utilizar para generar el informe en mi caso voy a seleccionar todos los campos.


Nos aparecerán más ventana por si queremos agrupar por algún campo o filtrar para este ejemplo no vamos a utilizar ninguna de estas opciones.


Dejamos el valor por defecto y finalizamos. Ahora se nos abrirá el diseñador de informes del Crystal Report.  Aquí es donde definiremos los encabezados, etiquetas, imágenes etc... Que queramos que se muestren en nuestro informe.


Vale ahora lo que aremos será crear una pequeña función para volcar los datos que se muestran en el DataGridView y que vienen de un objeto DataSet  de .NET a nuestro DataSet tipado que hemos creado anteriormente. Este es el código de la función.

// Traspasa Datos
private DtEmpleados TraspasaDatos()
{
   // Creamos el objeto
   DtEmpleados Empleados = new DtEmpleados();

   // Creamos filas y se la vamos agregando mediante un bucle
   for(int i=0; MisDatos.Tables[0].Rows.Count > i; i++)
   {
      DtEmpleados.DataTable1Row fila = Empleados.DataTable1.NewDataTable1Row();
      fila.DNI = MisDatos.Tables[0].Rows[i]["DNI"].ToString();
      fila.Nombre = MisDatos.Tables[0].Rows[i]["Nombre"].ToString();
      fila.Apellidos = MisDatos.Tables[0].Rows[i]["Apellidos"].ToString();
      fila.Telefono = MisDatos.Tables[0].Rows[i]["Telefono"].ToString();

      // Agregamos la fila a nuestro DataSet tipado
      Empleados.DataTable1.AddDataTable1Row(fila);
   }

    return Empleados;

}

Vale ahora que ya hemos realizado el traspaso de datos ahora nos queda pasarle estos datos al informe y mostrar el informe. Para ello agregaremos un nuevo formulario al proyecto para visualizar el informe. Para ello debemos irnos al explorar de soluciones y agregar un “Nuevo elemento”.



Ahora en el nuevo formulario que acabamos de agregar agregaremos un control nuevo que se llama “ReportViewer” que los podéis encontrar en la categoría “Informe”. Este control el visor de los informes que genera el Crystal Report.


Lo agregáis al formulario y los ajustáis.


Bueno como veis donde vamos a visualizar el informe del Crystal Report es en otro formulario por ello deberemos modificar el constructor de este formulario para poderle pasarle los datos y así poder generar el informe. Adjunto el código de como sobrecargar el constructor y agregarle los datos al informe y como mostrar este informe en el visor del Crystal Report.


public partial class FVisor : Form
{
    DtEmpleados MisDatos;

    public FVisor()
    {
        InitializeComponent();

    }

    // Sobrecargamos el contrustor del forumario
    public FVisor(DtEmpleados Datos)
    {
        InitializeComponent();

        // Pasamos los datos que obtenemos de constructor
        MisDatos = Datos;

    }

    private void FVisor_Load(object sender, EventArgs e)
    {

        // Creamos objeto del informe
        CrystalReport1 Informe =  new CrystalReport1();

        // Pasamos los datos al informe
        Informe.SetDataSource(MisDatos);

        // Le pasamos el informe al visor
        this.crystalReportViewer1.ReportSource = Informe;
    }
}


Bueno ahora volveremos al formulario principal al evento “Clic” para generar el informe.

private void button2_Click(object sender, EventArgs e)
{
    // Creamos una instacia de nuestro DataSet tipado
    // y lo rellenamos con la función de traspaso
    DtEmpleados DatosEmp = new DtEmpleados();

    DatosEmp = TraspasaDatos();

    // Creamos el formulario y le pasamos los datos al formulario
    FVisor MiVisor = new FVisor(DatosEmp);
           
    // Y lo mostramos
    MiVisor.Show();
}


Ya con esto ya se nos habrá imprimido un informe algo sencillo pero bueno ya lo demás es cuestión de añadir elementos y modificar el informe mediante el diseñador.


Ahora otra imagen dejándolo más presentable añadiendo una imagen.


Vídeo de la aplicación funcionando.


Enlace con el proyecto de ejemplo: aqui






2 comentarios:

  1. excelente tutorial, pero al compilar me aparece un ventana que solicita user y contraseña de la base de datos... Ayuda

    ResponderEliminar
  2. hola, es muy bueno el tutorial, ahora cuento con este problema al momento de correr el programa me sale lo siguiente:
    System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.'

    WindowsApp3.FVisor.crystalReportViewer1.get devolvió Nothing.

    ResponderEliminar