GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Oracle Forms 10 G – 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.

1
1
1

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


Abraço

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.