Sie sind auf Seite 1von 7

Haciendo un reporteador con C# y Microsoft.

Reporting (por codigo)


OCTUBRE 29, 2010 6 COMENTARIOS

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.

Das könnte Ihnen auch gefallen