EXCEL EM UM SERVIDOR DE APLICAÇÃO

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
LCL
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 07 Mai 2007 12:37 pm
Localização: RIO DE JANEIRO

PESSOAL USEI O CODIGO ABAIXO NA MINHA MAQUINA E LOCALMENTE (MINHA MAQUINA´É CLIENTE/SERVIDOR FORMS 9I)ELE FUNCIONA.
QUANDO COLOCO O FMX NO SERVIDOR DE APLICAÇÃO E ACESSO VIA INTRANET OU INTERNET , NÃO DÁ ERRO MAS NÃO TRAS A INFROMAÇÃO QUE DEVERIA TRAZER , alguém SABE OQUE PODE SER?? JÁ TENTEI USAR O CLIENT_OLE2 MAS TAMBEM NÃO FUNCIONA DÁ UM ERRO 100501 NO-ORACLE EXCEPTION. AGUARDO UMA AJUDA OBRIGADO

Selecionar tudo

DECLARE 
   -- DECLARAÇÃO DE OBJETOS 
   APPLICATION OLE2.OBJ_TYPE; --EXCEL 
   WORKBOOKS   OLE2.OBJ_TYPE; 
   WORKBOOK    OLE2.OBJ_TYPE; --ARQUIVO XLS 
   WORKSHEET   OLE2.OBJ_TYPE;--PLANILHAS 
   CELL        OLE2.OBJ_TYPE; 
   font        OLE2.OBJ_TYPE; 

   -- DECLARA LISTA DE ARGUMENTOS 
  ARGS        OLE2.LIST_TYPE; 

  ROWCOUNT NUMBER := 1; 
    
   BEGIN 
       
   --volta com o cursor para o 1º record 
   FIRST_RECORD;    
   --------------------------------------------------------------------------------------------------------------------- 
    
   SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'BUSY'); 

   -- ABRE A APLICAÇÃO 
   APPLICATION := OLE2.CREATE_OBJ('EXCEL.APPLICATION'); 

   -- CRIA UM ARQUIVO PARA TRABALHO 
   WORKBOOKS := OLE2.GET_OBJ_PROPERTY(APPLICATION, 'WORKBOOKS'); 
   WORKBOOK  := OLE2.GET_OBJ_PROPERTY(WORKBOOKS,'ADD'); 

   -- ABRI UMA PLANILHA PLAN1 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS,'PLAN1'); 
   WORKSHEET := OLE2.GET_OBJ_PROPERTY(WORKBOOK, 'WORKSHEETS',ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 

   ------------------------------------------------------------------------------------------------------------------- 
   -- GERA CABEÇALHO 
   -- COLUNA 1 - CONTA 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER 
   OLE2.ADD_ARG(ARGS, 1); -- COLUMN NUMBER 
   CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS);    
   OLE2.SET_PROPERTY(CELL, 'VALUE', 'Nro. Conta');    
  font := ole2.get_obj_property (cell, 'Font'); 
   ole2.set_property (font, 'Name', 'Comics'); 
   ole2.set_property (font, 'Size', '11'); 
   ole2.set_property (font, 'Bold', TRUE); 
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red) 
   OLE2.RELEASE_OBJ(font);     
  OLE2.RELEASE_OBJ(CELL); 
    
   -- COLUNA 2 - Dígito 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER 
   OLE2.ADD_ARG(ARGS, 2); -- COLUMN NUMBER 
   CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 
   OLE2.SET_PROPERTY(CELL, 'VALUE', 'Dígito Conta'); 
   font := ole2.get_obj_property (cell, 'Font'); 
   ole2.set_property (font, 'Name', 'Arial'); 
   ole2.set_property (font, 'Size', '12'); 
   ole2.set_property (font, 'Italic', TRUE); 
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red) 
   OLE2.RELEASE_OBJ(font);    
   OLE2.RELEASE_OBJ(CELL); 
    
      -- COLUNA 3 - COD NEGOCIO 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER 
   OLE2.ADD_ARG(ARGS, 3); -- COLUMN NUMBER 
   CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 
   OLE2.SET_PROPERTY(CELL, 'VALUE', 'Descrição Conta'); 
  --font := OLE2.GET_OBJ_PROPERTY(CELL, 'Font', args); 
  font := ole2.get_obj_property (cell, 'Font'); 
   ole2.set_property (font, 'Name', 'Times New Roman'); 
   ole2.set_property (font, 'Size', '12'); 
   ole2.set_property (font, 'Bold', TRUE); 
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red) 
   OLE2.RELEASE_OBJ(font);    
   OLE2.RELEASE_OBJ(CELL); 
  
   --------------------------------------------------------------------------------------------------------------- 

   WHILE :CONTROLE.DADOS IS NOT NULL LOOP 
       
      ROWCOUNT := ROWCOUNT + 1; 
   ------------------------------------------------------------------------------------------------------------------- 
      -- DADOS 
      -- POPULA COLUNA 1 
      ARGS := OLE2.CREATE_ARGLIST; 
      OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA COLUNA 
      OLE2.ADD_ARG(ARGS, 1);        -- COLUNA NUMERO 
      CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
      OLE2.DESTROY_ARGLIST(ARGS);          
      OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 20); 
      OLE2.SET_PROPERTY(CELL, 'VALUE', TO_CHAR (:CONTROLE.DADOS)); 
      OLE2.RELEASE_OBJ(CELL); 

      -- POPULA COLUNA 2 
      ARGS := OLE2.CREATE_ARGLIST; 
      OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA NUMERO 
      OLE2.ADD_ARG(ARGS, 2);        -- COLUNA NUMERO 
      CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
      OLE2.DESTROY_ARGLIST(ARGS); 
      OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 20); 
      OLE2.SET_PROPERTY(CELL, 'VALUE', TO_CHAR (:CONTROLE.DADOS)); 
      OLE2.RELEASE_OBJ(CELL); 

      -- POPULA COLUNA 3 
      ARGS := OLE2.CREATE_ARGLIST; 
      OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA NUMERO 
      OLE2.ADD_ARG(ARGS, 3);        -- COLUNA NUMERO 
      CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS); 
      OLE2.DESTROY_ARGLIST(ARGS); 
      OLE2.SET_PROPERTY(CELL, 'VALUE', :CONTROLE.DADOS); 
      OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 25); 
      OLE2.RELEASE_OBJ(CELL); 
       

      NEXT_RECORD; 
    
      --------------------------------------------------------------------------------------------------------------- 
   END LOOP; 
   --RENOMEIA O NOME DA PLANILHA 
   ole2.set_property(WORKSHEET,'Name','Konda'); 
   ---------------------------------------------------------------------------------------------------------------- 
    
   -- EXIBINDO A PLANILHA 
   OLE2.SET_PROPERTY(APPLICATION,'VISIBLE', TRUE); 
    
   ---------------------------------------------------------------------------------------------------------------- 
    
   -- SALVANDO O AQRUIVO 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 'c:\TESTE.XLS'); 
   OLE2.INVOKE(WORKSHEET, 'SaveAs', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 
    
------------------------------------------------------------------------------------------------------------------ 

   --FECHANDO O ARQUIVO E APLICAÇÃO 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 0); 
   OLE2.INVOKE(WORKBOOK, 'Close', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 

---------------------------------------------------------------------------------------------------------------- 
    
    
   -- DELETANDO VARIAVEIS E OBJETOS 
   OLE2.RELEASE_OBJ(WORKSHEET); 
   OLE2.RELEASE_OBJ(WORKBOOK); 
   OLE2.RELEASE_OBJ(WORKBOOKS); 
   OLE2.RELEASE_OBJ(APPLICATION); 
   SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT'); 
EXCEPTION 
   WHEN OTHERS THEN 
      SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT'); 
      CLEAR_MESSAGE; 
    OLE2.Release_Obj( application ); 
    message('Error'||sqlerrm); 
      RAISE FORM_TRIGGER_FAILURE; 
END;
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Só para dar uma melhorada, o Exception deve ser alterado para evitar que o Excel continue carregado na memória:

Selecionar tudo


EXCEPTION
   WHEN OTHERS THEN
      SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');
      CLEAR_MESSAGE;

  -- Altere a partir daqui:
   OLE2.RELEASE_OBJ(WORKSHEET);
   OLE2.RELEASE_OBJ(WORKBOOK);
   OLE2.RELEASE_OBJ(WORKBOOKS);
   OLE2.RELEASE_OBJ(APPLICATION);
  -- Prontinho!!
    message('Error'||sqlerrm);
    RAISE FORM_TRIGGER_FAILURE;
END;
:P
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Alguém sabe como podemos colorir o fundo a célula?
Tentei usar:

Selecionar tudo

OLE2.SET_PROPERTY(CELL, 'ColorIndex', 3);
Mas isso não funciona. Onde eu posso encontrar as informações ou especificações sobre essa procedure SET_PROPERTY e seus parâmetros?
No Help tem, mas é bem superficial.

Alguém tem algo mais completo?
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

Estou com o mesmo problema.. localmente funciona mas no servidor
consegui resolver???
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Uma outra maneira de fazer, talvez te ajude:

http://forums.oracle.com/forums/thread. ... dID=290882


Export to Excel routine.

Selecionar tudo

procedure export_to_excel is 
  type t_format_mask is table of varchar2(30) index by binary_integer; 
  type t_item_type is table of varchar2(15) index by binary_integer; 
  type t_data_type is table of varchar2(15) index by binary_integer; 
  type t_multi_line is table of varchar2(5) index by binary_integer; 
  type t_display is table of boolean index by binary_integer; 
  type t_item_id is table of item index by binary_integer; 
  v_format_mask t_format_mask; 
  v_item_type t_item_type; 
  v_data_type t_data_type; 
  v_multi_line t_multi_line; 
  v_display t_display; 
  v_item_id t_item_id; 
  v_char varchar2(4000); 
  v_number number; 
  v_date date; 
  v_list_value varchar2(100); 
  v_prompt_text varchar2(60); 
  v_hint_text varchar2(60); 
  v_label varchar2(60); 
  v_name varchar2(30); 
  v_visible varchar2(5); 
  v_rows pls_integer; 
  v_columns pls_integer; 
  v_lines pls_integer; 
  v_index pls_integer; 
  v_list_count pls_integer; 
  v_list_index pls_integer; 
  v_length pls_integer; 
  v_type pls_integer; 
  v_null boolean; 
  v_connection exec_sql.conntype; 
  v_cursor exec_sql.curstype; 
  v_handle text_io.file_type; 
  begin 
   v_handle := text_io.fopen('export.xls','W'); 
   text_io.put_line(v_handle,'<html xmlns:o="urn:schemas-microsoft-com:office:office"'); 
   text_io.put_line(v_handle,'xmlns:x="urn:schemas-microsoft-com:office:excel"'); 
   text_io.put_line(v_handle,'xmlns="http://www.w3.org/TR/REC-html40">'); 
   text_io.put_line(v_handle,'<body>'); 
   text_io.put_line(v_handle,'<table border=1>'); 
   text_io.put_line(v_handle,'<tr>'); 
   v_connection := exec_sql.default_connection; 
   v_cursor := exec_sql.open_cursor(v_connection); 
   exec_sql.parse(v_connection,v_cursor,replace(get_block_property(:system.cursor_block,last_query),'ROWID,')); 
   v_columns := 0; 
   loop 
     v_columns := v_columns + 1; 
     begin 
      exec_sql.describe_column(v_connection,v_cursor,v_columns,v_name,v_length,v_type); 
      exception when exec_sql.invalid_column_number then 
        v_columns := v_columns - 1; 
        exit; 
     end; 
     v_item_id(v_columns) := find_item(:system.cursor_block||'.'||v_name); 
     v_item_type(v_columns) := get_item_property(v_item_id(v_columns),item_type); 
     v_data_type(v_columns) := get_item_property(v_item_id(v_columns),datatype); 
     v_visible := get_item_property(v_item_id(v_columns),visible); 
     v_prompt_text := get_item_property(v_item_id(v_columns),prompt_text); 
     v_hint_text := get_item_property(v_item_id(v_columns),hint_text); 
     if v_item_type(v_columns) = 'TEXT ITEM' then 
        v_format_mask(v_columns) := get_item_property(v_item_id(v_columns),format_mask); 
     else 
        v_format_mask(v_columns) := null; 
     end if; 
     if v_hint_text is not null then 
        v_label := v_hint_text; 
     else 
        v_label := v_prompt_text; 
     end if; 
     if v_item_type(v_columns) <> 'DISPLAY ITEM' and v_visible = 'TRUE' then 
        v_display(v_columns) := true; 
     else 
        v_display(v_columns) := false; 
     end if; 
     if v_display(v_columns) = true then 
        text_io.put_line(v_handle,'<td bgcolor="#FFFF00" x:autofilter="all">'||v_label||'</td>'); 
     end if; 
     if v_data_type(v_columns) = 'CHAR' then 
        if v_item_type(v_columns) = 'TEXT ITEM' then 
           v_multi_line(v_columns) := get_item_property(v_item_id(v_columns),multi_line); 
        else 
           v_multi_line(v_columns) := 'FALSE'; 
        end if; 
        exec_sql.define_column(v_connection,v_cursor,v_columns,v_char,v_length); 
     end if; 
     if v_data_type(v_columns) = 'NUMBER' then 
        if v_format_mask(v_columns) is not null then 
           v_format_mask(v_columns) := replace(v_format_mask(v_columns),'9','#'); 
           v_format_mask(v_columns) := replace(v_format_mask(v_columns),'G',','); 
           v_format_mask(v_columns) := replace(v_format_mask(v_columns),'D','.'); 
        end if; 
        v_multi_line(v_columns) := 'FALSE'; 
        exec_sql.define_column(v_connection,v_cursor,v_columns,v_number); 
     end if; 
     if v_data_type(v_columns) in ('DATE','DATETIME') then 
        v_multi_line(v_columns) := 'FALSE'; 
        exec_sql.define_column(v_connection,v_cursor,v_columns,v_date); 
     end if; 
   end loop; 
   text_io.put_line(v_handle,'</tr>'); 
   v_rows := exec_sql.execute(v_connection,v_cursor); 
   v_lines := 0; 
   while exec_sql.fetch_rows(v_connection,v_cursor) > 0 loop 
      v_lines := v_lines + 1; 
      text_io.put_line(v_handle,'<tr>'); 
      for v_index in 1..v_columns loop 
          v_null := false; 
          if v_data_type(v_index) = 'CHAR' then 
             exec_sql.column_value(v_connection,v_cursor,v_index,v_char); 
             if v_char is null then 
                v_null := true; 
             end if; 
          end if; 
          if v_data_type(v_index) = 'NUMBER' then 
             exec_sql.column_value(v_connection,v_cursor,v_index,v_number); 
             if v_number is null then 
                v_null := true; 
             end if; 
          end if; 
          if v_data_type(v_index) in ('DATE','DATETIME') then 
             exec_sql.column_value(v_connection,v_cursor,v_index,v_date); 
             if v_date is null then 
                v_null := true; 
             end if; 
          end if; 
          if v_display(v_index) = true then 
             if v_null = true then 
                text_io.put_line(v_handle,'<td></td>'); 
             else 
                if v_data_type(v_index) = 'CHAR' then 
                   v_char := replace(v_char,' ',' '); 
                   if v_item_type(v_index) = 'CHECKBOX' then 
                      if v_char in ('Y','YES') then 
                         v_char := 'YES'; 
                      else
                         v_char := 'NO'; 
                      end if; 
                   end if; 
                   if v_item_type(v_index) = 'LIST' then 
                      v_list_count := get_list_element_count(v_item_id(v_index)); 
                      for v_list_index in 1..v_list_count loop 
                          v_list_value := get_list_element_value(v_item_id(v_index),v_list_index); 
                          if v_list_value = v_char then 
                             v_char := get_list_element_label(v_item_id(v_index),v_list_index); 
                             exit; 
                          end if; 
                      end loop; 
                   end if; 
                   if v_multi_line(v_index) = 'TRUE' then 
                      text_io.put_line(v_handle,'<td style=''white-space:wrap'' x:str>'||v_char||'</td>'); 
                   else 
                      text_io.put_line(v_handle,'<td style=''white-space:nowrap'' x:str>'||v_char||'</td>'); 
                   end if; 
                end if; 
                if v_data_type(v_index) = 'NUMBER' then 
                   if v_format_mask(v_index) is not null then 
                      text_io.put_line(v_handle,'<td style=''mso-number-format:"'||v_format_mask(v_index)||'"'' x:num>'||to_char(v_number)||'</td>'); 
                   else 
                      text_io.put_line(v_handle,'<td x:num>'||to_char(v_number)||'</td>'); 
                   end if; 
                end if; 
                if v_data_type(v_index) = 'DATE' then 
                   text_io.put_line(v_handle,'<td align=left style=''mso-number-format:"dd-mmm-yyyy"'' x:num>'||to_char(v_date,'DD-MON-YYYY')||'</td>'); 
                end if; 
                if v_data_type(v_index) = 'DATETIME' then 
                   text_io.put_line(v_handle,'<td align=left style=''mso-number-format:"dd-mmm-yyyy hh:mm:ss"'' x:num>'||to_char(v_date,'DD-MON-YYYY HH24:MI:SS')||'</td>'); 
                end if; 
             end if; 
          end if; 
      end loop; 
      text_io.put_line(v_handle,'</tr>'); 
      exit when v_lines = 65535; 
   end loop; 
   exec_sql.close_cursor(v_cursor); 
   exec_sql.close_connection(v_connection); 
   text_io.put_line(v_handle,'</table>'); 
   text_io.put_line(v_handle,'</body>'); 
   text_io.put_line(v_handle,'</html>'); 
   text_io.fclose(v_handle); 
   CLIENT_HOST('CMD /C START "Grid" excel.exe ' || LC$Filename ) ;
 end;
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

Usando o client_ole2 em um servidor de aplicação não tem como????
Porque quando chega nesta linha código

Selecionar tudo

Application := Client_Ole2.Create_Obj('Excel.Application');  
o processo para e não consigo fazer mais nada.

Grata
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Existe o MS Excel® instalado no servidor?
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

sim, está instalado
LCL
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 07 Mai 2007 12:37 pm
Localização: RIO DE JANEIRO

em relação a cor de fundo use

Selecionar tudo

declare
 cell_fundo client_ole2.OBJ_TYPE;

CELL_fundo :=client_ole2.get_obj_property (w_cell, 'interior');--alterando cor de fundo
client_ole2.SET_PROPERTY(CELL_fundo, 'ColorIndex', 42);--42 é a cor que eu escoli escolha asua  tem que ser igula  a unica coisa que pode ser mudada é o nome 'cell_fundo" e o numero da cor o resto tem que ficar  igual  é 'interior" mesmo não altere




o codigo que funciona é oque vemm abaixo:
 application 		client_ole2.obj_type; 
  workbooks   		client_ole2.obj_type; 
  workbook    		client_ole2.obj_type; 
  worksheet   		client_ole2.obj_type; 
  cell        		client_ole2.obj_type; 
	COLUNAS					NUMBER(02);
  args 						client_ole2.list_type; 
  Check_file 			client_text_io.file_type; 
  WRK_LINHA_FIM		NUMBER;
  WRK_LINHA_inicio		NUMBER := P_LINHA_INICIO;
 	wrk_qtd_loop		number;					
 --DECLARACAO DE VARIAVEIS E EXCEPTIONS
  no_file 				exception; 
  PRAGMA 					exception_INIT(no_file, -302000); 
  cell_value 			varchar2(2000);
  cell_value_num     	varchar2(2000);
  x								number :=0; -- variavel para verificar 1º registro da coluna dois
	y								number:=1;  --variavel de controle 

BEGIN 
   -- VERIFICA EXISTENCIA DO ARQUIVO 
   
	  Check_file := CLIENT_TEXT_IO.FOPEN(P_NOME_ARQ, 'R'); 
	 
	  CLIENT_TEXT_IO.FCLOSE(Check_file); 
	   
	  application := client_ole2.create_obj('Excel.Application'); 
	  
	  workbooks   := client_ole2.get_obj_property(application, 'Workbooks'); 

  --Abrir arquivo requerido em workbook
 go_ITEM('PREVIEW_IMPORTED_COST.W_REF_NUM');
 
  args := client_ole2.create_arglist; 
  
  client_ole2.add_arg(args, P_NOME_ARQ); --endereco ou parametro do arquivo desejado 

  workbook := client_ole2.invoke_obj(workbooks, 'Open', args);
 
  client_ole2.destroy_arglist(args); 

  -- Abrir a folha (planilha) desse workbook
  args := client_ole2.create_arglist; 
 
  client_ole2.add_arg(args, 1); 

  worksheet := client_ole2.get_obj_property(workbook, 'Worksheets', args); 
 
  client_ole2.destroy_arglist(args); 
 

  -- RECUPERA DADOS DAS CELULAS DO ARQUIVO
 
    args := client_ole2.create_arglist; 
    
 
   --LEITURA DE LINHAS E COLUNAS DE ACORDO COM OS PARAMETROS FORNECIDOS  
   	
     for j in 1..2  loop 
     	
     	
     	-- recebe coluna digitada
     	if :parameter.p_tipo_loop =1 then
	wrk_qtd_loop :=5;-- preview
elsif :parameter.p_tipo_loop = 2 then
	wrk_qtd_loop :=65536;--quantidade de linhas do excel 
	end if;
	
    	for WRK_LINHA_inicio in P_LINHA_INICIO..wrk_qtd_loop  loop 
    	    	client_ole2.add_arg(args, 1); 
      	
    		client_ole2.add_arg(args, y); 
    		
    		cell:= client_ole2.get_obj_property(worksheet, 'Cells', args); 
    		
    		client_ole2.destroy_arglist(args); 
    		
    		args:= client_ole2.create_arglist; 
    		
    		     		   	
	  cell_value := client_ole2.get_num_property(cell,'Value');
     		       
     		         			
      cell_value := client_ole2.get_char_property(cell,'Value');
     			     			   	
     		
     		--VERIFICA DADOS NULOS
IF CELL_VALUE IS NULL and or cell_value_num is null THEN
   EXIT when (CELL_VALUE IS NULL and y = p_coluna_um ) or (y = p_coluna_dois and cell_value_num is null) ;
     	--	END IF;
   	  
    	  --POPULA AS COLUNAS
   		if  y = p_coluna_um then
   			
     		:PREVIEW_IMPORTED_COST.W_REF_NUM := cell_value;	
     		
     		--POPULA COLUNA DESCR
   		BEGIN 
   		
     		SELECT MRC.DESCR INTO :PREVIEW_IMPORTED_COST.DESCR
				from merc mrc, fornitura fnt
				where fnt.referencia = :PREVIEW_IMPORTED_COST.W_REF_NUM
				AND	FNT.FORN_NUM = :CONTROLE.FORN_NUM
				AND	FNT.FORNITURA_NUM = MRC.merc_num;
				
   		exception 
   			when no_data_found then
			   :PREVIEW_IMPORTED_COST.descr := ' ';
			END;
     		
   		elsif y = p_coluna_dois then
   				x := x + 1;
   		if x = 1 then
   						first_record;
   		end if;
   		--			
    	:PREVIEW_IMPORTED_COST.W_CUST := to_char(	cell_value_num);
    	
   		end if;
   		
   	NEXT_RECORD;
  	end loop;
    	
    	--condicao para retornar ao loop de coluna
    	if j = 1 then
    		y :=2;
    	else
    		y:=3;
    	end if;
    
    	END LOOP;
    	first_record;
    	
 
  
  --DESTROI AS VARIAVEIS
  
	args := client_ole2.create_arglist; 

  client_ole2.add_arg(args, 'C:Ora.prn'); 
  
  client_ole2.add_arg(args, 'Formatted text(Space delimited)(*.prn)&#124*.prn|'); 
  
  client_ole2.invoke(workbook, 'Save As', args); 

  client_ole2.destroy_arglist(args); 
 
  client_ole2.invoke(application, 'Quit');
   
  -- LIBERANDO AS VARIAVEIS DO TIPO OLE ( PACOTE MICROSOFT) 
  client_ole2.release_obj(cell); 
  client_ole2.release_obj(worksheet); 
  client_ole2.release_obj(workbook); 
  client_ole2.release_obj(workbooks); 
  client_ole2.release_obj(application); 
  go_ITEM('PREVIEW_IMPORTED_COST.W_REF_NUM');
  
  exception 
    --TRATAMENTO DE ERRO, CASO NÃO ENCONTRE O ARQUIVO	
  	WHEN no_file THEN 
			MENSAGEM('File Doesn`t exists');
			go_item('PLANILHA_CUSTO_FORN.SPREADSHEET');
			DESabilita('PREVIEW_IMPORTED_COST.W_REF_NUM');
			DESabilita('PREVIEW_IMPORTED_COST.DESCR');
			DESabilita('PREVIEW_IMPORTED_COST.W_CUST');
			DESabilita('PREVIEW_IMPORTED_COST.IMPORT');

    --QUALQUER OUTRO ERRO, EXIBE MSG	
   	WHEN OTHERS THEN 
    	MESSAGE(sqlerrm); 
     
END;
/*funciona no aplication server o excel deve estar instalado na maquina que esta acessando o sistema ,não é necessario no servidor. preste atenção quando forem importar valores não inteiros tem que tratar os mesmos como char porque o ole2 não entende a virgula , e o campo no forms tambem deve ser char. Ao gerar o excel trate todos os dados como char já no select com o to_char() pois se nã tambem ira gerar erro
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

E aí LCL, beleza?
Show de bola cara!!
Te mais disso aqui também ó:

http://glufke.net/oracle/viewtopic.php? ... olor+excel

:D
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

ESSE É O CÓDIGO QUE ESTOU USANDO E NÃO FUNCIONA ALGUÉM PODE ME AJUDAR???

Selecionar tudo

PROCEDURE P_LEITURA_PLANILHA ( P_ARQUIVO IN  VARCHAR2,                                    
                               P_CLIENTE IN  TLP_ITEM_INTERFACE.NR_CLI_COD%TYPE,          
                               P_DESC    IN  TLP_INTERFACE.TX_DESCRICAO%TYPE,             
                               P_ERRO    OUT VARCHAR2 ) IS                                
                                                                                          
 Application Client_Ole2.Obj_Type;                                                               
 Workbook    Client_Ole2.Obj_Type;                                                               
 Workbooks   Client_Ole2.Obj_Type;                                                               
 Worksheet   Client_Ole2.Obj_Type;                                                               
 Cell        Client_Ole2.Obj_Type;                                                               
                                                                                          
 Args        Client_Ole2.List_Type;    
 
                                                                                                                                      
 Check_File Boolean;                                                                      
 No_File    Exception;    
 	
 Pragma Exception_Init(No_File,-302000);                                                  
                
 W_Nr_Sq_Item Tlp_Item_Interface.Nr_Sq_Item           %Type := 0;                                                                        
 W_Nr_Item    Tlp_Item_Interface.Nr_Item              %Type := Null;                      
 W_Id_Vl_Comp Tlp_Item_Interface.Id_Vl_Competitividade%Type := Null;                      
 W_Seq        Tlp_Interface.Nr_Sq_Interface           %Type := Null;                      
 W_Usuario    Tlp_Interface.Nm_User_Insert            %Type := Null;                      

 W_Linha      Number := 0; 	                                                                
                                                                                          
BEGIN
 	---------------                                                                         
  --- Usuario ---                                                                         
  ---------------                                                                         
  W_Usuario := F_Usuario(:Cg$Ctrl.Cgu$User);   
  
                                                                                         
  ------------------------------------                                                    
  --- Checando se o arquivo existe ---                                                    
  ------------------------------------                                                    
  Check_File := F_Existe_Arquivo(P_Arquivo);   
  
    If Check_File Then    
                                                                
     -----------------------------------                                                  
     --- Sequencial para a interface ---                                                  
     -----------------------------------                                                  
     For D_Seq in ( Select Max(Nr_Sq_Interface) Seq                                       
                      From Tlp_Interface ) Loop                                           
         W_Seq := D_Seq.Seq;                                                              
     End Loop;                                                                            
                                                                                          
     W_Seq := Nvl(W_Seq,0) + 1;   
     
         
     ----------------------------------                                                   
     --- Iniciando Aplicativo Excel ---                                                   
     ----------------------------------                                                   
     Application := Client_Ole2.Create_Obj('Excel.Application');     
     Client_Ole2.Set_Property(Application,'Visible','True');                                  
                                                                                          
     Workbooks := Client_Ole2.Get_Obj_Property(Application,'Workbooks');     
                                  

     ------------------------------------                                                 
     --- Abrindo arquivo especificado ---                                                 
     ------------------------------------                                                 
     Args := Client_Ole2.Create_Arglist;                                                         
     Client_Ole2.Add_Arg(Args,P_Arquivo);                                                        
     Workbook := Client_Ole2.Invoke_Obj(Workbooks,'Open',Args);                                  
     Client_Ole2.Destroy_Arglist(Args);                                                          
                                                                                          
     ----------------------------------------                                             
     --- Selecionando a pasta da planilha ---                                             
     ----------------------------------------                                             
     Begin                                                                                
       Args := Client_Ole2.Create_Arglist;                                                       
       Client_Ole2.Add_Arg(Args,'Sheet1');                                                       
       Worksheet := Client_Ole2.Get_Obj_Property(Workbook,'Worksheets',Args);                    
       Client_Ole2.Destroy_Arglist(Args);                                                        
     Exception When Others Then                                                           
               Begin                                                                      
                  Args := Client_Ole2.Create_Arglist;                                            
                  Client_Ole2.Add_Arg(Args,'Plan1');                                             
                  Worksheet := Client_Ole2.Get_Obj_Property(Workbook,'Worksheets',Args);         
                  Client_Ole2.Destroy_Arglist(Args);                                             
               Exception When Others Then                                                 
                    P_Erro := 'Nome da Pasta diferente de Plan1/Sheet1 !';                
                    Goto Fim;                                                             
               End;                                                                       
     End;                                                                                 
                                                                                                                                                                                
     --------------------------                                                           
     --- Inclusao do Header ---                                                           
     --------------------------                                                           
     Begin                                                                                
        Insert Into Tlp_Interface                                                         
           ( Nr_Sq_Interface, Tx_Descricao, Dt_Insert , Nm_User_Insert )                  
        Values                                                                            
           ( W_Seq , P_Desc , Sysdate, W_Usuario);                                        
     Exception When Others Then                                                           
               P_Erro := 'ERRO TLP_INTERFACE '||Sqlerrm;                                  
               Goto Fim;                                                                  
     End;                                                                                 
      
                                                                                          
     -----------------------                                                              
     --- Id da interface ---                                                              
     -----------------------                                                              
     :Parametros.Id_Interface := W_Seq;                                                   
     Synchronize;                                                                         

     -----------------------------------                                                  
     --- Leitura da matriz com dados ---                                                  
     -----------------------------------                                                  
     Loop                                                                                 
      ------------------------------------------------
      --- Contador de linhas para os comandos Ole2 ---
      ------------------------------------------------
      W_Linha := Nvl(W_Linha,0) + 1;
                                                                                          
       ---------------------------                                                        
       --- Leitura das colunas ---                                                        
       ---------------------------                                                        
       For W_Coluna in 1..2 Loop  

           Args := Client_Ole2.Create_Arglist;
           Client_Ole2.Add_Arg(Args,W_Linha);
           Client_Ole2.Add_Arg(Args,W_Coluna);
           Cell := Client_Ole2.Get_Obj_Property(WorkSheet,'Cells',Args);
           Client_Ole2.Destroy_Arglist(Args);
                                                        
           If W_Coluna = 1 Then                                                           
              W_Nr_Item := Lpad(To_Char(Client_Ole2.Get_Num_Property(Cell,'Value')),7,'0');              
           ElsIf W_Coluna = 2 Then                                                        
                 W_Id_Vl_Comp := Client_Ole2.Get_Char_Property(Cell,'Value');                    
           End If;                                                                                                                                                                                                                                                           
       End Loop;                                                                          

       -------------------------------                                                    
       --- Checando fim de arquivo ---                                                    
       -------------------------------                                                    
       If Nvl(W_Nr_Item,'0000000') = '0000000' And                                                 
          Nvl(W_Id_Vl_Comp,'0') = '0' Then                                                
          Goto Fim;                                                                       
       End If;                                                                            

       --------------------------                                                         
       --- Contador de linhas ---                                                         
       --------------------------                                                         
       :Parametros.Nr_Registros_Lidos := Nvl(:Parametros.Nr_Registros_Lidos,0) + 1;       
       Synchronize;                                                                       

       ---------------------------                                                        
       --- Inclusao das linhas ---                                                        
       ---------------------------                                                        
       Begin                         

         W_Nr_Sq_Item  :=  W_Nr_Sq_Item  +  1;
                                                     
         Insert Into Tlp_Item_Interface                                                   
           ( Nr_Sq_Interface        , Nr_Sq_Item            ,
	     Nr_Item                ,                               
             Nr_Cli_Cod             , Id_Vl_Competitividade ,                             
             Dt_Insert              , Nm_User_Insert          )                           
         Values                                                                           
           ( W_Seq     , W_Nr_Sq_Item
            ,W_Nr_Item                                                        
            ,P_Cliente , W_Id_Vl_Comp                                                     
            ,Sysdate   , W_Usuario);           
       Exception When Others Then                                                         
                 P_Erro := 'ERRO TLP_ITEM_INTERFACE '||Sqlerrm;                           
                 Goto Fim;                                                                
       End;                                                                               
                                                                                          
                                                                                          
     End Loop;                                                                            
                                                                                          
     <<Fim>>                                                                              
     Client_Ole2.Release_Obj(Cell);                                                              
     Client_Ole2.Release_Obj(Worksheet);                                                         
     Client_Ole2.Release_Obj(Workbook);                                                          
     Client_Ole2.Release_Obj(Workbooks);                                                         
                                                                                          
     Client_Ole2.Release_Obj(Application);                                                       
                                                                                          
     Client_Ole2.Invoke(Application,'Quit');                                                     
                                                                                          
  Else                                                                                    
     P_Erro := 'Não encontrou o arquivo '||P_Arquivo;                                     
     Return;                                                                              
  End If;                                                                            
                                                                                          
Exception When No_File Then                                                               
               P_Erro := 'Arquivo não foi encontrado !';                                  
               Return;                                                                    
          When Others Then                                                                
               For i in 1..Tool_Err.Nerrors Loop                                          
                   Message_Handler(Tool_Err.Message,'E',True);                            
                   Tool_Err.Pop;                                                          
               End Loop;                                              
 	--Message_handler('VERIFICACAO','a',false);
 	
END P_LEITURA_PLANILHA;
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

NÃO DÁ ERRO MAS NÃO TRAS A INFROMAÇÃO QUE DEVERIA TRAZER

Cara, quais informações você quer que ele traga? Quais informações ele deveria trazer?

Quanto ao erro do non-Oracle exception -100501, eu tive ele há um tempo e a solução foi tirar a cláusula WHEN OTHERS THEN e configurar e setar realmente as possíveis exceções.
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

NÚMEROS E LETRAS , NÚMERO SEM VIRGULA .
NA VERDADE O PROCESSO PARA QUANDO É EXECUTADO
application := client_ole2.create_obj('Excel.Application'); NO SERVIDOR.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Dependendo da formatação de casas decimais, para trazer números sem vírgula, é só multiplicar por 100...

14,45 * 100 = 1445.

Você diz que o código não funciona, certo?
O que ele supostamente deveria fazer?
Você está iniciando a chamada em algum botão?
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp
Fernanda

Bom o que acontece é o seguinte, eu informo na tela o endereço do arquivo que quero né por exemplo C:\Teste5.xls isso fica em um campo
então através de um botão eu chamo essa procedure p_leitura_planilha, na planilha possuem 2 colunas e 2 linhas com dados..e esses dados eu tento
trazer para outro bloco os dados são

10226 VN
100325 VB

no forms 4.5 funciona o ole2 certinho...
mas quando eu migrei pro 10g executando no servidor ele para o processo naquela linha de código que citei acima e eu não consigo nem fechar nem fazer mais nada no form.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Ahhhhh sim....
Pergunto :

Existe o MS Excel instalado no Server?

Alguém aqui sabe se esse procedimento de criação de XLS por meio de Ole2 Funciona em plataforma 10g ???
fernandafranhan
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 31 Mai 2007 9:00 am
Localização: Santo André - Sp

Bom dia ,

Conversei com algumas pessoas e me disseram que não é necessário estar instalado o Ms Excel usando o Client_ole2.
Mas ainda não consegui resolver meu problema.
Testei até com o forms webutil_demo no servidor e mesmo assim acontece o problema será que seria alguma configuração
em java???

Grata
Fernanda Franhan
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Oi Fernanda, estive dando uma pesquisada pra ver se conseguia te ajudar.
Achei o seguinte, aparentemente, agora para utilizar Ole2, tem que ser pela WebUtil do 10g.

A Chamada mudaria de Ole2 para Client_Ole2

http://www.oracle.com/technology/produc ... bUtil.html


Ele fica agora mais ou menos com essa cara:

Selecionar tudo


DECLARE 
        app CLIENT_OLE2.OBJ_TYPE; 
        docs CLIENT_OLE2.OBJ_TYPE; 
        doc CLIENT_OLE2.OBJ_TYPE; 
        selection CLIENT_OLE2.OBJ_TYPE; 
        args CLIENT_OLE2.LIST_TYPE; 
BEGIN 
                -- create a new document
 
                app := CLIENT_OLE2.CREATE_OBJ('Word.Application'); 
                CLIENT_OLE2.SET_PROPERTY(app,'Visible',1); 
                docs      := CLIENT_OLE2.GET_OBJ_PROPERTY(app, 'Documents'); 
                doc       := CLIENT_OLE2.INVOKE_OBJ(docs, 'add'); 
                selection := CLIENT_OLE2.GET_OBJ_PROPERTY(app, 'Selection'); 
                -- insert data into new document from long item
 
                CLIENT_OLE2.SET_PROPERTY(selection, 'Text', 'this is a test message'); 
                -- save document as example.tmp
 
                args := CLIENT_OLE2.CREATE_ARGLIST; 
                CLIENT_OLE2.ADD_ARG(args, 'c:\example.doc'); 
                CLIENT_OLE2.INVOKE(doc, 'SaveAs', args); 
                CLIENT_OLE2.DESTROY_ARGLIST(args); 
                -- close example.tmp
 
                args := CLIENT_OLE2.CREATE_ARGLIST; 
                CLIENT_OLE2.ADD_ARG(args, 0); 
                CLIENT_OLE2.INVOKE(doc, 'Close', args); 
                CLIENT_OLE2.DESTROY_ARGLIST(args); 
                CLIENT_OLE2.RELEASE_OBJ(selection); 
                CLIENT_OLE2.RELEASE_OBJ(doc); 
                CLIENT_OLE2.RELEASE_OBJ(docs); 
                -- exit MSWord
 
                CLIENT_OLE2.INVOKE(app,'Quit'); 
END; 
/*If you are running client/server Forms you may be using code like
 
app := OLE2.CREATE_OBJ('Word.Basic');
 
or
 
app := OLE2.CREATE_OBJ('Word.Application');*/

E deve mudar um pouco na implementação.

Aqui tem toda a documentação certinha:

http://www.oracle.com/technology/produc ... b_util.pdf

Espero que agora você consiga resolver seu problema.

:D
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Nossa, aqui tem um videozinho show de bola!!!

http://www.oracle.com/technology/sample ... t_swf.html

Tudo bem explicadinho!!!!
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Webutil é a resposta..arquitetura 3 camadas não é a mesma coisa que cliente servidor....
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Uma outra dica, que me deparei no desenvolvimento de exportação para o Excel é, a versão do Excel que o cliente esteja usando x o desenvolvimento de casas decimais da aplicação.

Notei quando desenvolvi que, por exemplo desenvolvi '.,' e o excel instalado no cliente era em Inglês ',.', daí gerava erros de formatação.

Precise desenvolver uma procedure de verificação para correção.
Responder
  • Informação