Pesquisar este blog

quinta-feira, 17 de março de 2011

Crystal Reports – Como buscar uma imagem de arquivo para ser exibida no relatório

Olá caros sqlnautas, gostaria de retornar aqui com mais uma dica importante sobre imagens no crystal reports. Imagine o seguinte cenário: você está montando um relatório em crystal reports que deverá exibir imagens que, ao invés de estarem armazenadas no banco de dados, estão em arquivos no disco rígido do servidor, e no banco de dados você só tem a localização deste arquivo, o que é muito comum, pois armazenar arquivos em banco de dados é extremamente desaconselhável quando se pensa em performance.

O que precisamos fazer, é utilizar uma ferramenta muito simples, chamada BULK INSERT. Este comando é utilizado para importar dados em massa provenientes de arquivos para o banco de dados. Mas nós não vamos armazenar esta imagens, e sim converter os arquivos de imagem em formato BLOB, ou image. O conceito é simples: realizo o bulk insert do arquivo dentro de uma tabela temporária, que retorna um select ao crystal reports com a coluna image da tabela:

 

Code Snippet
  1. -- exec spcAmplaPedidoCompraImagem 3, 2685
  2. alter proc spcAmplaPedidoCompraImagem  
  3.   @cd_empresa int
  4. , @nr_pedido int
  5.  
  6. as
  7.  
  8.   declare @nr_documento int
  9.   declare @revisao int
  10.   declare @vcd_item char(13)
  11.   declare @vdocumento varchar(4000)
  12.   declare @sql varchar(8000)
  13.   
  14.   -- ***************
  15.   -- SQL Burger 2011
  16.   -- Procedure que retorna as imagens provenientes de arquivos
  17.   -- para exibição em relatório crystal reports.
  18.   -- ***************
  19.   
  20.   -- Inicio a montagem de uma query dinâmica, necessária para a execução
  21.   -- do comando bulkinsert com parâmetros dinâmicos, provenientes da tabela
  22.   -- que possui a localização dos arquivos.
  23.   select @sql = '
  24.  
  25.   create table #tmpImagem (imagem image)
  26.   
  27.   '
  28.   
  29.   -- Insiro em uma tabela auxiliar todos os itens do pedido de compra
  30.   -- para verificar quais possuem documentos que deverão ser impressos
  31.   -- junto com o pedido.
  32.   create table #tmpItem (cd_item char(13) collate database_Default null)
  33.   
  34.   insert into #tmpItem
  35.     select cd_item from pedidocitem
  36.      where cd_empresa = @cd_empresa
  37.        and nr_pedido = @nr_pedido
  38.        
  39.   insert into #tmpItem
  40.     select cd_item from AdhEPTRomaneioPedidoCompra
  41.      where cd_empresa = @cd_empresa
  42.        and nr_pedido = @nr_pedido
  43.        
  44.   -- Faço join da tabela temporária de itens com a de documentos
  45.   -- configurados a serem impressos nos pedidos de compra, e valido
  46.   -- se o arquivo está ativo e dentro da validade.
  47.   declare cp1 cursor local fast_forward read_only for
  48.     select distinct a.cd_item, b.documento
  49.       from #tmpItem a, itemdocumentorev b
  50.      where a.cd_item = b.cd_item
  51.        and b.imprime_pc = 'S'
  52.        and b.cd_situacao = 'A' -- ativos apenas
  53.        and b.dt_validade >= convert(char(10), getdate(), 120)
  54.      order by a.cd_Item
  55.        
  56.   open cp1
  57.   
  58.   while 1 = 1
  59.   begin
  60.     fetch next from cp1 into @vcd_item, @vdocumento
  61.     if @@fetch_status <> 0 break
  62.     
  63.     -- Para cada arquivo retornado, monto na query dinâmica o comando bulk insert
  64.     -- que irá inserir o stream da imagem na tabela #tmpImagem, criada no começo
  65.     -- do procedimento.
  66.     select @sql = @sql + '  insert into #tmpImagem (imagem)
  67.       select Bulkcolumn
  68.         from OPENROWSET(
  69.                BULK N''' + rtrim(@vdocumento) + ''', SINGLE_BLOB
  70.                        ) as picture      
  71.     '
  72.   
  73.   end
  74.   close cp1
  75.   deallocate cp1
  76.   
  77.   -- No final, retorno as imagens.
  78.   select @sql = @sql + '
  79.   
  80.     select imagem from #tmpImagem
  81.     
  82.   '
  83.   
  84.   -- Executo a query dinâmica
  85.   exec (@sql)

 

A string que contem a query dinâmica (@sql) foi executada da seguinte forma:

 

Code Snippet
  1. create table #tmpImagem (imagem image)
  2.  
  3.   insert into #tmpImagem (imagem)
  4.     select Bulkcolumn
  5.       from OPENROWSET(
  6.              BULK N'C:\MSSQL\Novo\4002-109 Base Fixação Encoder0001.jpg', SINGLE_BLOB
  7.                      ) as picture      
  8.     insert into #tmpImagem (imagem)
  9.     select Bulkcolumn
  10.       from OPENROWSET(
  11.              BULK N'C:\MSSQL\Novo\4004-057 Suporte Sensor Ótico0001.jpg', SINGLE_BLOB
  12.                      ) as picture      
  13.     insert into #tmpImagem (imagem)
  14.     select Bulkcolumn
  15.       from OPENROWSET(
  16.              BULK N'C:\MSSQL\Novo\4004-061 Suporte Direito Bandeja0001.jpg', SINGLE_BLOB
  17.                      ) as picture      
  18.     insert into #tmpImagem (imagem)
  19.     select Bulkcolumn
  20.       from OPENROWSET(
  21.              BULK N'C:\MSSQL\Novo\4004-064 Suporte Esquerdo Bandeja0001.jpg', SINGLE_BLOB
  22.                      ) as picture      
  23.     insert into #tmpImagem (imagem)
  24.     select Bulkcolumn
  25.       from OPENROWSET(
  26.              BULK N'C:\MSSQL\Novo\4004-119B Placa Fixação Servo0001.jpg', SINGLE_BLOB
  27.                      ) as picture      
  28.   
  29.  
  30.   select imagem from #tmpImagem

 

Para cada arquivo, ele montou a string executando o bulk insert de cada imagem. No final, o select retornando as imagens da temporária. O resultado do procedimento, via query no SQL Server:

 

image

 

Já no relatório crystal reports, ao importar esta coluna do tipo IMAGE, aparecerá no seu relatório:

 

image

 

Easy, don’t you think ? =)

 

Até a próxima!!