Exportar resultado de um bloco para uma o planilha

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Boa tarde senhores,
venho através deste post compartilhar um componente criado que pode ser utilizado em qualquer aplicação.
Basta importar as progamunits.
Esta procedure é utilizada para exportar exatamente as informações resultantes de um bloco para um arquivo CSV.
Segue a procedure:

Selecionar tudo

PROCEDURE prc_exporta_dados_planilha(par_nm_bloco varchar2, par_apenas_itens_visiveis boolean) IS
  va_current_block				varchar2(100):= :system.cursor_block;
  va_current_record 			number			 := :system.cursor_record;			
  va_current_top_record   number			 := get_block_property(va_current_block, top_record);
  va_current_item					varchar2(100):=:system.cursor_item;
  va_top_record						number			 := get_block_property(par_nm_bloco, top_record);
  va_cur_record						number			 := get_block_property(par_nm_bloco, current_record);
  va_next_item						varchar2(500);
  va_last_block_item      varchar2(500):= par_nm_bloco||'.'||get_block_property(par_nm_bloco, last_item);
  va_counter_itens			  number:=1;
  va_counter_rows			    number:=1;
  va_ds_head							varchar2(500);
  va_ds_linha							varchar2(32000);
  va_vl_item							varchar2(400);
  va_ds_mask							varchar2(100);
  -- 
BEGIN
	go_block(par_nm_bloco);
	if form_success and :system.cursor_block = par_nm_bloco then
		ampulheta('S');
		first_record;		
		pck_arquivo.prc_determina_atributos(pck_arquivo.caminho);
		-- Percorre Linhas da tabela
		va_counter_rows := 1;
		loop
			-- Percorrer as colunas da linha
			va_counter_itens := 1;
			va_next_item := par_nm_bloco||'.'||get_block_property(par_nm_bloco, first_item);
			loop
				if get_item_property(va_next_item, item_type) in ('TEXT ITEM', 'DISPLAY ITEM') and ((par_apenas_itens_visiveis and get_item_property(va_next_item, visible) = 'TRUE') or not par_apenas_itens_visiveis) then
				  va_vl_item := name_in(va_next_item);
				  va_vl_item := replace(va_vl_item, '.', ','); 
					va_ds_linha := va_ds_linha ||';'||va_vl_item;
					if va_counter_rows = 1 then
						va_ds_head := va_ds_head ||';'||nvl(replace(get_item_property(va_next_item, prompt_text), chr(10), ' '), get_item_property(va_next_item, item_name));
					end if;					
				end if;						
				exit when va_next_item = va_last_block_item or va_counter_itens = 50;
				va_next_item := par_nm_bloco||'.'||get_item_property(va_next_item, nextitem);
				va_counter_itens   := va_counter_itens + 1;
			end loop;
			if va_counter_rows = 1 then
			  va_ds_head := substr(va_ds_head, 2);	
			  pck_arquivo.prc_incluir_linha(va_ds_head);
			end if;			
			va_ds_linha := substr(va_ds_linha, 2);	
			pck_arquivo.prc_incluir_linha(va_ds_linha);
			exit when :system.last_record = 'TRUE';
			va_ds_linha := null;
			va_counter_rows := va_counter_rows + 1;
			next_record;			
		end loop;
		go_record(va_top_record);
		go_record(va_cur_record);
		--
		go_block(va_current_block);
		go_record(va_current_top_record);
		go_record(va_current_record);
		SYNCHRONIZE;
		pck_arquivo.prc_executa;
  	ampulheta('N');
	end if;	
END;
--
 
E a sua chamada:

Selecionar tudo

begin
prc_exporta_dados_planilha('NOME_DO_BLOCO', TRUE);
end;
Qualquer dúvida estou a disposição.
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

boa tarde,
esqueci de postar o código da package PCK_ARQUIVO, utilizada pela procedure para incluir linhas em um arquivo e executa-lo.

Selecionar tudo

PACKAGE pck_arquivo IS
    
  -- Atributos
  diretorio varchar2(500);
  nome      varchar2(500);
  extensao  varchar2(5);
  caminho   varchar2(1005);
  function alterar_pontuacao_decimal(par_valor number) return varchar2;
  procedure prc_busca;
  procedure prc_insere_log(par_comando varchar2);
  procedure prc_determina_diretorio(par_caminho_diretorio varchar2);
  procedure prc_executa(par_caminho_arquivo varchar2 default null);
  procedure prc_determina_atributos(par_caminho_arquivo in out varchar2);
  procedure prc_executa_host(par_descricao_comando varchar2,
  													 par_sincrono				   boolean default false);  
	procedure prc_abrir(par_ds_metodo varchar2);
	--
	procedure prc_incluir_linha(par_ds_valor varchar2);
	--
	procedure prc_encerrar;
END;

PACKAGE BODY pck_arquivo IS  
  out_file text_io.file_type;
  function fnc_existe_diretorio(i_diretorio varchar2) return boolean is
    out_file Text_IO.File_Type;
  begin
    out_file := Text_IO.Fopen(i_diretorio || 'temp.txt', 'w');
    Text_IO.Fclose(out_file);
    host('del ' || i_diretorio || 'temp.txt', no_screen);
    return true;
  exception
    when others then
      Text_IO.Fclose(out_file);
      return false;
  end;

  function fnc_existe_arquivo(i_caminho_arquivo varchar2, i_tipo_metodo varchar2 default 'R') return boolean is
    out_file Text_IO.file_type;
  begin
    out_file := Text_IO.Fopen(i_caminho_arquivo, i_tipo_metodo);
    Text_IO.Fclose(out_file);
    return true;
  exception
    when others then
      Text_IO.Fclose(out_file);
      return false;
  end;
  function alterar_pontuacao_decimal(par_valor number) return varchar2 is
  begin
  	return ltrim(rtrim(to_char(par_valor, '999G999G990D00', 'NLS_NUMERIC_CHARACTERS=,.')));
  end;
  --
  -- Metodos Privados
  procedure prc_inicializa_atributos is
  begin
  	diretorio := null;
  	nome 			:= null;
  	extensao	:= null;
  end; 
  
  procedure prc_determina_atributos(par_caminho_arquivo in out varchar2) is
  begin
  	diretorio := substr(par_caminho_arquivo, 1, instr(par_caminho_arquivo, '\', -1));
    nome      := substr(par_caminho_arquivo,
                        instr(par_caminho_arquivo, '\', -1) + 1,
                        instr(par_caminho_arquivo, '.', -1) - instr(par_caminho_arquivo, '\', -1) - 1);
    extensao  := substr(par_caminho_arquivo, instr(par_caminho_arquivo, '.', -1) - length(par_caminho_arquivo));
    if extensao is null or length(extensao) < 3 then
    	extensao := 'csv';
    end if;
    --
    if ltrim(rtrim(diretorio)) is null then
    	diretorio := 'c:\Temp\';
    end if;
    --
    pck_arquivo.prc_determina_diretorio(diretorio);
    --
    if par_caminho_arquivo is not null and not pck_arquivo.fnc_existe_arquivo(par_caminho_arquivo, 'W') then
    	nome := null;
    end if;
    
    if nome is null then
			dbms_random.initialize(to_char(sysdate, 'ss'));
		  nome := 'Planilha_'||abs(dbms_random.random);
    end if;
    --
    caminho   := diretorio||nome||'.'||extensao;
    par_caminho_arquivo := caminho;
  end prc_determina_atributos;

  procedure prc_valida_atributos is
  begin
    if pck_arquivo.diretorio is null or pck_arquivo.nome is null or pck_arquivo.extensao is null then
      fgalproc(3, 'Todos atributos do arquivo devem estar preenchidos.');
    end if;
  end;

  procedure prc_gera_erro_log(par_msg_erro varchar2) is
    out_file            Text_IO.File_Type;
    va_caminho_arq_erro varchar2(200) := pck_arquivo.diretorio || 'temp.txt';
  begin
    out_file := Text_IO.Fopen(va_caminho_arq_erro, 'w');
    Text_IO.Put_Line(out_file, par_msg_erro);
    Text_IO.Fclose(out_file);
    fgalproc(3,
             'Erro ao popular o arquivo ' || pck_arquivo.diretorio || pck_arquivo.nome || '.' || pck_arquivo.extensao || '. Erro: ' || par_msg_erro);
  exception
    when others then
      Text_IO.Fclose(out_file);
  end;
  --
	procedure prc_insere_log(par_comando varchar2) is
	  out_file 			 text_io.file_type;
	  va_arquivo_log varchar2(100):='c:\Temp\log_execucao.txt';
	begin
	  if fnc_existe_arquivo(va_arquivo_log) then
	    out_file:=text_io.fopen(va_arquivo_log, 'A');
	  else
	  	out_file:=text_io.fopen(va_arquivo_log, 'W');
	  end if;
	  Text_IO.Put_Line(out_file, TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS')||' - '||par_comando);
	  Text_IO.FClose(out_file);
	exception
	  when others then
	    Text_IO.FClose(out_file);
	    fgalproc(1, 'Erro: '||sqlerrm);
	end;  
  --
  -- Metodos públicos
  procedure prc_busca is
    va_caminho_arquivo varchar2(1000);
  begin
    if pck_arquivo.diretorio is null then
      pck_arquivo.diretorio := 'C:\';
    end if;
    prc_inicializa_atributos;
    va_caminho_arquivo := get_file_name(directory_name => pck_arquivo.diretorio,
                                        file_name      => null,
                                        file_filter    => 'Todos os arquivos (*.*)|*.*|',
                                        message        => null,
                                        dialog_type    => open_file,
                                        select_file    => true);
    if va_caminho_arquivo is not null then
      prc_determina_atributos(va_caminho_arquivo);
    end if;
  end;

  procedure prc_determina_diretorio(par_caminho_diretorio in varchar2) is
    va_caminho_arquivo varchar2(1000);
    i                  number := 0;
  begin
    -- Determina em qual pasta o arquivo é descarregado  
    if par_caminho_diretorio is null then
      pck_arquivo.diretorio := 'C:\Temp\';    
    else
    	pck_arquivo.diretorio := par_caminho_diretorio;
    end if;
    	
    if not fnc_existe_diretorio(pck_arquivo.diretorio) then      
      host('mkdir ' || pck_arquivo.diretorio, no_screen);      
    end if;
    --
    if not fnc_existe_diretorio(pck_arquivo.diretorio) then
      loop
        pck_arquivo.diretorio := get_file_name(directory_name => pck_arquivo.diretorio,
                                               file_name      => null,
                                               file_filter    => null,
                                               message        => 'Selecione um diretório com permissão de escrita',
                                               dialog_type    => open_file,
                                               select_file    => false);
        if pck_arquivo.diretorio is not null then
          pck_arquivo.diretorio := pck_arquivo.diretorio || '\';
          exit when fnc_existe_diretorio(pck_arquivo.diretorio);
          fgalproc(1, 'Não foi possível baixar o arquivo para a pasta ' || pck_arquivo.diretorio || '. Selecione outra pasta.');
        else
          exit;
        end if;
      end loop;  	
    end if;
  end;
  
  procedure prc_executa(par_caminho_arquivo varchar2 default null) is
    ole_item   					ITEM;
    va_caminho_arquivo varchar2(1002):=pck_arquivo.caminho;
    
  begin
  	pck_arquivo.prc_encerrar; 
  	if par_caminho_arquivo is not null then
  		va_caminho_arquivo := par_caminho_arquivo;
  	end if;  	
    ole_item := FIND_ITEM('OLE_ARQUIVO');    
    IF NOT ID_NULL(ole_item) THEN
       Forms_OLE.Initialize_Container(ole_item, va_caminho_arquivo);
    END IF;
    IF Forms_OLE.Server_Active(ole_item) = FALSE THEN
       Forms_OLE.Activate_Server(ole_item);
    END IF;
    --
    Forms_OLE.Exec_Verb(ole_item, 1);
    --Forms_OLE.Exec_Verb(ole_item,'Edit');
    --
  end;
  
  procedure prc_executa_host(par_descricao_comando varchar2,
  													 par_sincrono				   boolean default false) is
  begin
  	prc_insere_log(par_descricao_comando);
  	if par_sincrono then
  		host(par_descricao_comando, no_screen);
  	else
  		host(par_descricao_comando);
  	end if;
  end;
  --
	procedure prc_abrir(par_ds_metodo varchar2) is
	begin
		pck_arquivo.prc_valida_atributos;
		out_file := Text_IO.Fopen(pck_arquivo.caminho, par_ds_metodo);
	end;
	--
	procedure prc_incluir_linha(par_ds_valor varchar2) is
	begin
		if not Text_IO.Is_Open(out_file) then
			prc_abrir('W');
		end if;
		Text_IO.Put_Line(out_file, par_ds_valor);
	end;
	--
	procedure prc_encerrar is
	begin
		if Text_IO.Is_Open(out_file) then
			Text_IO.Fclose(out_file);
		end if;		
	end;
end;
Pré-requisitos para utilizar a procedure prc_executa:
1) Inclua um item do tipo OLE CONTAINER em qualquer bloco, preferencialmente em um bloco do tipo controle com uma única linha.
2) Renomeie este item para OLE_ARQUIVO;

Inclua em algum bloco de sua aplicação um item do tipo OLE CONTAINER OLE_ARQUIVO
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes