[CR] Usando Listas para llenar nuestros informes (I).

Introducción

Un tema muy común a cualquier aplicación y una de las cuestiones más preguntadas en los foros de MSDN, es acerca de los informes con Crystal Reports.

Hasta la llegada de Visual Studio 2005, la forma más sencilla de rellenar con datos y definir un informe se realizaba gracias a los DataSet Tipados.

Con Visual Studio 2005 se introdujeron las Listas (List) que son colecciones de datos. También se modificaron los asistentes de los Informes de Crystal Reports para admitir definir un informe basado en una clase.

En este primer post vamos a ver como mostrar un informe de Crystal Reports utilizando como fuente de datos una Lista de una clase propia.

Creando un Ejemplo

Para este pequeño ejemplo introductorio, voy a utilizar Visual Studio 2005, y quiero recalcar que es válido en VS2008 y VS2010.

En primer lugar, vamos a definir la clase base de nuestro informe, y una vez creada Genereramos la solución para que se refresquen los orígenes de datos:

   1: public class cPersona

   2:     {

   3:         public cPersona()

   4:         {

   5:  

   6:         }

   7:         private int _ID;

   8:  

   9:         public int ID

  10:         {

  11:             get { return _ID; }

  12:             set { _ID = value; }

  13:         }

  14:         private string _Nombre;

  15:  

  16:         public string Nombre

  17:         {

  18:             get { return _Nombre; }

  19:             set { _Nombre = value; }

  20:         }

  21:     }

El siguiente paso, será crear un nuevo Informe:

a) Agregaremos un nuevo fichero de tipo Informe Crystal Reports a Nuestro Proyecto.

b) Desde el asistente, indicaremos que vamos a usar el asistente y un informe standard:

c) Seleccionaremos el Origen de Datos dentro de los Objetos de .Net:

d) Indicaremos que propiedades de la clase queremos mostrar en el informe:

e) Pulsaremos en Finalizar y aparecerá el diseñador del informe para que podamos personalizarlo a nuestro gusto:

 

Una vez definido el informe, vamos a ver como asginar el origen de datos y mostrarlo en un control Report Viewer:

   1: InformePersonal informe = new InformePersonal();

   2: List<cPersona> personas = new List<cPersona>();

   3: cPersona persona = new cPersona();

   4: for (int i = 0; i < 15; i++)

   5: {

   6:     persona = new cPersona();

   7:     persona.ID = i;

   8:     persona.Nombre = String.Format("Nombre {0}", i);

   9:     personas.Add(persona);

  10: }

  11: crystalReportViewer1.ReportSource = informe;

  12: informe.SetDataSource(personas);

Conclusión

Creo que el poder enlazar como tipo de origen una clase propia en lugar de un DataSet tipado, nos va a permitir trabajar de forma más sencilla y rápida.

 

Espero que os sea de utilidad.

 

Saludos!

9 comentarios en “[CR] Usando Listas para llenar nuestros informes (I).”

  1. Hola artista! 🙂
    Sólo un comentario: Actualmente no se soportan clases que tengan definidas propiedades de tipos nullables (int?). Si intentas pasar una lista de este tipo al report vas a ver una bonita excepción.
    De todos modos, para la mayoría de los casos es una solución muy elegante. Nada que ver con los DataSets Tipados, algo de lo que el propio Gandalf huiría, sin duda 😀

  2. Hola Javier:

    Una consulta, que pasa si es que esa clase cPersona esta en otro proyecto y accedemos via Reference a dicha clase. Cuando hago eso, no se muestra la clase. Hay alguna forma de trabajar con esas entidades o lista en otro proyecto?

    Saludos

  3. Hola Miguel,

    Para que puedas utilizar dicha clase es necesario que en el proyecto donde tengas el informe de Crystal Reports, tenga la referencia a la DLL, en ese caso deberia bastarte para que puedas hacerlo.

    Si no te funciona avisame y le pego un vistazo.

  4. Estimado Javier , muy buen el post pero te comento me pasa lo mismo que a MIguel, tengo una solucion en la cual tengo el proyecto de ventas, donde estan todos mis forms, tengoun proyecto de entidades donde tendo las clases de las entidades.

    En el proyecto de ventas tengo agregada la referencia al proyecto de entidades, dentro de los forms puedo usar las clases sin ningun problema.

    pero cuando intento hacer el informe no puedo ver las clases del proyecto de entidades para usarlas en el reporte. Hay alguna forma de hacer eso???

  5. Hola Fernando,

    Lo primero gracias por comentar.

    He estado probando lo que comentas y efectivamente si la clase está en un DLL distinta a los reports no funciona.

    Probando y probando he visto una forma de hacerlo:

    En cada una de las clases susceptibles a tener un informe, declarar una función “static” de c# o “shared” de VB que devuelva un objeto DataTable con los datos a mostrar…

    En el informe, será necesario agregar el origen de datos en:
    1) Crear Nueva Conexión.
    2) ADO.NET
    3) Establecer nueva Conexión
    4) Localizar la DLL
    5) Elegir la clase que queremos el informe.
    6) Seleccionar la función que hemos indicado

    Espero que te sirva.

    Un saludo!

  6. Hola Javier

    Tengo un problema con el codigo cuando intengo generar el reporte me muestra el siguiente error

    (“No se puede cargar el archivo o ensamblado ‘file:///C:Program Files (x86)SAP BusinessObjectsCrystal Reports for .NET Framework 4.0CommonSAP BusinessObjects Enterprise XI 4.0win32_x86dotnet1crdb_adoplus.dll’ ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.”)

    No se como resolverlo.
    Podrias darme una mano 🙂

  7. Hola. A ya mas de un año de escrito este post, lo estoy viendo en este momento, sucede que soy nuevo en el uso de Crystal Reports y quisiera saber si es necesario tener un archivo XML para poder realizar el proceso, ya que como se describe en el punto C) no me permite avanzar sin usar un archivo XML y al generar el reporte toma los datos de ese archivo y no de la clase como tal. Gracias y un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *