miércoles, diciembre 7, 2022

Mostrar Imágenes en Crystal Reports, al estilo de Galería

Descargar Solución ImagenesEnCrystalReports.zip

Para poder mostrar imágenes en Crysta Reports, estas tienen que estar convertidas a Byte, ya que no se puede cargar un formato .jpg o .gif directamente. Para poder hacer esto necesitamos una función que nos convierta estos formatos a el formato Byte que es el aceptado.

'Esta función convierte la imagen a Byte
Public Function ImageToByte(ByVal pImagen As Image) As Byte()
Dim mImage() As Byte
Try
If Not IsNothing(pImagen) Then
Dim ms As New System.IO.MemoryStream
pImagen.Save(ms, pImagen.RawFormat)
mImage = ms.GetBuffer
ms.Close()
Return mImage
End If
Catch
End Try
End Function

Un aspecto importante si vamos a tener almacenadas las fotos en la base de datos es tener la tabla correctamente creada, un ejemplo podría ser:

CREATE TABLE [TABLA_IMAGENES] (
[cod_imagen] [numeric] (3,0) NOT NULL,
[des_imagen] [numeric](3, 0) NOT NULL ,
[img_imagen] [image] NOT NULL ,
CONSTRAINT [SYS_C0010528] PRIMARY KEY CLUSTERED
(
[cod_imagen]
) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Para el reporte vamos a tener un dataset donde vamos a cargar los datos y enviarlo a Crystal. La tabla en el dataset debe ser creada con el siguiente código.

<xs:element name=»Imagenes»>
<xs:complexType>
<xs:sequence>
<xs:element name=»Codigo» msdata_Caption=»Codigo»
type=»xs:short» minOccurs=»0″ />
<xs:element name=»Descripcion»
type=»xs:string» minOccurs=»0″ />
<xs:element name=»Imagen» msdata_Caption=»Imagen»
type=»xs:base64Binary» minOccurs=»0″ />
</xs:sequence>
</xs:complexType>
</xs:element>

Para este ejemplo vamos a cargas las imágenes que tenemos en el disco duro, pero bien podría ser que tomemos las imágenes de la base de datos, o bien una combinación de los dos, por que en la base de datos podríamos tener almacenada solo el path del archivo en lugar de tener almacenada la imagen.

'Este ReturnDataSet es solo a modo de ejemplo,
'lo ideal es que el dataset sea el producto de alguna consulta a la base de datos,
'solo que para efectos del ejemplo creamos el dataset manualmente.
Private Function ReturnDataSet() As DataSet
Dim dt As New DataTable
Dim dr As DataRow
Dim ds As New DataSet

dt.Columns.Add(New DataColumn(«Codigo», GetType(Short)))
dt.Columns.Add(New DataColumn(«Descripcion», GetType(String)))
dt.Columns.Add(New DataColumn(«Imagen», GetType(Byte())))

dr = dt.NewRow()
dr(«Codigo») = 1
dr(«Descripcion») = «Imagen 1»
'Aqui leemos la imagen de nuestro disco duro.
dr(«Imagen») = ImageToByte(Image.FromFile(«..Imagen1.jpg»))
dt.Rows.Add(dr)

dr = dt.NewRow()
dr(«Codigo») = 2
dr(«Descripcion») = «Imagen 2»
dr(«Imagen») = ImageToByte(Image.FromFile(«..Imagen2.jpg»))
dt.Rows.Add(dr)

dr = dt.NewRow()
dr(«Codigo») = 3
dr(«Descripcion») = «Imagen 3»
dr(«Imagen») = ImageToByte(Image.FromFile(«..Imagen3.jpg»))
dt.Rows.Add(dr)

ds.Tables.Add(dt)
ds.Tables(0).TableName = «Imagenes»

Dim iDS As New dsImagenes
iDS.Merge(ds, False, System.Data.MissingSchemaAction.Ignore)
Return iDS
End Function

Y para asignarle el dataset al reporte de Crystal lo hacemos de la siguiente forma

rpt.Load()
rpt.SetDataSource(ReturnDataSet)
rpt.Refresh()

En el archivo que se puede descargar viene todo el ejemplo completo con las imágenes para que el ejemplo funcione perfectamente, y el resultado final debería verse así

Descargar Solución ImagenesEnCrystalReports.zip




Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub

Redes Sociales

2,736FansMe gusta
326SeguidoresSeguir

Popular esta semana

Flutter – Error: ADB exited with exit code 1

En este artículo vamos a explorar algunas posibles causas y solución al error en Flutter Error: ADB exited with exit code 1....
SQL Server - Merge

MERGE en SQL Server para Insert, Delete y Update con dos tablas

Ejemplo práctico usando MERGE para sincronizar dos tablas, Insert, Update y Delete en un solo query. Válido para SQL SERVER 2008 o superior.
SQL Server

DELETE con subconsulta o INNER JOIN

En el siguiente ejemplo se explica la forma en que se pueden eliminar registros en nuestras tablas en SQL Server con instrucciones...

Últimos artículos

Índices repetidos en SQL Server ¿Cómo encontrarlos?

Los índices en la base de datos SQL Server es una herramienta que nos ayuda a mejorar la respuesta de nuestras consultas,...
Flutter - Instagram Clone App

Instagram Clone App con Flutter

Marvin Stanley Valenzuela nos comparte un reto y genialidad a la vez, excelente práctica de la que podemos aprender mucho, diseñó en...

¿Cómo agregar una IP adicional en una VM Ubuntu en Azure?

Lo más común al momento de crear y configurar un nuevo servidor es que a este le asigne un solo IP, pero...
flutter one year

Después de un año con Flutter, esto es lo que aprendí

La historia comenzó cuando un día desperté pensando en tener un nuevo proyecto personal. Me dije a mí misma que hay muchas...