Como exibir imagem no navegador pelo Oracle Forms Builder
Neste caso o cliente necessitava que as saídas geradas pelo Oracle Reports fossem gravadas em uma tabela, criando-se um histórico de emissões, e fossem visualizadas pelo usuário em tela.
Primeiro passo foi converter a extensão .pdf gerado pelo Oracle Reports em imagem BLOB. Criar uma função para gravar a tabela de histórico.
CREATE OR REPLACE FUNCTION AET_UNA_WRITE_OUTFILE_REQUEST(p_historico_emissao_data date
,p_request_id number
,p_empresa_id number
,p_data_emissao date
,p_emp_ar_location_segment_id number
,p_produto_id number
,p_und_transporte_id number
,p_und_ar_location_segment_id number
,p_veiculo_marca_id number
,p_veiculo_modelo_id number
,p_user_id number)return varchar2 is
v_indice number;
v_path varchar2(300);
v_directory_name varchar2(100):=null;
v_outfile_name varchar2(300);
v_arquivo_blob BLOB;
v_arquivo_bfile BFILE;
v_length NUMBER:= 0;
v_d_offset number:=1;
v_s_offset number:=1;
v_outfile_node_name varchar2(100);
cursor c_directories(p_path varchar2)is
select directory_name
from ALL_DIRECTORIES
where directory_path = p_path;
v_reg c_directories%rowtype;
begin
begin
select outfile_name,
substr(fcr.outfile_name, 1,instr(fcr.outfile_name,'/',-1)-1),
fcr.outfile_node_name
into v_outfile_name,
v_path,
v_outfile_node_name
from APPS.FND_CONCURRENT_PROGRAMS FCP,
APPS.FND_CONCURRENT_REQUESTS FCR
where fcp.concurrent_program_name ='AET_UNA_MOD709'
and fcr.concurrent_program_id = fcp.concurrent_program_id
and fcr.requested_by = p_user_id
and fcr.request_id = p_request_id
and fcr.outfile_name isnotnull;
exception
when no_data_found then
return('NÃO FOI ENCONTRADO ARQUIVO DE SAIDA, REQUEST_ID: '||p_request_id||' ,'||
'P_USER_ID: '||p_user_id||' - '||SQLERRM);
when too_many_rows then
return('MAS DE UMA LINHA RETORNADA NA RECUPERAÇÃO DO ARQUIVO DE SAIDA, REQUEST_ID: '||p_request_id||' ,'||
'P_USER_ID: '||p_user_id||' - '||SQLERRM);
when others then
return('ERRO NA RECUPERAÇÃO DO ARQUIVO DE SAIDA, REQUEST_ID: '||p_request_id||' ,'||
'P_USER_ID: '||p_user_id||' - '||SQLERRM);
end;
open c_directories(v_path);
loop
fetch c_directories into v_reg;
exit when c_directories%notfound;
v_directory_name := v_reg.directory_name;
exit;
end loop;
if v_directory_name is null then
return('NÃO FOI ENCONTRADO O OBJETO "DIRECTORY" COM O PATH: '||v_path);
end if;
begin
insert into apps.AET_UNA_HISTORICO_EMISSOES (user_id, --1
historico_emissao_id, --2
historico_emissao_data, --3
request_id, --4
empresa_id, --5
data_emissao, --6
emp_ar_location_segment_id,--7
produto_id, --8
und_transporte_id, --9
und_ar_location_segment_id,--10
veiculo_marca_id, --11
veiculo_modelo_id, --12
verso_id, --13
outfile_dir, --14
outfile_node_name --15
) --16
values(p_user_id, --1
AET_UNA_HISTORICO_EMISSOES_SQ.NEXTVAL, --2
p_historico_emissao_data, --3
p_request_id, --4
p_empresa_id, --5
p_data_emissao, --6
p_emp_ar_location_segment_id, --7
p_produto_id, --8
p_und_transporte_id, --9
p_und_ar_location_segment_id, --10
p_veiculo_marca_id, --11
p_veiculo_modelo_id, --12
NULL, --13
bfilename(v_directory_name,replace(v_outfile_name,v_path||'/','')),--14
v_outfile_node_name --15
); --16
commit;
exception
when others then
return('ERRO AO INSERIR A REFERÊNCIA AO ARQUIVO DE SAIDA: '||v_outfile_name||' '||SQLERRM);
end;
return('Y');
end;
Nesse ponto temos a tabela de histórico criada (AET_UNA_HISTORICO_EMISSOES), necessitamos apenas converter o arquivo do campo out OUTFILE_DIR do tipo BFILE em BLOB e gravá-lo no campo OUTFILE desta tabela. Para isso gerar uma procedure conforme abaixo, está procedure converte o arquivo usando a package do Oracle dbms_lob.
PROCEDURE XXX_AET_GRAVA_OUT_PRC(RETCODE IN NUMBER
,ERRBUF OUT VARCHAR2
)
IS
v_arquivo_blob blob;
v_arquivo_bfile bfile;
v_length number;
v_d_offset number:=1;
v_s_offset number:=1;
v_outfile_node_name varchar2(100);
CURSOR aet IS
SELECT*
FROM aet_una_historico_emissoes
WHERE outfile IS NULL;
BEGIN
FOR r1 IN aet LOOP
v_arquivo_blob :=NULL;
v_arquivo_bfile :=NULL;
v_length := 0;
v_d_offset :=1;
v_s_offset :=1;
v_outfile_node_name :=NULL;
begin
select outfile_dir
into v_arquivo_bfile
from apps.AET_UNA_HISTORICO_EMISSOES
where historico_emissao_id = r1.historico_emissao_id;
exception
when others THEN
raise_application_error(-20001,'ERRO AO RECUPERAR A REFERÊNCIA AO ARQUIVO DE SAIDA: '||' '||' '||SQLERRM);
end;
begin
v_length := dbms_lob.getlength(v_arquivo_bfile);
dbms_lob.fileopen(v_arquivo_bfile,dbms_lob.file_readonly);
dbms_lob.createtemporary(v_arquivo_blob,true,dbms_lob.session);
dbms_lob.loadblobfromfile(dest_lob => v_arquivo_blob,
src_bfile => v_arquivo_bfile,
amount => v_length,
dest_offset => v_d_offset,
src_offset => v_s_offset);
dbms_lob.close(v_arquivo_bfile);
exception
when others THEN
raise_application_error(-20002,'ERRO AO CONVERTER REFERENCIA AO ARQUIVO DE SAIDA PARA ARQUIVO EM BYTES: '||v_length||' '||SQLERRM);
end;
begin
update apps.AET_UNA_HISTORICO_EMISSOES
set outfile = v_arquivo_blob
where historico_emissao_id = r1.historico_emissao_id;
commit;
exception
when others THEN
raise_application_error(-20003,'ERRO AO ATUALIZAR A TABELA DE HISTORICO DE EMISSOES COM O ARQUIVO DE SAIDA EM BYTE: '||' '||' '||SQLERRM);
end;
END LOOP;
END;
Podemos verificar a tabela de histórico gerada com a imagem convertida, e então precisamos exibí-la no navegador do cliente. Para isso iremos verificar a configuração do DAD no banco de dados, caso não exista deve-se criá-la, usando o MOD_PLSQL que é um modulo de extensão da Oracle que roda no HTTP Server (Apache).
Siga os passos para a configuração:
1. Enterprise Manager -> Web Tier -> ohs1
2. Oracle HTTP Server (pull-down) –> Administração –> Configuração Avançada
3. Selecione o arquivo –> dads.conf
4. Dentro do arquivo configure da forma abaixo:
# ============================================================================
# mod_plsql DAD Configuration File
# ============================================================================
# 1. Please refer to dads.README for a description of this file
# ============================================================================
# Note: This file should typically be included in your plsql.conf file with
# the "include" directive.
# Hint: You can look at some sample DADs in the dads.README file
# ============================================================================
<Location /pls/HOMO>
SetHandler pls_handler
Order allow,deny
Allow from All
AllowOverride None
PlsqlDatabaseUsername APPS
PlsqlDatabasePassword Oracle4U
PlsqlDatabaseConnectString HOMO_GNA
PlsqlNLSLanguage AMERICAN_AMERICA.WE8ISO8859P1
PlsqlAuthenticationMode Basic
PlsqlDefaultPage read
</Location>
Você está adicionando o <Location> seção em seu arquivo dads.conf. O “HOMO” é o nome que você usará como referência para chamar este procedimento pelo Oracle Forms. O “APPS” é o esquema, os “Oracle4U” é a senha para esse esquema, o “HOMO_GNA” é o banco de dados que o procedimento armazenado está localizado e a “read” é um procedimento armazenado que você terá que criar com a finalidade de ler o arquivo.
5. Pressione o botão aplicar.
6. Executar o script dadTool.pl localizado em $ORACLE_HOME/bin (Este caminho foi feito no UNIX):
$> LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH
$> cd $ORACLE_HOME/bin
$> perl dadTool.pl -f /u01/app/oracle/middleware/asinst_1/config/OHS/ohs1/mod_plsql/dads.conf
7. Restartar o Oracle HTTP Server:
Enterprise Manager -> Web Tier -> ohs1
Oracle HTTP Server –> Control –> Shutdown
Oracle HTTP Server –> Control –> Start Up
Após configurado o DAD no servidor. É necessário criar uma package que irá passar por parâmetro enviado do forms o id do arquivo para leitura. Usando as packages nativas core do oracle OWA_UTIL, HTP e WPG_DOCLOAD.
CREATE OR REPLACE PACKAGE xxx_aet_pdf AUTHID CURRENT_USER AS
PROCEDURE xxx_aet_read_pdf(p_id_document IN number);
END xxx_aet_pdf;
/
CREATE OR REPLACE PACKAGE BODY xxx_aet_pdf AS
PROCEDURE xxx_aet_read_pdf(p_id_document IN number)IS
view_file blob;
BEGIN
SELECT outfile
into view_file
FROM apps.aet_una_historico_emissoes
WHERE historico_emissao_id = p_id_document;
OWA_UTIL.MIME_HEADER ('APPLICATION/PDF',FALSE);
HTP.P ('CONTENT-LENGTH: '|| DBMS_LOB.GETLENGTH (view_file));
OWA_UTIL.http_header_close;
WPG_DOCLOAD.download_file (view_file);
END xxx_aet_read_pdf;
END xxx_aet_pdf;
/
Com tudo finalizado, criar uma ação de WHEN-BUTTON-PRESSED no Oracle Forms.
Neste post você pode verificar um artigo prático e útil para visualização de arquivos através de uma ação do Oracle Forms usando MOD_PLSQL.
Referências
- http://docs.oracle.com/cd/B14099_19/web.1012/b14010/concept.htm
- http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm
- http://www.oracle.com/technetwork/developer-tools/forms/documentation/secure-webshowdoc-rep6i-133956.pdf
Abraço