Crystal Reports – Como buscar uma imagem de arquivo para ser exibida no relatório
Autor: Fabiano Cores | Publicado: 2011-03-17T01:45:00-03:00

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: &nbsp;   Code Snippet   -- exec spcAmplaPedidoCompraImagem 3, 2685 alter proc spcAmplaPedidoCompraImagem     @cd_empresa int , @nr_pedido int &nbsp; as &nbsp;   declare @nr_documento int   declare @revisao int   declare @vcd_item char(13)   declare @vdocumento varchar(4000)   declare @sql varchar(8000)      -- ***************   -- SQL Burger 2011   -- Procedure que retorna as imagens provenientes de arquivos   -- para exibição em relatório crystal reports.   -- ***************      -- Inicio a montagem de uma query dinâmica, necessária para a execução   -- do comando bulkinsert com parâmetros dinâmicos, provenientes da tabela   -- que possui a localização dos arquivos.   select @sql = &#39; &nbsp;   create table #tmpImagem (imagem image)      &#39;      -- Insiro em uma tabela auxiliar todos os itens do pedido de compra   -- para verificar quais possuem documentos que deverão ser impressos   -- junto com o pedido.   create table #tmpItem (cd_item char(13) collate database_Default null)      insert into #tmpItem     select cd_item from pedidocitem      where cd_empresa = @cd_empresa        and nr_pedido = @nr_pedido           insert into #tmpItem     select cd_item from AdhEPTRomaneioPedidoCompra      where cd_empresa = @cd_empresa        and nr_pedido = @nr_pedido           -- Faço join da tabela temporária de itens com a de documentos   -- configurados a serem impressos nos pedidos de compra, e valido   -- se o arquivo está ativo e dentro da validade.   declare cp1 cursor local fast_forward read_only for     select distinct a.cd_item, b.documento       from #tmpItem a, itemdocumentorev b      where a.cd_item = b.cd_item        and b.imprime_pc = &#39;S&#39;        and b.cd_situacao = &#39;A&#39; -- ativos apenas        and b.dt_validade &gt;= convert(char(10), getdate(), 120)      order by a.cd_Item           open cp1      while 1 = 1   begin     fetch next from cp1 into @vcd_item, @vdocumento     if @@fetch_status &lt;&gt; 0 break          -- Para cada arquivo retornado, monto na query dinâmica o comando bulk insert     -- que irá inserir o stream da imagem na tabela #tmpImagem, criada no começo     -- do procedimento.     select @sql = @sql + &#39;  insert into #tmpImagem (imagem)       select Bulkcolumn          from OPENROWSET(                BULK N&#39;&#39;&#39; + rtrim(@vdocumento) + &#39;&#39;&#39;, SINGLE_BLOB                        ) as picture           &#39;      end   close cp1   deallocate cp1      -- No final, retorno as imagens.   select @sql = @sql + &#39;        select imagem from #tmpImagem        &#39;      -- Executo a query dinâmica   exec (@sql)     &nbsp; A string que contem a query dinâmica (@sql) foi executada da seguinte forma: &nbsp;   Code Snippet   create table #tmpImagem (imagem image) &nbsp;   insert into #tmpImagem (imagem)     select Bulkcolumn        from OPENROWSET(              BULK N&#39;C:&#92;MSSQL&#92;Novo&#92;4002-109 Base Fixação Encoder0001.jpg&#39;, SINGLE_BLOB                      ) as picture           insert into #tmpImagem (imagem)     select Bulkcolumn        from OPENROWSET(              BULK N&#39;C:&#92;MSSQL&#92;Novo&#92;4004-057 Suporte Sensor Ótico0001.jpg&#39;, SINGLE_BLOB                      ) as picture           insert into #tmpImagem (imagem)     select Bulkcolumn        from OPENROWSET(              BULK N&#39;C:&#92;MSSQL&#92;Novo&#92;4004-061 Suporte Direito Bandeja0001.jpg&#39;, SINGLE_BLOB                      ) as picture           insert into #tmpImagem (imagem)     select Bulkcolumn        from OPENROWSET(              BULK N&#39;C:&#92;MSSQL&#92;Novo&#92;4004-064 Suporte Esquerdo Bandeja0001.jpg&#39;, SINGLE_BLOB                      ) as picture           insert into #tmpImagem (imagem)     select Bulkcolumn        from OPENROWSET(              BULK N&#39;C:&#92;MSSQL&#92;Novo&#92;4004-119B Placa Fixação Servo0001.jpg&#39;, SINGLE_BLOB                      ) as picture          &nbsp;   select imagem from #tmpImagem       &nbsp; 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: &nbsp;   &nbsp; Já no relatório crystal reports, ao importar esta coluna do tipo IMAGE, aparecerá no seu relatório: &nbsp;   &nbsp; Easy, don’t you think ? =) &nbsp; Até a próxima!!