domingo, 14 de noviembre de 2010

[Reporting Service] Campo Imagen desde un DataSet Tipado

 

Introducción


El siguiente ejemplo explica como vincular un campo imagen que se obtiene desde una base de datos.

En este caso se utiliza un reporte de Reporting Service en modo local, por eso se cuanta integrado al VS un archivo de extensión .rdlc

Definición de los datos


Para asignar los datos se ha creado un DataSet Tipado, con dos DataTable, uno que contendrá un campo que representa el logo de la compañía, el segundo DataTable tendrá los datos del listado.

 image

Definición del campo de imagen


Dentro del reporte se ubico un campo de imagen, pero para que este tome la información provista por el datatable debe definirse algunas propiedades

image

Las 3 dentro de la sección “Data” son las que deben tener nuestra atención.

La propiedad Source debe asignarse como “Database” para que tome la info del datatable, y es recomendable además asignar el MiMeType para que sepa con que formato vendrá la imagen.

Pero la propiedad algo mas compleja de definir es “Value”, ya que esta requiere de una expression

image

Se puede hacer uso de la ventana que ayude con esta tarea:

image

En este caso se seleccionando del primer Data Source de Empresa el campo de Logo, pero se hará uso de método First() para tomar solo un valor del mismo, ya que la imagen es solo una.

 

[C#] 
[VB.NET] 

37 comentarios:

  1. Hola:

    Me da error porque no encuentra la clase "microsoft.reporting.winforms", no se si esta clase es privada o viene con el visual studio.

    Un Saludo.
    Juan Carlos

    ResponderEliminar
  2. Perdona la clase que da error es:

    ReportDataSource

    Y

    Microsoft.Reporting.WinForms.ReportViewer

    ResponderEliminar
  3. hola Euroasesor

    Que raro esto que comentas

    Has podido verificar que el proyecto tengas la referencias de forma correcta ?
    o sea cuando abres el codigo, y vas a la parte de referencia del proyecto, puede ver que no falte ninguna, si ves que falta esta en particulas agregala.

    Que distribucion del VS estas utilziando, es acosa una verison express ? lo pregunto porque hasta dodne se esta no puede hacer uso de Reporting

    saludos

    ResponderEliminar
  4. Buenas Noches Leandro.
    Tenía un tiempo que no entraba a su blog y me entero de su nombramiento alcanzado. Lo felicito por ese logro tan importante y suyo. Un motivo mas para seguir adelante con lo que ya viene haciendo...

    Bueno, ahora le planteo lo sig.: Estoy usando: Visual Studio 2010 Ultimatum en Inglés y recien lo configuré para trabajar con Firebird 2.5, FirebirdDDEXProvider-2.0.5 y NETProvider-2.6.0, seguí la configuración y me funciona pudiendo manejar la bd desde el server explorer. Además he creado un dataset con un tableadapter alm cual le he creado 3 consultas y todo bien. El Problema: Cuando intento crear una cuarta consulta usando parametros y Error... Visual studio ha encontrado un error y necesita cerrarse. He investigado y he probado muchas opciones. Instale visual en otra partición hice nuevamente la configuracion de firebird y el problema sigue igual. Lo último que probe fue que en la 3 consulta la modifiqué incluyendo la consulta 4 con un and funcionó. Al parecer no funciona con una cuarta consulta sobre el mismo tableadapter. Agradezcon tu atención.. Gracias.

    ResponderEliminar
  5. Hola se que este post es muy viejo ya pero ando trabajando con esto y no me sale la imagen solo sale una X roja, las imagenes las saco de una carpeta que tengo, las convierto en byte[] y la meto en un datatable pero a la hora de enviarlo al reporte RDLC solo me sale una X roja. podria alguien ayudarme por fevor, gracias y disculpen el que publique en un post tan viejo D:

    ResponderEliminar
  6. hola Pedro

    el resto que envias en el datatable si se visualizan en el reporte ?


    saludos

    ResponderEliminar
  7. si todo lo demas se muestra pero la imagen no, ya puse el campo de la imagen en tipo byte(), pero no me muestra la imagen mas los datos si los envia.

    me parese raro ya que si utilizo un DataGridview con un campo tipo imagen y le cargo el arreglo de byte si me muestra la imagen pero al enviarla al reporte no me muestra nada.

    por ahora utilice la opcion de ponerla como externa y cargando la direccion de la imagen como File: URLdeimagen

    ResponderEliminar
  8. hola Pedro

    validaste que el campo de imagen tenga la formula correcta que se vincule a ese campo de imagen ?

    valida tambien combo de source que defines

    imagen

    prueba usando el que dice "database", valida correctamente el tipo de imagen, si asignas un gif pero defines un jpg quizas no funcione

    saludos

    ResponderEliminar
  9. si tenia todo asi pero ya lo solucione, era error mio, al meterlo al datatable se convertia a string, por que ? no lo se solo elimine el datatable y lo cree de nuevo y todo bien jeje, gracias por la ayuda

    ResponderEliminar
  10. hola Pedro

    la verdad esta muy raro lo que comentas, si el campo lo defines como byte array no veo que deba asignarse como string
    es mas si insertas deberia fallar por la diferencia de tipos

    saludos

    ResponderEliminar
  11. al crearlo lo cree por error en string mas despues lo cambie a arreglo de bytes. supongo que ahi algo fallo al hacer el cambio, y la verdad no se que fuese peor al borrarlo y crearlo de nuevo ya me mostro todo bien.

    ResponderEliminar
  12. Disculpa, pero no veo las imágenes. Ni en Explorer 9, ni en Chrome.

    ResponderEliminar
  13. hola Marta

    que raro yo accedo con IE8 y Firefox y veo las imagenes perfectamente


    saludos

    ResponderEliminar
  14. en IE creo que va a ser que lo tienes que iniciar sin los complementos, almenos eso me pasaba a mi antes, por eso cambie a chrome.

    ResponderEliminar
  15. Que tal lenadro, como se pueden desplagar dos o mas imagenes? o que expresion se utilizaria para desplegarlas?

    ResponderEliminar
  16. hola Erwin

    la tecnica para mostrar uno o mas imagenes es la misma

    defines un campo que sea un byte array en el datatable del dataset tipado y asignas la imagen alli

    ya sea que lo tomes de una db, o lo cargues de un archivo, pero se aplica la misma tecnica que para una sola imagen

    saludos

    ResponderEliminar
  17. Hola Leandro,
    Gracias por el artículo estaba necesitando esto...
    Pero estaba intentando agregar más Campos Integrados que por defectos ya están en la Carpeta de Built-in Fields(Campos integrados), he estado intentando buscarle la forma para poder agregar al informe como por ejemplo que usuario está Logeado en la Aplicación, y algunas otras cosas más. Lamentablemente cuando le doy click direcho al Campos Integrados, no me aparece ninguna lista desplegable de opciones y por tanto no hay forma de agregar otros campos personalizados.
    No sé si supieras de alguna forma agregar campos con datos escogidos al reporte.
    Espero tu respuesta. Gracias.
    Un Abrazo.

    ResponderEliminar
  18. hola Miguel

    la verdad no se si entendi el planteo

    pero si quieres pasarle datos adicionales al reporte porque no lo haces por medio de parametros

    saludos

    ResponderEliminar
  19. Hola Leandro,
    pues mi intención era la siguiente, en mi programa tengo un formulario de Login, y cuando esté accede al programa e intente sacar un reporte, me gustaría que el Usuario que está logeado, aparezca en el reporte.
    Intentaré con eso de los parámetros que en realidad no he usado eso aún.
    Gracias por el dato.
    Te agradecería si la idea se hizo más clara, y si pudieras decirme si con los parámetros es una buena opción hacer lo que pretendo.
    Muchas gracias.

    ResponderEliminar
  20. hola Miguel

    claro si la idea es enviar al reporte informacion simple puedes usar parametros

    o sea le asignas los datos por un lado he informacion simpel para mostrar por parametros, el usuario que esta autenticado es valido enviarlo de esta forma

    saludos

    ResponderEliminar
  21. Hola Leandro,
    Si bien logre mandar la información de 2 tablas a un informe por medio de un parámetro, el parámetro es el Texto de un TextBox. Sin embargo a lo que yo apuntaba era a lo siguiente: si de forma independiente osea fuera del informe que se carga con los DataSet, se pudiera jalar algun campo de una Tabla, por ejemplo de la Tabla Usuarios que tengo en mi BDD, jalar el Nombre del Usuario que se haya logeado.
    En el Diseño del Reporte, te dan parámetros ya definidos(creo que asi se llaman) como por ejemplo el n° de paginas en total, el usuario(el nombre de la pc), la fecha que se ha generado el informe y otros... a mi me gustaría poder agregar al informe el Usuario que esté conectado y que haya generado el informe. En crystal report si es viable, sino me equivoco, sin embargo mi programa lo tengo desarrolado con VS 2013, y aún no sacan un CR compatible con esa versión.
    Espero puedas corregirme (y sobre todo que me hayas entendido)si en caso lo que estoy pretendiendo es viable con el Report Viewer.
    Muchas gracias.

    ResponderEliminar
  22. hola Miguel

    pero en reporting service puedes definir tus propios parametros

    http://social.msdn.microsoft.com/Forums/es-ES/83fb8060-b0ff-4927-a46b-224c44d1a8f2/pasar-argumentos-a-reporte-rdlc?forum=vcses

    http://social.msdn.microsoft.com/Forums/es-ES/50ce97cd-238b-49e9-8275-b132d9c092a6/parametros-en-un-rdlc?forum=vbes

    como veras usarias
    ReportViewer1.LocalReport.SetParameters(parametros)
    para asignar el parametro

    saludos

    ResponderEliminar
  23. Hola Leandro,
    Si! Esa es!
    Gracias por la ayuda.
    Un abrazo.

    ResponderEliminar
  24. disculpa la molestia pero como se manda la imagen al datset esque soy un novato y apenas voy empezando con esto del c#

    ResponderEliminar
  25. Que tal Leandro
    he tenido unos problemas al mostrar una imagen de mi base de datos, cuando lo intento mostrar en el reporte rldc solo me sale una X roja, desconozco como es la formcorrecta de mostrarlo en c#,
    por favor si me puedes ayudar en la solucion.

    ResponderEliminar
  26. hola perdon estoy tratando de hacer precisamente esto, del titulo.

    Mande la imagen a la BD como tipo LONGBLOB con las conversiones pertinentes, logico en el form hago la inversion y se muestra.
    en si no pido mucha ayuda solo si tienes nuevamente el zip para ver el codigo.

    ya he mandado todos los datos al reporte solo me falta la imagen, ya sea a un campo blob, imagen, o oeobject.

    Gracias

    ResponderEliminar
  27. hola Legna

    que base de datos utilizas ?

    porque en principio serie recuperar los datos por medio de una query y el campo castearlo a byte[] para poder usar la imagen

    saludos

    ResponderEliminar
  28. Gracias por la ayuda, me resuelve una parte pero me da el siguiente error: "Error 1 The call is ambiguous between the following methods or properties: 'Microsoft.Reporting.WinForms.ReportDataSource.ReportDataSource(string, System.Collections.IEnumerable)' and 'Microsoft.Reporting.WinForms.ReportDataSource.ReportDataSource(string, System.Data.DataTable)' C:\Users\Roberto\Desktop\New folder (2)\[csharp] ReportingImage\ReportingImage\Form1.cs 27 50 ReportingImage
    "

    ResponderEliminar
  29. hola

    que tipo de dato estas asignando el ReportDataSource() ? porque parece que por los parametros no puede resolver que metodo debe llamar

    saludos

    ResponderEliminar
  30. mucho gusto y siempre siguiendo sus publicaciones. Pero si lo que deseo es cargar las imágenes desde un byte[]? como podría hacerlo?

    ResponderEliminar
    Respuestas
    1. hola David

      Podrias hacer uso del File.ReadAllBytes("ruta") para obtener el byte[] del archivo y asignarlo al campo del datatable que vinculas al reporte

      saludos

      Eliminar
  31. Mi estimado... Me parece excelete tu trabajo... q es de ayuda para nosotros. Y te voy a ayudar con algunas convenientes que se producen al convertir tu proyecto con el asistente de Visual Studio crea algunos errores. Y toca volver a eliminar y volver a asignar las referencias y en el caso del inconveniente de una llamada ambigua en el esta linea de codigo.
    ReportDataSource dataSourceEmpresa = new ReportDataSource("Productos_Empresa", LogoEmpresa());
    la solucion consiste en agregar (DataTable)
    ReportDataSource dataSourceEmpresa = new ReportDataSource("Productos_Empresa", (DataTable) LogoEmpresa());


    Sigue Adelante.....

    ResponderEliminar
  32. muchas gracias de gran utilidad el ejemplo

    ResponderEliminar
  33. Buenos Días Leandro, tengo un campo de imagen en access 2003, cuando intento colocarla en un picturebox de Reportviewer, no se vizualiza, hice todos los pasos que nos diste pero no me funciona.

    ResponderEliminar
    Respuestas
    1. hola
      Imagino defines un dataset como origen de datos de reporte, no? si es asi estas validando que en el campo se asigne el array de byte de la imagen que quieres visualizar?
      saludos

      Eliminar
  34. leandro, tengo una pregunta, si tenemos las imágenes en "Content/Photos" y deseo mostrarla en un reporte "Reporte.rdcl", y la ruta la almaceno en Base de Datos, la ruta se guardar asi: "~/Content/Photos/NombreImagen.jpg" ¿como lo muestro en el reporte rdlc? tienes u ejemplo?
    gracias...

    ResponderEliminar
    Respuestas
    1. hola
      Deberias enviar la imagen junto con los datos del reporte

      Analiza este mismo ejemplo como lo realizo con el logo, debes definir un datatable donde poder definir un campo del tipo Image y alli insertar el byte[] de la imagen

      Usarias el File.ReadAllBytes() para recuperar el byte[] de la imagen desde su path fisico

      saluos

      Eliminar