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:
Preparar algumas imagens para exibir
Criar um dataset que suporta imagem
Criar um relatório que suporta dataset
carregar a imagem no dataset
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
'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