martes, 22 de febrero de 2011

Limitar formatos de exportación en ReportViewer



Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.

 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.

Hola amigos, aqui les dejo una manera de limitar el número de formatos a exportar. En mi caso unicamente deseo que el usuario pueda exportar a PDF, deshabilitando la exportación a Excel y a Word
'primero debemos declarar estos imports en la página donde se encuentra el 'reportviewer
Imports Microsoft.Reporting.WebForms
Imports System.Reflection

'Después en la carga de la página ponemos la siguiente rutina
'barremos las extensiones de localreport, mi reportviewer se llama reportviewer1
For Each elemento As RenderingExtension In reportViewer1.LocalReport.ListRenderingExtensions
'ponemos la condición para entrar a poner falso la exportación a Excel y a Word
If elemento.Name = "Excel" Or elemento.Name = "WORD" Then
'traemos la información del campo con sus respectivos flags
Dim infCampo As FieldInfo = elemento.[GetType]().GetField("m_isVisible", BindingFlags.Instance Or BindingFlags.NonPublic)
'colocamos el valor de false a la extension
infCampo.SetValue(elemento, False)
End If
Next
'si conocen otra manera mas eficiente de hacer esto, no duden en compartirla

domingo, 13 de febrero de 2011

Reporte maestro-detalle



Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.

 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.
Reporte maestro-detalle
Hola amigos, esperando que estén bien, me permito hacer un pequeño instructivo para imprimir con detalles dentro del cuerpo de un reporte utilizando Visual Studio 2010, para una pagina web, Una alternativa es usar subreportes, pero me dio la impresión de que reduce el rendimiento por eso busque otra opción, esperando que sea útil, comenzamos y ya saben que cualquier mejora o comentario es bienvenido.
Supongamos que el encargado de una escuela nos pide un reporte que tiene que entregar cada cierto periodo de tiempo, con las actividades extraescolares que ha llevado a cabo cada alumno, que a su vez están asignados a determinados maestros. De tal manera que el reporte debería aparecer de la siguiente manera

Veran que no me he preocupado mucho de la presentación, ya que el objetivo es que vean como manejar los grupos para hacer que,, por ejemplo, los alumnos aparezcan en orden y con sus respectivas actividades, que es un caso muy común en muchos reportes.
Para desarrollar este enfoque consideraremos que tenemos tres tablas a las cuales vamos a unir con un Inner Join, si ya tienen sus tablas y su consulta, se pueden ir al final, para ver como manejar los grupos.
Primero creamos una tabla de maestros

Luego creamos una tabla de alumnos, tiene una clave que lo relaciona con el maestro


Luego creamos una tabla de cooperaciones por actividades tomadas por el alumno


Entramos a visual Studio y elegimos un proyecto web vacio
Creamos un folder llamado APP_CODE y dentro de este dos fólderes uno llamado BLL y OTRO DAL, los que serán la capa de negocios y capa de datos
NOTA, pretendía ocupar la capa de negocios, de hecho la hice, pero finalmente no la utilice, porque hubiera sido mas confuso y nos apartaríamos del punto principal, pero tomen en cuenta que siempre deben separar sus capas de datos de las de negocio.
Luego creamos un data set que se llamará DSActividad


Ahora nos posicionamos en el dataset DSactividad y seguimos los pasos siguientes:
Creamos la conexión a la base de datos, y la salvamos al web.config

Luego con ayuda del query builder, creamos nuestra consulta

Luego ponemos el nombre del método a: traedatosact

Finalmente el query seria como sigue, quitandos los nombre por default que pone el asistente, reemplazando por el nombre de cvemaestro2 etc

Seria este código:
SELECT maestros.cvemaestro, maestros.NombreMaestro, maestros.Direccion, maestros.Telefono, alumnos.cvealumno, alumnos.NombreAlumno,
alumnos.SalonAlum, alumnos.cvemaestro AS cvemaestro2, activalum.cvealumno AS cvealumno2, activalum.Costo, activalum.NombreActiv, activalum.cveactividad,
activalum.fechActividad
FROM maestros INNER JOIN
alumnos ON maestros.cvemaestro = alumnos.cvemaestro INNER JOIN
activalum ON alumnos.cvealumno = activalum.cvealumno
WHERE (maestros.cvemaestro = @cvemaestro)
ORDER BY cvealumno2
Despues nos vamos a nuestro reporte y añadimos un dataset
Nota:es un poco confuso esta parte, solo consideren que el nombre Dataset1, no es realmente un dataset sino mas bien su definición, la cual nos es dada por el dataset llamado Dsactividad, por lo tanto hay que recorder que a nuestro visor(reportviewer) , le tenemos que decir que objeto nos va a comunicar con los datos reales, ese objeto lo veremos posteriormente

Añadimos los datos del maestro a un encabezado u en el cuerpo del reporte ponemos una LISTA(una lista nos permite repetir esos datos a lo largo del reporte) y dentro de esa lista colocamos una TABLA (en esa tabla vendrán las actividades.


Esta parte que sigue, es la realmente importante: vemos que debajo de ROW GROUPS tenemos un grupo llamado cvealumno. ESTO QUIERE DECIR QUE TODOS LOS ALUMNoS QUE CORRESPONDAN A ESE MAESTRO SE DESPLEGARAN EN UN CUADRO, EN ESTE CASO SOLO METIMOS POCOS CAMPOS PERO PUEDEN SER BASTANTES
La forma de poner grupos es arrastrando desde “report data” el campo que deseamos que funcione como grupo

A continuación, vemos que la tabla tiene dos grupos, siendo un grupo con la clave del grupo principal(cvealumno2) y otro subgrupo cveactividad con las actividades Nota:es imporante el subgrupo de actividades de otra manera solo aparecerían los alumnos y no sus actividades.

Nota importante los campos en que están basados los grupos se pueden ocultar con los propiedades de visibilidad y para que no se vea vacio ese espacio los podemos reducir con las flechas de posición.
De tal manera que nuestro reporte aparecerá como al principio y si elegimos otro maestro, en este caso el 003 y le damos click a generar reporte nos aparece el siguiente reporte
El código que viene a continuación, lo podemos poner en el evento click para que nos vaya mostrando los diferentes maestros
ObjectDataSource1.SelectParameters("cvemaestro").DefaultValue = TxtBusqueda.Text

ReportViewer1.LocalReport.Refresh()


Notas adicionales, el objeto que nos sirve de comunicación con los datos u objetos de negocio es el ObjectDatSource el cual se enlaza con el reporteviewer de la siguiente manera:

Y el objectdatasource debe tener señalado de donde viene la información como vemos en el siguiente cuadro, en este caso lo traje directamente del datasetr, pero pudo haber sido a través de la capa de negocios, EN DONDE PUEDO PROGRAMAR Y PONER MUCHISIMAS CONDICIONES.

Y también debemos señalar el método que ocuparemos para traer la información

NOTA FINAL, SI El GRUPO NO TIENE ALGO EN COMUN CON EL OTRO ES PROBABLE QUE LES APAREZCA EL MENSAJE DE
Pueden descargar el fuente y la base de datos de aqui:
Descarga
“has a detail member with inner members. Detail members can only contain static inner members.” ESO SE DEBE A QUE NO ESTAN BIEN SUS GRUPOS o DEJARON EL GRUPO detalles que aparece por default visual studio cuando genera una tabla.
Bueno amigos, eso es todo, que estén bien.

http://www.scribd.com/doc/48735594/gruposdetalles
aqui pongo el enlace para que vean las imagenes