Haciendo un reporteador con C# y Microsoft.Reporting (por codigo)

Actualizacion:

Como he visto que se ha complicado en algo lo de los origenes de datos pues he creado esta aplicacion de ejemplo. Cosas que resaltar en este ejemplo es que los reportes deben de ubicarse en la carpeta donde se compila la aplicacion en el caso del ejemplo estan en “debug\reportes” si haces un deploy asegurate que tu instalador de la aplicacion copie esos archivos en la carpeta de la aplicacion, se puede mejorar la clase que muestra las reportes en el constructor y agregarle parametros para el titulo del formulario, el nombre del origen de datos, que como lo explico en el articulo es unico, pero se puede parametrizar y asi no tendrias que hacer que todos tus reportes usen el mismo nombre para el origen de datos en el caso de este ejemplo es “datareport” pero eso ya lo pueden hacer ustedes.

Descargar el Ejemplo

Venga que me toco hacer lo que mas detesto de los sistemas LOS REPORTES no por que no sepa hacerlo sino por que me molesta sobre manera la idea de estar cuadrando campos para impresion  y a eso hay que ponerle colorcitos y demas cosas que en verdad se me hace PERDIDA DE TIEMPO pero vamos a lo nuestro.

La idea era que se generen los reportes en base a una Lista tipada como mis sistemas solo funcionan con capas y trabajan con diferentes servidores de datos no podia hacerlo desde el asistente (mentira, si me ayudo el asistende de reportes del Microsoft.Reporting) bueno como lo hice:

Lo primero es que en cada clase de la capa de datos tengo una propiedad en la que guardo una lista tipada de la clase de datos ejem. List<Clientes> LstDatos = new List<clientes>(); y tambien tengo un metodo que se encarga de llenar la lista y bueno con esa lista es que queria hacer los reportes pues el del CystalReport no me funciono (bueno no lo intente mucho por el problema de licencias y a demas de la instalacion), lo primero crear el reporte con VS asi que ha hacerlo:

Antes que nada los que ya saben como usar el asistente pues vayan mas abajo (asi no se aburren)

Boton derecho del mouse en el proyecto y decirle nuevo elemento (si estoy usando ahora VS2008) y de alli a reporting y a usar el asistente como la imagen:

Ahora a elegir el asistente:

Ahora biene lo bueno lo de la data, pues alli nos muestra las opcines de conectar al origen de datos, nosotros queremos que se conecte a nuestros objetos asi que venga elejimos objeto:

De alli nos va amostrar las clases de nuestro proyecto (a esta capa por mal habito siempre la he tendido a llamar capa de negocios asi que me disculparan los puristas del POO) y elegimos la clase (en este caso le pinche sobre BCliente)

Luego de eso te va a pedir una confirmacion y le das a finalizar, continuas ya con el asistente del reporte donde te muestra los datasources que haz puesto (si es laprimera vez pues solo muestra uno pero sino te va mostrando varios), en micaso tengo varios pues he hecho otros reportes (todos tienen el mismo nombre el motivo lo explico despues) y alli eliges el origen de datos que agregastes (a mi todos me salen con el mismo nombre asi no me queda mas que buscar cuales que contiene los campos y asi me doy cuenta cual es, se que es un error y peor para el que vaya a hacer mantto a esta aplicacion pero asi esta “por ahora”)

Una vez seleccionado el origen pues ya solo queda lo de siempre de los reportes el formato que va usar el asistente:

En la pantalla siguiente es donde elegimos los campos y donde se muestran, tenga bien en cuenta la seccion de detalle y la agrupacion (se que deberia de haver jalado el nombre de la agencia y no el ID, pero eso se puede arreglar desde la capa y hacer que cuando genere la lista la ponga pero no es mi objetivo en este momento).

Ya siguen las dos pantallas en la siguiente marco siempre que hay grupos “Habilitar Obtencion de detalles” la de subtotales solo si hay valores que totalizar (si fuese de facturas pues ni modo)

Y en la ultima el disenho:

Despues de esto quedamos con el reporte generado:

Ahora si lo bueno, el codigo que voy a usar, pues lo primero he desechado la idea de que los reportes jalen del proceso en el servidor (pues no pienso usar reportin services ya Sqlserver Express no lo implementa) asi que usar localreporting venga lo primero hay que crear el formulario donde mostraremos los reportes (digo reportes por que voy a hacer un solo form para todos los repotes)  este formulario lo unico que tiene como objeto es el ReportViewner que esta en forma dock en el formulario asi ocupa todo el form.

Aqui se muestra que esta enlazado a un reporte pero en si no es importante lo pueden dejar vacio ya que el enlace lo vamos a hacer por codigo.

En cuanto al codigo pues lo primero es agregar el espacio de nombres Microsoft.Reporting.WinForms que trae las definiciones de clases que nos interesan para hacer que nuestro reporte funcione.

Ya cone sto tenemos pero tenemos que hacer algunas cosas de programacion, voy a tener dos propiedades en mi formulario una donde va el nombre del reporte y su ruta y la otra el objeto de datos que voy a enlzar al reporte, uno de los motivos que elegi la manera local de los reportes es la capacidad de tenerlos en la maquina y en una ruta especifica y asi poder manipularlos (disenho) sin que tenga que tocar el codigo de la aplicacion, pues decido poner todos los reportes en una carpeta que este dentro de la carpeta donde ejecuto el sistema llamada “reportes” y para llamarlos es sencillo usando Application.StartupPath obtengo la ruta desde donde se esta ejecutando el sistema (asi pueden instalarlo donde les de la gana) y luego le sumo el nombre del reporte que es pasado como paramatro en el constructor del formulario, lo segundo es el parametro del objeto de datos que en este caso es simplemente de tipo object y no necesitamos mas.

Ahora ha ver el condenado codigo para genera los reportes:

Lo primero decirle al reportviewer que vamos a modo local
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
Ahora la ruta de nuestro reporte:
this.reportViewer1.LocalReport.ReportPath = rptact;

Ahora tenemos por oblicacion crear un Objeto de tipo ReportDataSource para poder alli poner nuestros datos:
ReportDataSource datos = new ReportDataSource();

Ya queda poco, al objeto datos le voy a colocar los valores, primero el nombre que tiene que ser el nombre del datasource original que le pusimos al generar el reporte (el nombre del objetillo ese que es nuestro origen de datos el del asistente) y a este ele enlzamos el objeto que pasamos coo parametro en el Valor:
datos.Name = “LstDatos”;
datos.Value = this.lst;

Voya alimpiar los datasources del reporte:
this.reportViewer1.LocalReport.DataSources.Clear();

Le voy a adiconar al origend e datos del reporte mi objeto datos:
this.reportViewer1.LocalReport.DataSources.Add(datos);

Hacemos un refresh a nuestro reporte y luego ya solo enlazar
this.reportViewer1.RefreshReport();

Con eso ya tiene para mostar el reporte, ahora viene el porque todos mis objetos van a delvolver el mismo nombre de objeto pues por comodidad mia asi no tengo que tocar este valor en el objeto datos, siempre se llama LstDatos y no me molesto, claro esta se podria crear un tercer parametro en el constructor de la clase del form con este valor y tambien funcionaria, el como generamos nuestro objeto de datos es cosa de quie llama a este form en mi caso y voy a pegar el codigo talcual esta en mi proyecto:

BProducto reserva = new BProducto(shg.Properties.Settings.Default.usuario,
shg.Properties.Settings.Default.clave,
shg.Properties.Settings.Default.servidor,
shg.Properties.Settings.Default.puerto,
shg.Properties.Settings.Default.tiposervidor);
reserva.DevAlist();
reportes rpt = new reportes(“Report2.rdlc”,reserva.LstDatos);
rpt.Show();

Como ven aqui primero lleno el objto antes de mandarlo y cuando llamo al form le doy el nombre del reporte y luego el objeto lleno con los datos

Hasta aqui llegamos.

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: , , , , , , , , , ,
Publicado en c#
11 comments on “Haciendo un reporteador con C# y Microsoft.Reporting (por codigo)
  1. Carlos dice:

    Hola, me gustó tu ejemplo,pero ¿cómo hago para pasar parámetros de consulta dinámica?

    • xmeele dice:

      Digamos que quieres que salga entre un rango de fechas o solo cierto tipo de datos (filtrar), lo podrias hacer desde la generacion del objeto de datos en si el reporte solo muestra los datos que tu deseas mostar y que han sido llenado anteriormente en el objeto de datos. casi siempre implemento un formulario desde el cual el usuariollena los parametros que desea y alli realizo las operaciones necesarias con la data hasta que tenga el conjunto de datos que necesito, lleno el objeto y recien llamo al reporte. No veo opcion para pasarle parametros al reporte, claro que existen y se puede pero por que dejar quelo haga el reporte si lo puedes hacer tu de forma que controlas todo el codigo.

  2. Jose dice:

    Hola he seguido tu ejemplo no he podido lograr que me funciones, me sale el siguiente mensaje:

    No se ha proporcionado ninguna instancia de origen de datos para el origen de datos “ListaExpedientes”

  3. Jorge dice:

    Muy buen tutorial…gracias por el aporte, pero :
    Me pasa lo mismo que a jose😦
    No se ha proporcionado ninguna instancia de origen de datos para el origen de datos “ListaExpedientes”
    Nos podrias ayudar con este detalle? gracias de antemano.

  4. boris dice:

    alguna ide tmb me paso lo mismo q a jose

  5. xmeele dice:

    he actualizado el articulo con un archivo de ejemplo que se puede descargar, esta echo en VS2010.

  6. Vegeta dice:

    Me sirvio mucho el ejemplo, dado que estoy sacando los datos de MYSQL por una red local y no podia hacer el enlace correctamente, gracias a este metodo lo logre, Salu2!!

  7. Faro de Luz dice:

    Estimado Xmeele:

    Soy profesor y administrador de una platafomra Moodle, la pregunta es ¿se puede integrar este reporteador a Moodle?

    Saludos,

    Faro de Luz

    • xmeele dice:

      La verdad no he usado moodle nunca pero de poder todo se debe de poder ahora la cosa es cuanto va a costar hacerlo, primero no sé que servidor de bases de datos usa, que sistema operativo usas para moodle ya que si usas linux no lo creo factible a menos que quieras tener otro servidor ejecutando Ms Windows ya que esta herramienta corre solo sobre servidores Windows, en fin existen muchos factores que se deberían de tomar en cuenta.

  8. Roymar dice:

    Que tal quisiera saber si me pueden ayudar
    Quisiera crear un diseñador de formatos es decir que el usuario pueda escoger los campos que saldran en el reporte y donde saldran no se como empezar me gustaria una guia no la solucion solo una guia de donde empezar para hacer algo asi lo he visto en otros sistemas mas que todo sistemas POS
    Agradezco cualquier ayuda

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 441 seguidores

Blog Stats
  • 304,391 hits
A %d blogueros les gusta esto: