You are on page 1of 5

VB.

NET - Carregando Imagens dinâmicas no


Crystal Reports

Trabalhar com imagens em relatórios do Crystal Reports sempre foi uma dor de cabeça. Simplesmente ,
dependendo da versão, não havia suporte para realizar determinada tarefa. A partir da versão 11, o
Crystal Reports passou suportar a carga dinâmica de imagens.

A versão que acompanha o VS.NET 2003 ainda não traz este recurso mas podemos contornar a situação
usando um truque. Vamos usar um dataset e definir um campo do tipo base64Binary que irá receber a
imagem como um stream de bytes. A conversão da imagem para um stream de bytes é feita por uma
rotina para cada imagem usando as classes do namespace System.IO.

Então para você não ficar quebrando a cabeça a toa, o exemplo mostrado aqui somente vai funcionar se
você tiver o Visual Studio .NET 2003/2005. Você pode usar uma versão separada do Crystal para criar o
relatório mas ela tem que suportar datasets.

As tarefas que iremos realizar são:

1. Preparar algumas imagens para exibir


2. Criar um dataset que suporta imagem
3. Criar um relatório que suporta dataset
4. carregar a imagem no dataset
5. usar o dataset como fonte de dados para o relatório e exibir a imagem no visualizador de relatórios

Crie um novo projeto no VS.NET 2003 com o nome de relatorioBandasFamosas (este nome vem do fato
que eu vou exibir imagens de algumas bandas de rock)

2- Criar uma dataset que suporta imagem

- Clique com o botão direito do


mouse sobre o nome do projeto
e selecione a opção Add->Add
New Item selecionando o item
DataSet;

- Informe o nome
dsBandasFamosas.xsd para o
dataset;

- A seguir defina a estrutura do


dataset com dois campos: Name
e Photo. O importante é que o
tipo de dados do campo Photo
deve ser base64Binary.

3- Criar um relatório que suporta dataset


- Clique com o botão direito do
mouse sobre o nome do projeto
e selecione a opção Add->Add
New Item e a seguir selecione
o item Crystal Report;

- Informe o nome
rptBandasFamosas.rpt ;

- Clique com o botão direito do


mouse sobre o relatório e
selecione a opção DataBase e a
seguir Add/Remove DataBase

A seguir na janela DataBase Expert selecione em Project Data -> ADO.NET DataSets e marque o datset
que foi criado no projeto selecionando a seguir a tabela usando o botão com as duas setas conforme
figura abaixo:

Crie o relatório usando os campos definidos no dataset conforme figura abaixo:


- Inclui um
campo
Picture no
relatório
para exibir
a imagem
do logotipo
do site.

- Para fazer
isto clique
com o botão
direito
sobre o
local onde
deseja
incluir a
imagem e
selecione :
Insert ->
Picture
Vamos voltar para o formulário padrão form1.vb e alterar seu nome para frmBandasFamosas.vb. A
seguir inclua no formulário um componente CrystalReportViewer e um botão de comando - Button -
conforme figura abaixo:

Finalmente no evento Click do botão de comando inclua o seguinte código:

Private Sub btnLoadImage_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnCarregaImagem.Click

Dim ofdImagem As New OpenFileDialog

If ofdImagem.ShowDialog = DialogResult.OK Then


Try
'Cria uma nova instância do dataset
Dim dsBandas As New dsBandasFamosas

'Cria uma nova instância do relatório


Dim rptBandas As New rptBandasFamosas

'Cria uma nova linha no dataset


Dim dr As dsBandasFamosas.ImageRow = dsBandas.Image.NewImageRow

'Define os elementos da linha


dr.Name = ofdImagem.FileName

'preenche o campo com o byte array


dr.Photo = carregaImagem(ofdImagem.FileName)

'Inclui a nova linha no dataset


dsBandas.Image.Rows.Add(dr)

'Usa o dataset como fonte de dados para o relatório


rptBandas.SetDataSource(dsBandas)

'Exibe o relatório no reportviewer


Me.crystalReportViewer1.ReportSource = rptBandas
Catch ex As Exception
'captura alguma exceção
MessageBox.Show("Alguma coisa deu errado, verifique... : " & ex.Message)
End Try
End If
End Sub
O código esta comentado explicando cada passo. Agora só falta incluir a rotina que irá dar o pulo do gato
carregando a imagem do disco como um stream de bytes:

Private Function carregaImagem(ByVal fileName As String) As Byte()

'Método para carregar uma imagem do disco e retorná-la como um byteStream


Dim fs As FileStream = New FileStream(fileName, FileMode.Open,
FileAccess.Read)

Dim br As BinaryReader = New BinaryReader(fs)

Return (br.ReadBytes(Convert.ToInt32(br.BaseStream.Length)))

End Function

Ao executar o projeto teremos como resultado:

Pegue o projeto completo aqui: dsImagemCrystal.zip

Até o próximo artigo...

José Carlos Macoratti

You might also like