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:
- -- exec spcAmplaPedidoCompraImagem 3, 2685
- alter proc spcAmplaPedidoCompraImagem
- @cd_empresa int
- , @nr_pedido int
- as
- 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 = '
- create table #tmpImagem (imagem image)
- '
- -- 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 = 'S'
- and b.cd_situacao = 'A' -- ativos apenas
- and b.dt_validade >= 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 <> 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 + ' insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N''' + rtrim(@vdocumento) + ''', SINGLE_BLOB
- ) as picture
- '
- end
- close cp1
- deallocate cp1
- -- No final, retorno as imagens.
- select @sql = @sql + '
- select imagem from #tmpImagem
- '
- -- Executo a query dinâmica
- exec (@sql)
A string que contem a query dinâmica (@sql) foi executada da seguinte forma:
- create table #tmpImagem (imagem image)
- insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N'C:\MSSQL\Novo\4002-109 Base Fixação Encoder0001.jpg', SINGLE_BLOB
- ) as picture
- insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N'C:\MSSQL\Novo\4004-057 Suporte Sensor Ótico0001.jpg', SINGLE_BLOB
- ) as picture
- insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N'C:\MSSQL\Novo\4004-061 Suporte Direito Bandeja0001.jpg', SINGLE_BLOB
- ) as picture
- insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N'C:\MSSQL\Novo\4004-064 Suporte Esquerdo Bandeja0001.jpg', SINGLE_BLOB
- ) as picture
- insert into #tmpImagem (imagem)
- select Bulkcolumn
- from OPENROWSET(
- BULK N'C:\MSSQL\Novo\4004-119B Placa Fixação Servo0001.jpg', SINGLE_BLOB
- ) as picture
- 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:
Já no relatório crystal reports, ao importar esta coluna do tipo IMAGE, aparecerá no seu relatório:
Easy, don’t you think ? =)
Até a próxima!!