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