enter_query - execute_query

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
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

Eu tenho dois blocos em meu programa. Do segundo bloco, eu atualizo os dados no primeiro via código PL/SQL. Quando eu volto ao primeiro bloco, os dados ainda não estão atualizados. Existe alguma maneira de dar um refresh no form, ou refazer a consulta mas voltando direto ao código exibido anteriormente?? Usando apenas execute_query ele retorna todos os dados, exibindo o primeiro ítem da consulta e não o código anterior!

Tentei usar um enter_query seguido de execute_query, mas ele não executa nada até que o user entre com alguma consulta manualmente.

Tentei também armazenar o nº do registro do código atualizado e depois usar um go_record, mas ficou extremamente lento.

Existe alguma solução?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Quando eu volto ao primeiro bloco, os dados ainda não estão atualizados.
Você atualiza esse campo via UPDATE ?
Se sim, você pode buscar o valor do campo que está no BANCO, usando GET_ITEM_PROPERTY('bloco.campo', DATABASE_VALUE);

No outro caso, (do execute_query), talvez você possa salvar o código da PK daquela linha e alterar a clausula WHERE pra buscar exatamente a linha que você quer... :-/
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

É mais ou menos isso. Eu insiro alguns registros em uma tabela.
O Bloco 1 exibe essas informações, mas como eu acabei de inserir, ele ainda não está mostrando.
São dados novos.
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

O que eu fiz até agora foi:

Selecionar tudo

cursor cursor_atual is SELECT codigo FROM tbl_func order by codigo; 
E usando o loop:

Selecionar tudo

      open cursor_atual;
      fetch cursor_atual into matricula_registro;
      cur_reg := 0;
      loop 
        cur_reg := cur_reg + 1;
        if (cursor_atual%notfound) or (matricula_registro = :bloco1.codigo) then
           exit;
        else
           fetch cursor_atual into matricula_registro;
        end if;
      end loop;
      close cursor_atual;
      do_key('execute_query'); 
       go_record(cur_reg);
Ele acha o número do registro, vai até o registro que eu quero e já retorna os dados atualizados, inclusive os que eu acabei de inserir, mas a tabela é enorme. Está demorando demaaais!

Lembrando que eu fiz isso porque uso o Forms 4.5 :oops:

No Plus eu poderia fazer assim:

Selecionar tudo


SELECT registro into cur_reg FROM (SELECT codigo, ROWNUM registro FROM tbl_func)  WHERE codigo = :bloco1.codigo;

Mas... Alguém pode me ajudar!? :roll:
rvano
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 16 Out 2006 4:51 pm
Localização: SP

Armazena a consulta em um array antes
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

Dr_Gori, mais uma vez você me ajudou!

Funcionou assim:

Selecionar tudo

DECLARE

def_where VARCHAR2(4000):= null;

BEGIN

def_where := 'bloco1.codigo = ' || to_char(codigo);

SET_BLOCK_PROPERTY('bloco1',DEFAULT_WHERE,def_where);

do_key('execute_query'); 

def_where := null;

SET_BLOCK_PROPERTY('bloco1',DEFAULT_WHERE,def_where);
Obrigado mesmo!!
Abraços!
:-o
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Boa tarde!
Estou com o mesmo problema, tentei utilizar o

Selecionar tudo

GET_ITEM_PROPERTY('bloco.campo', DATABASE_VALUE); 
mas na hora de compilar o trigger dá o seguinte erro: 'GET_ITEM_PROPERTY' is not a procedure or is undefined.

Por favor, saberia dizer o que acontece?


Obrigada!!
Att.,
Thatiane
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

Tem como você postar o código pra gente dar uma olhada?
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Sim, claro!!

Uso o forms 6i, e o código está no trigger WHEN-BUTTON-PRESSED do segundo bloco (tenho um primeiro, e o segundo, onde faço as alterações para que o primeiro seja atualizado).


Selecionar tudo

If :Transf_Valores.Cod_Cl_Dest Is Null Then
	Fnd_Message.Set_String ('Informe o Centro de Custo - Destino!');
	Fnd_Message.Error;
	Raise Form_Trigger_Failure;
		  
Else 
	If :Transf_Valores.Papel_Ac_Tr   > :Papel_Ac_Ed   Or
	   :Transf_Valores.Grafica_Ac_Tr > :Grafica_Ac_Ed Or
  	 :Transf_Valores.Mobra_Ac_Tr   > :Mobra_Ac_Ed   Or
	   :Transf_Valores.Foto_Ac_Tr    > :Foto_Ac_Ed    Or     
  	 :Transf_Valores.Terc_Ac_Tr    > :Terc_Ac_Ed    Then
	   Fnd_Message.Set_String ('Não é possível transferir: Valor Informado maior que valor disponível.');
  	 Fnd_Message.Error;
	   Raise Form_Trigger_Failure;
	Else		
		:Papel_Ac_Ed   := :Papel_Ac_Ed   - :Transf_Valores.Papel_Ac_Tr;
    :Grafica_Ac_Ed := :Grafica_Ac_Ed - :Transf_Valores.Grafica_Ac_Tr;
    :Mobra_Ac_Ed   := :Mobra_Ac_Ed   - :Transf_Valores.Mobra_Ac_Tr;
    :Foto_Ac_Ed    := :Foto_Ac_Ed    - :Transf_Valores.Foto_Ac_Tr;
    :Terc_Ac_Ed    := :Terc_Ac_Ed    - :Transf_Valores.Terc_Ac_Tr;
    
    Declare
    	v_destino		Number         := :TRANSF_VALORES.COD_CL_DEST;
    	v_cod_as		Varchar2(1000) := :TRANSF_VALORES.COD_AS_DEST;
    	v_Papel_AC	Number;
    	v_Graf_AC		Number;
    	v_Mobra_Ac	Number;
    	v_Foto_Ac		Number;
    	v_Terc_Ac		Number;
    	v_rowid			Varchar2(2000);
    Begin
      Select Papel_AC
           , Graf_AC
           , Mobra_AC
           , Foto_AC
           , Terc_AC
           , rowid
        Into v_Papel_AC
           , v_Graf_AC
           , v_Mobra_Ac
           , v_Foto_Ac
           , v_Terc_Ac
           , v_rowid
      From Abrl_Custo_AC_V
      Where Cod_Cl   = v_destino
        AND Cod_As   = v_cod_as;
               
 
      UPDATE ABRL_CUSTO_AC_V
        SET PAPEL_AC	= v_Papel_AC + :Transf_Valores.Papel_Ac_Tr
          , GRAF_AC		= v_Graf_AC  + :Transf_Valores.Grafica_Ac_Tr
          , MOBRA_AC	= v_Mobra_Ac + :Transf_Valores.Mobra_Ac_Tr
          , FOTO_AC		= v_Foto_Ac  + :Transf_Valores.Foto_Ac_Tr
          , TERC_AC		= v_Terc_Ac  + :Transf_Valores.Terc_Ac_Tr
      Where Rowid	= v_rowid;
      Commit;

GET_ITEM_PROPERTY (:ABRL_CUSTO_AC.Papel_Ac_Ed, DATABASE_VALUE);
      

      
    Exception
    	When Others Then 
    	  v_Papel_AC		:= 0;
    	  v_Graf_AC			:= 0;
    	  v_Mobra_Ac		:= 0;
    	  v_Foto_Ac			:= 0;
    	  v_Terc_Ac			:= 0;
    	  v_rowid				:= null;   	  

    End;
    
  End If;
End If;  


app_custom.close_window('TRANSF_VALORES');  



------
Obrigada!
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR

GET_ITEM_PROPERTY (:ABRL_CUSTO_AC.Papel_Ac_Ed, DATABASE_VALUE);
Neste caso, o primeiro parâmetro do GET_ITEM_PROPERTY teria que ser uma string no formato bloco.campo (sem o ":").
Outra coisa é que GET_ITEM_PROPERTY é uma função, então é necessário atribuir o valor de retorno a uma variável / item / etc, como:

Selecionar tudo

declare
   v_database varchar2(255);
begin
   v_Database := GET_ITEM_PROPERTY ('ABRL_CUSTO_AC.Papel_Ac_Ed', DATABASE_VALUE);
end;
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Bom dia!
Ok, alterei e códig, agora o retorno da função é carregada numa variável, mas não consegui fazer o que realmente quero: Quando sai do 2º bloco, e voltei para 1º, os dados estavam da mesma forma... Tive que realizar a consulta novamente, para que os dados fossem atualizados...
Depois de chamar a função, como devo "acionar" o conteudo dessa variável?

Obrigada!
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Pessoal,

Obrigada pela ajuda!
Coloquei um EXECUTE_QUERY ao final do mesmo trigger e consegui atualizar os dados.


:)
Responder
  • Informação