Atualizar campos após selecionar um List Item

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

Estou com um problemão, tenho que atualizar alguns valores dentro de um forms e estou utilizando a trigger when-list-changed em um list item, até funciona, porem atualiza somente a primeira linha e as demais não, já tetei solucionar através de cursores mas sem sucesso, com next_item no fim do codigo ele passa para o proximo registro mas não atualiza.
alguém podria me auxiliar???
Valeu!!!
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

posta o teu código como esta hoje, para ficar mais claro o que você esta fazendo e consequentemente mais facil para resolvermos seu problema
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

valeu pela força Sergio.
Segue o codigo.

Selecionar tudo

begin
   if :gev_item_proposta_fotografica.cod_prod_serv is not null then
	
       for x in
        (
         select VAL_UNITARIO
         from gev_cp_prod_srv_forma_pagto
         where COD_PROD_SERV = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.COD_PROD_SERV
         and COD_FORMA_PAGAMENTO = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.cod_forma_pagamento
         and NUM_CONTRATO_PRINCIPAL = :GEV_PROPOSTA_FOTOGRAFICA.NUM_CONTRATO_PRINCIPAL
        )

        loop
        
         :GEV_ITEM_PROPOSTA_FOTOGRAFICA.VAL_UNITARIO := x.VAL_UNITARIO;
        
        end loop;
																				next_item;
   end if;
end;
[]´s
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Este seu forms é multirow?? No caso, é uma grade?
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

Sim ele é multirow.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

coloque o seguinte codigo dentro do seu loop

Selecionar tudo

if :system.last_record = 'TRUE' then
 exit;
end if;

next_record;
e retire o seu next_item

Deve funcionar, caso contrario poste o problema novamente
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

Sergio continua atualizando somente o primeiro registro.

Selecionar tudo

begin
   if :gev_item_proposta_fotografica.cod_prod_serv is not null then
	
       for x in
        (
         select VAL_UNITARIO
         from gev_cp_prod_srv_forma_pagto
         where COD_PROD_SERV = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.COD_PROD_SERV
         and COD_FORMA_PAGAMENTO = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.cod_forma_pagamento
         and NUM_CONTRATO_PRINCIPAL = :GEV_PROPOSTA_FOTOGRAFICA.NUM_CONTRATO_PRINCIPAL
        )

        loop
        
         :GEV_ITEM_PROPOSTA_FOTOGRAFICA.VAL_UNITARIO := x.VAL_UNITARIO;
         
         if :system.last_record = 'TRUE' then
 					exit;
				 end if;

         next_record; 
        
        end loop;
   --next_item;
   end if;
end;
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

então o teu for que esta restringindo apenas para a primeira linha.

faça um cursor com este select e abra-o detnro loop sem for nenhum.

Selecionar tudo

loop 
       open c_cursor;
       fetch c_cursor into r_record;
       close c_cursor;
   
         :GEV_ITEM_PROPOSTA_FOTOGRAFICA.VAL_UNITARIO :=r_record.VAL_UNITARIO; 
          
         if :system.last_record = 'TRUE' then 
                exit; 
             end if; 

         next_record; 
        
        end loop; 
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

Desculpe Sergio, mas não entedi como fazer.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Selecionar tudo

declare
  cursor c_query is
    select VAL_UNITARIO 
         from gev_cp_prod_srv_forma_pagto 
         where COD_PROD_SERV = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.COD_PROD_SERV 
         and COD_FORMA_PAGAMENTO = :GEV_ITEM_PROPOSTA_FOTOGRAFICA.cod_forma_pagamento 
         and NUM_CONTRATO_PRINCIPAL = :GEV_PROPOSTA_FOTOGRAFICA.NUM_CONTRATO_PRINCIPAL 
  
   r_query     c_query%rowtype;
     
begin 
   if :gev_item_proposta_fotografica.cod_prod_serv is not null then 
    
   loop 
        open c_query;
        fetch c_query into r_query;
        close c_quey;

         :GEV_ITEM_PROPOSTA_FOTOGRAFICA.VAL_UNITARIO := r_query.VAL_UNITARIO; 
          
         if :system.last_record = 'TRUE' then 
                exit; 
             end if; 

         next_record; 
        
        end loop; 
   end if; 
end; 
Adapte o que for preciso. Se não funcionar retorne novamente
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Correção:

Selecionar tudo

DECLARE
  CURSOR c_query IS
    SELECT val_unitario
      FROM gev_cp_prod_srv_forma_pagto
     WHERE cod_prod_serv = :gev_item_proposta_fotografica.cod_prod_serv
       AND cod_forma_pagamento = :gev_item_proposta_fotografica.cod_forma_pagamento
       AND num_contrato_principal = :gev_proposta_fotografica.num_contrato_principal
    
     r_query c_query%ROWTYPE;

BEGIN
  --/
  IF :gev_item_proposta_fotografica.cod_prod_serv IS NOT NULL
  THEN
    --/
    OPEN c_query;
    LOOP
      FETCH c_query
        INTO r_query;
      --/
      :gev_item_proposta_fotografica.val_unitario := r_query.val_unitario;
    
      EXIT WHEN :SYSTEM.last_record = 'TRUE'; --/ Opção minha
    
      next_record;
    
    END LOOP;
    CLOSE c_quey;
  END IF;
END;
hboni
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qui, 20 Ago 2009 3:24 pm
Localização: São Paulo - SP

Caros obrigado pela colaboração, as informações foram muito uteis. Consegui resolver o problema com o seguinte código.

Selecionar tudo

begin
for x in
(  select distinct(pfp.cod_prod_serv) cod_prod_serv,
          pfp.val_unitario
 from gev_cp_prod_srv_forma_pagto pfp, gev_item_proposta_fotografica ipf
 where pfp.COD_FORMA_PAGAMENTO = :gev_proposta_fotografica.cod_forma_pagamento
 and pfp.NUM_CONTRATO_PRINCIPAL = :GEV_PROPOSTA_FOTOGRAFICA.NUM_CONTRATO_PRINCIPAL
)
loop

 
 update gev_item_proposta_fotografica
 set val_unitario =  x.val_unitario
 where num_proposta_fotografica = :GEV_PROPOSTA_FOTOGRAFICA.num_proposta_fotografica
 and cod_prod_serv = x.cod_prod_serv;
 
end loop;

forms_ddl('commit');
go_block('gev_item_proposta_fotografica');					
do_key('execute_query');  	
go_item('gev_item_proposta_fotografica.num_proposta_fotografica');
pu_mensagem('Parabéns !. Procedimento realizado com sucesso. Não se equeça de salvar a alteração efetuada!!!');

end;
Obrigado a todos.
Responder
  • Informação
  • Quem está online

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