Update em Loop

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Bom Dia Pessoal
Eu de novo.
Já postei aqui sobre o LOOP em uma tela que possui dois bloco auxiliares.
Bom. Preciso fazer um update.
Tenho um botão chamado, alterar resultados. E faz um execute_query.
QUando peço pra salvar dar erro de chave duplicada.
Então preciso fazer um update nesses dois blocos auxiliares. Pra salvar um bloco data base.
alguém sabe me dizer como e o onde poderia fazer o update.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

To com outro problema,
Já ta fazendo as alterações. Porem quando mando salvar. Diz que não tem nada pra salvar. COmo faço pra mudar isso.
Ai vai o codigo
POr favor, alguém por ai

Selecionar tudo

declare
	nr_rep number;

BEGIN

if :parameter.acao = 'A' then-- Alterar									
									select distinct pra.nr_repeticao into nr_rep
                  from pra pra,
         					resultado_exame re,
					        requisicao_exame r,
					        crm c,
					        resultados_gerais rg,
					        anticorpos_pra a,
					        pessoa_fisica pf,
					        pessoa_juridica pj,
					        lista_exame le
									where rg.nr_amostra = :parameter.numero_amostra
									and rg.nr_amostra = re.nr_amostra
									and le.nr_requisicao = r.nr_requisicao
									and re.nr_amostra = le.nr_amostra 
									and re.nr_controle = le.nr_controle
									and re.cd_servico = le.cd_servico 
									and re.nr_repeticao = le.nr_repeticao_atual 
									and rg.cd_servico = re.cd_servico
									and rg.nr_controle = re.nr_controle
									and rg.nr_repeticao = re.nr_repeticao
									and re.nr_amostra = pra.nr_amostra
									and re.cd_servico = pra.cd_servico
									and re.nr_controle = pra.nr_controle
									and re.nr_repeticao = pra.nr_repeticao
									and pra.cd_anticorpo = a.cd_anticorpo
									and c.cd_crm(+) = r.cd_crm
									and a.cd_classe = 1
									and pf.cd_pessoafisica = re.cd_pessoafisica
									and pj.id_pessoajuridica = r.cd_pessoajuridica
									and pra.dt_realizacao = rg.dt_realizacao
									and pra.dt_atualizacao = rg.dt_atualizacao
									and pra.cd_usuario = rg.cd_usuario;
									

IF :cd_anticorpo1 is not null and :vl_anticorpo1 is not null AND 
	:cd_anticorpo2 is not null and :vl_anticorpo2 is not null then
  
if :nr_repeticao = nr_rep then
DELETE FROM PRA
WHERE NR_AMOSTRA = :NR_AMOSTRA
AND NR_REPETICAO = :NR_REPETICAO;
end if;
end if;
END IF;
validar_obrigatorios;
if :cd_anticorpo1 is not null then
	--Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
		go_block('anticorpo1');
		first_record;

		loop

 	    IF :SYSTEM.RECORD_STATUS in ('NEW','INSERT')  THEN 
	    if :cd_anticorpo1 is not null and :vl_anticorpo1 is not null then
   	 	   	 	 	 	
   		begin   				
   						
   		insert into PRA(nr_amostra,nr_controle,nr_repeticao,cd_servico,cd_anticorpo,dt_realizacao,dt_atualizacao,cd_usuario,vl_anticorpo)
   		values(:resultados_gerais.nr_amostra,:resultados_gerais.nr_controle,:resultados_gerais.nr_repeticao,:resultados_gerais.cd_servico,
   		:cd_anticorpo1,:resultados_gerais.dt_realizacao,:resultados_gerais.dt_atualizacao,:global.cd_pessoafisica, :vl_anticorpo1);
  	 		
  	  	 							
  		exception
   			when others then
   				controle_de_msg('ERR',sqlerrm);
  			
  		end;
 	    end if;
 	   
   	forms_ddl('commit');
    next_record;
    END IF;
    exit when :cd_anticorpo1 is null;
	end loop;

	end if;		



   	 if :cd_anticorpo2 is not null then
   	--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA 
   	 go_block('anticorpo2');
		 first_record;
 
			LOOP
			IF :SYSTEM.RECORD_STATUS in ('NEW','INSERT')  THEN 
   		if :cd_anticorpo2 is not null and :vl_anticorpo2 is not null then
  		
   			begin   				
   						
   			insert into PRA(nr_amostra,nr_controle,nr_repeticao,cd_servico,cd_anticorpo,dt_realizacao,dt_atualizacao,cd_usuario,vl_anticorpo)
   			values(:resultados_gerais.nr_amostra,:resultados_gerais.nr_controle,:resultados_gerais.nr_repeticao,:resultados_gerais.cd_servico,
   			:cd_anticorpo2,:resultados_gerais.dt_realizacao,:resultados_gerais.dt_atualizacao,:global.cd_pessoafisica, :vl_anticorpo2);
  				
  			exception
   				when others then
   					controle_de_msg('ERR',sqlerrm);
  			end;
  				
			end if;
		
   		forms_ddl('commit');
    	next_record;
    	   	 
   		END IF; 
   			Exit when :cd_anticorpo2 is null; 
   	end loop;
   	 end if;
   

   	 COMMIT_FORM;
	end;
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

PO, será que tem alguém por ai???
Preciso de uma força ai gente. Uma dica, apontar o erro, o que for. VAle tudo.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Já que pede com tanto afinco vou lhe apontar alguns erros e algumas melhorias propostas.

1 - Evite ao máximo o usu de Into. Motivo? você não est tratando nenhum tipo de exception, se estourar um erro você sofrerá para descobrir a solução.
2 - Observe que antes de efetuar o primeiro loop você não se posiciona em local alguém. Ou seja, imagine se você estiver entrado em uma linha em branco, o que ocorreria? Os dois loops não executariam.
3 - Durante sua você comentou que seu bloco era "auxiliar", tomei por verdade que estes blocos eram não base table, desta forma os comandos Você esta efetuando diversos forms_ddl('commit');COMMIT ou COMMIT_FORM; nunca terão nenhuma integração para salvar. Talvez por isso sua mensagem.
4 - Sua aplicação salva alguma coisa?

Se eu fosse criar uma rotina para o mesmo funcionamento faria assim:

Selecionar tudo

Declare
  nr_rep Number;
  v_top_rec  Number;
  v_cur_rec  Number;
  v_cur_block Varchar2(100) := :System.current_block;
Begin

  If :parameter.acao = 'A' Then
    -- Alterar                           
    Select Distinct pra.nr_repeticao
      Into nr_rep
      From pra               pra,
           resultado_exame   re,
           requisicao_exame  r,
           crm               c,
           resultados_gerais rg,
           anticorpos_pra    a,
           pessoa_fisica     pf,
           pessoa_juridica   pj,
           lista_exame       le
     Where rg.nr_amostra = :parameter.numero_amostra
       And rg.nr_amostra = re.nr_amostra
       And le.nr_requisicao = r.nr_requisicao
       And re.nr_amostra = le.nr_amostra
       And re.nr_controle = le.nr_controle
       And re.cd_servico = le.cd_servico
       And re.nr_repeticao = le.nr_repeticao_atual
       And rg.cd_servico = re.cd_servico
       And rg.nr_controle = re.nr_controle
       And rg.nr_repeticao = re.nr_repeticao
       And re.nr_amostra = pra.nr_amostra
       And re.cd_servico = pra.cd_servico
       And re.nr_controle = pra.nr_controle
       And re.nr_repeticao = pra.nr_repeticao
       And pra.cd_anticorpo = a.cd_anticorpo
       And c.cd_crm(+) = r.cd_crm
       And a.cd_classe = 1
       And pf.cd_pessoafisica = re.cd_pessoafisica
       And pj.id_pessoajuridica = r.cd_pessoajuridica
       And pra.dt_realizacao = rg.dt_realizacao
       And pra.dt_atualizacao = rg.dt_atualizacao
       And pra.cd_usuario = rg.cd_usuario;
  
    If :cd_anticorpo1 Is Not Null
       And :vl_anticorpo1 Is Not Null
       And :cd_anticorpo2 Is Not Null
       And :vl_anticorpo2 Is Not Null Then
    
      If :nr_repeticao = nr_rep Then
        Delete From pra
         Where nr_amostra = :nr_amostra
           And nr_repeticao = :nr_repeticao;
      End If;
    End If;
  End If;
  validar_obrigatorios;
  go_block('anticorpo1');
  v_top_rec := get_block_property('anticorpo1', top_record);
  v_cur_rec := get_block_property('anticorpo1', current_record);
  first_record;
  
  If :cd_anticorpo1 Is Not Null Then
    --Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
    Loop
    
      If :system.record_status In ('NEW', 'INSERT') Then
        If :cd_anticorpo1 Is Not Null
           And :vl_anticorpo1 Is Not Null Then
        
          Begin
          
            Insert Into pra
              (nr_amostra,
               nr_controle,
               nr_repeticao,
               cd_servico,
               cd_anticorpo,
               dt_realizacao,
               dt_atualizacao,
               cd_usuario,
               vl_anticorpo)
            Values
              (:resultados_gerais.nr_amostra,
               :resultados_gerais.nr_controle,
               :resultados_gerais.nr_repeticao,
               :resultados_gerais.cd_servico,
               :cd_anticorpo1,
               :resultados_gerais.dt_realizacao,
               :resultados_gerais.dt_atualizacao,
               :global.cd_pessoafisica,
               :vl_anticorpo1);
          
          Exception
            When Others Then
              controle_de_msg('ERR', Sqlerrm);
            
          End;
        End If;
      
        forms_ddl('commit');
        next_record;
      End If;
      Exit When :system.last_record = 'TRUE';
    End Loop;
  
  End If;
  go_record(v_top_rec);
  go_record(v_cur_rec);
  go_block('anticorpo2');
  v_top_rec := get_block_property('anticorpo2', top_record);
  v_cur_rec := get_block_property('anticorpo2', current_record);
  first_record;

  If :cd_anticorpo2 Is Not Null Then
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
  
    Loop
      If :system.record_status In ('NEW', 'INSERT') Then
        If :cd_anticorpo2 Is Not Null
           And :vl_anticorpo2 Is Not Null Then
        
          Begin
          
            Insert Into pra
              (nr_amostra,
               nr_controle,
               nr_repeticao,
               cd_servico,
               cd_anticorpo,
               dt_realizacao,
               dt_atualizacao,
               cd_usuario,
               vl_anticorpo)
            Values
              (:resultados_gerais.nr_amostra,
               :resultados_gerais.nr_controle,
               :resultados_gerais.nr_repeticao,
               :resultados_gerais.cd_servico,
               :cd_anticorpo2,
               :resultados_gerais.dt_realizacao,
               :resultados_gerais.dt_atualizacao,
               :global.cd_pessoafisica,
               :vl_anticorpo2);
          
          Exception
            When Others Then
              controle_de_msg('ERR', Sqlerrm);
          End;
        
        End If;
      
        forms_ddl('commit');
        next_record;
      
      End If;
      Exit When :system.last_record = 'TRUE';
    End Loop;
  End If;
  go_record(v_top_rec);
  go_record(v_cur_rec);
  go_block(v_cur_block);
  :system.messsage_level := 25;
  Commit;
  :system.messsage_level := 0;
  message('Todos os registros foram salvos!');
Exception
  When Others then
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.')
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge)
End;
Não revisei a ortografia, mas a lógica em si faria algo assim...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

SIM ELE SALVA NO BANCO. POREM, OCORRE EXATAMENTE O QUE você COMENTOU.
QUANDO ESTA EM BRANCO, OU SALVA E VOLTA EM BRANCO
ELE DA MENSAGEM DE ERRO, ORA-0001.
vOU TESTAR AQUI, E LOGO TE AVISO.
ESSA TELA ESTA ME DEIXANDO DE CABELO BRANCO. RS
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

OI GFKAUER, BOM DEU CERTO
POREM QUANDO COLOCO O

Selecionar tudo

Exit When :system.last_record = 'TRUE'
ELE NÃO SALVA A ULTIMA LINHA DE CADA BLOCO
SE EU COLOCO

Selecionar tudo

Exit When :cd_anticorpo2 is null
ELE DA ERRO, DIZENDO QUE PRECISA DELETAR OUTRO REGISTRO.
MAIS UMA VEZ, TE AGRADEÇO
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

ola, deu certo agora.
estava fazendo

Selecionar tudo

Exit When :cd_anticorpo2 is null 
para os dois loops.
Agora fechou
O cara, valeu mesmo. BRigadão
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Mude:

Selecionar tudo

        forms_ddl('commit');
        next_record;
     
      End If;
      Exit When :system.last_record = 'TRUE';
para:

Selecionar tudo

        forms_ddl('commit');
     
      End If;
      Exit When :system.last_record = 'TRUE';
      next_record;
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Isso mesmo. Deu certo. Até que enfim. BRigadão
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Gfkauer, tudo bom?
Deu outro problema. vê se você pode me ajudar
consigo deletar naquele seu codigo. QUando for igual a A, pra alterar
Mais quando eu desejo somente incluir. for Igual a I. Ele salva, porem da mensagem de duplicação, quando eu alterar e pedir pra salvar denovo.
EU deveria fazer outro delete. mais onde, como?
Sabe me dizer?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Qualsão as Keys da tabela pra?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Selecionar tudo

nr_amostra, nr_repeticao, nr_controle, cd_servico, cd_anticorpo.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Poderia especificar o que é cada nome destes, se uma primary, uma unique ou uma foreign...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Selecionar tudo

nr_amostra, nr_repeticao, nr_controle, cd_servico, cd_anticorpo.
Todos eles são primary.
Cara, essa tela ta me deixando de cabelo branco.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Reescrevi a minha sugestão antiga...

tente algo assim:

Selecionar tudo

Declare
  nr_rep Number;
  v_top_rec   Number;
  v_cur_rec   Number;
  v_cur_block Varchar2(100) := :System.current_block;
  v_nro_rec   Number;
Begin

  If :parameter.acao = 'A' Then
    -- Alterar                           
    Select Distinct pra.nr_repeticao
      Into nr_rep
      From pra               pra,
           resultado_exame   re,
           requisicao_exame  r,
           crm               c,
           resultados_gerais rg,
           anticorpos_pra    a,
           pessoa_fisica     pf,
           pessoa_juridica   pj,
           lista_exame       le
     Where rg.nr_amostra = :parameter.numero_amostra
       And rg.nr_amostra = re.nr_amostra
       And le.nr_requisicao = r.nr_requisicao
       And re.nr_amostra = le.nr_amostra
       And re.nr_controle = le.nr_controle
       And re.cd_servico = le.cd_servico
       And re.nr_repeticao = le.nr_repeticao_atual
       And rg.cd_servico = re.cd_servico
       And rg.nr_controle = re.nr_controle
       And rg.nr_repeticao = re.nr_repeticao
       And re.nr_amostra = pra.nr_amostra
       And re.cd_servico = pra.cd_servico
       And re.nr_controle = pra.nr_controle
       And re.nr_repeticao = pra.nr_repeticao
       And pra.cd_anticorpo = a.cd_anticorpo
       And c.cd_crm(+) = r.cd_crm
       And a.cd_classe = 1
       And pf.cd_pessoafisica = re.cd_pessoafisica
       And pj.id_pessoajuridica = r.cd_pessoajuridica
       And pra.dt_realizacao = rg.dt_realizacao
       And pra.dt_atualizacao = rg.dt_atualizacao
       And pra.cd_usuario = rg.cd_usuario;
 
    If :cd_anticorpo1 Is Not Null
       And :vl_anticorpo1 Is Not Null
       And :cd_anticorpo2 Is Not Null
       And :vl_anticorpo2 Is Not Null Then
   
      If :nr_repeticao = nr_rep Then
        Delete From pra
         Where nr_amostra = :nr_amostra
           And nr_repeticao = :nr_repeticao;
      End If;
    End If;
  End If;
  validar_obrigatorios;
  go_block('anticorpo1');
  v_top_rec := get_block_property('anticorpo1', top_record);
  v_cur_rec := get_block_property('anticorpo1', current_record);
  first_record;
 
  If :cd_anticorpo1 Is Not Null Then
    --Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
    Loop
   
      If :system.record_status In ('NEW', 'INSERT') Then
        If :cd_anticorpo1 Is Not Null
           And :vl_anticorpo1 Is Not Null Then
          Select count(1)
            Into v_nro_rec
            From pra p
           Where p.nr_amostra = :resultados_gerais.nr_amostra
             And p.nr_controle = :resultados_gerais.nr_controle
             And p.nr_repeticao = :resultados_gerais.nr_repeticao
             And p.cd_servico = :resultados_gerais.cd_servico
             And p.cd_anticorpo = :cd_anticorpo1;
        
        If v_nro_rec = 0 Then
          Begin
         
            Insert Into pra
              (nr_amostra,
               nr_controle,
               nr_repeticao,
               cd_servico,
               cd_anticorpo,
               dt_realizacao,
               dt_atualizacao,
               cd_usuario,
               vl_anticorpo)
            Values
              (:resultados_gerais.nr_amostra,
               :resultados_gerais.nr_controle,
               :resultados_gerais.nr_repeticao,
               :resultados_gerais.cd_servico,
               :cd_anticorpo1,
               :resultados_gerais.dt_realizacao,
               :resultados_gerais.dt_atualizacao,
               :global.cd_pessoafisica,
               :vl_anticorpo1);
         
          Exception
            When Others Then
              controle_de_msg('ERR', Sqlerrm);
           
          End;
        End If;
        v_nro_rec := 0;
        End If;
     
        forms_ddl('commit');
      End If;
      Exit When :system.last_record = 'TRUE';
      next_record;
    End Loop;
 
  End If;
  go_record(v_top_rec);
  go_record(v_cur_rec);
  go_block('anticorpo2');
  v_top_rec := get_block_property('anticorpo2', top_record);
  v_cur_rec := get_block_property('anticorpo2', current_record);
  first_record;

  If :cd_anticorpo2 Is Not Null Then
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
 
    Loop
      If :system.record_status In ('NEW', 'INSERT') Then
        If :cd_anticorpo2 Is Not Null
           And :vl_anticorpo2 Is Not Null Then
          Select count(1)
            Into v_nro_rec
            From pra p
           Where p.nr_amostra = :resultados_gerais.nr_amostra
             And p.nr_controle = :resultados_gerais.nr_controle
             And p.nr_repeticao = :resultados_gerais.nr_repeticao
             And p.cd_servico = :resultados_gerais.cd_servico
             And p.cd_anticorpo = :cd_anticorpo1;
       
          Begin
         
            Insert Into pra
              (nr_amostra,
               nr_controle,
               nr_repeticao,
               cd_servico,
               cd_anticorpo,
               dt_realizacao,
               dt_atualizacao,
               cd_usuario,
               vl_anticorpo)
            Values
              (:resultados_gerais.nr_amostra,
               :resultados_gerais.nr_controle,
               :resultados_gerais.nr_repeticao,
               :resultados_gerais.cd_servico,
               :cd_anticorpo2,
               :resultados_gerais.dt_realizacao,
               :resultados_gerais.dt_atualizacao,
               :global.cd_pessoafisica,
               :vl_anticorpo2);
         
          Exception
            When Others Then
              controle_de_msg('ERR', Sqlerrm);
          End;
        End If;
        v_nro_rec := 0;
       
        End If;
     
        forms_ddl('commit');
     
      End If;
      Exit When :system.last_record = 'TRUE';
      next_record;
    End Loop;
  End If;
  go_record(v_top_rec);
  go_record(v_cur_rec);
  go_block(v_cur_block);
  :system.messsage_level := 25;
  Commit;
  :system.messsage_level := 0;
  message('Todos os registros foram salvos!');
Exception
  When Others then
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.')
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge)
End;
e por favor poste os resultados.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Cara ta dando o mesmo problema. Ele da o erro ORA-0001
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Dae, conseguir fazer. Deu certo. Fiz um delete nesse if que você fez. Porém ele deletar algumas linhas. Não sei dizer o porque. Se eu modifico ele deleta alguma linhas

Selecionar tudo

Declare 
  nr_rep Number; 
  v_top_rec   Number; 
  v_cur_rec   Number; 
  v_cur_block Varchar2(100) := :System.current_block; 
  v_nro_rec   Number; 
Begin 

  If :parameter.acao = 'A' Then 
    -- Alterar                            
    Select Distinct pra.nr_repeticao 
      Into nr_rep 
      From pra               pra, 
           resultado_exame   re, 
           requisicao_exame  r, 
           crm               c, 
           resultados_gerais rg, 
           anticorpos_pra    a, 
           pessoa_fisica     pf, 
           pessoa_juridica   pj, 
           lista_exame       le 
     Where rg.nr_amostra = :parameter.numero_amostra 
       And rg.nr_amostra = re.nr_amostra 
       And le.nr_requisicao = r.nr_requisicao 
       And re.nr_amostra = le.nr_amostra 
       And re.nr_controle = le.nr_controle 
       And re.cd_servico = le.cd_servico 
       And re.nr_repeticao = le.nr_repeticao_atual 
       And rg.cd_servico = re.cd_servico 
       And rg.nr_controle = re.nr_controle 
       And rg.nr_repeticao = re.nr_repeticao 
       And re.nr_amostra = pra.nr_amostra 
       And re.cd_servico = pra.cd_servico 
       And re.nr_controle = pra.nr_controle 
       And re.nr_repeticao = pra.nr_repeticao 
       And pra.cd_anticorpo = a.cd_anticorpo 
       And c.cd_crm(+) = r.cd_crm 
       And pf.cd_pessoafisica = re.cd_pessoafisica 
       And pj.id_pessoajuridica = r.cd_pessoajuridica 
       And pra.dt_realizacao = rg.dt_realizacao 
       And pra.dt_atualizacao = rg.dt_atualizacao 
       And pra.cd_usuario = rg.cd_usuario; 
  
    If :cd_anticorpo1 Is Not Null 
       And :vl_anticorpo1 Is Not Null 
       And :cd_anticorpo2 Is Not Null 
       And :vl_anticorpo2 Is Not Null Then 
    
      If :nr_repeticao = nr_rep Then 
        Delete From pra 
         Where nr_amostra = :nr_amostra 
           And nr_repeticao = :nr_repeticao; 
      End If; 
    End If; 
  End If; 
  validar_obrigatorios; 
  go_block('anticorpo1'); 
  v_top_rec := get_block_property('anticorpo1', top_record); 
  v_cur_rec := get_block_property('anticorpo1', current_record); 
  first_record; 
  
  If :cd_anticorpo1 Is Not Null Then 
    --Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA 
    Loop 
    
      If :system.record_status In ('NEW', 'INSERT') Then 
        If :cd_anticorpo1 Is Not Null 
           And :vl_anticorpo1 Is Not Null Then 
          Select count(1) 
            Into v_nro_rec 
            From pra p 
           Where p.nr_amostra = :resultados_gerais.nr_amostra 
             And p.nr_controle = :resultados_gerais.nr_controle 
             And p.nr_repeticao = :resultados_gerais.nr_repeticao 
             And p.cd_servico = :resultados_gerais.cd_servico 
             And p.cd_anticorpo = :cd_anticorpo1; 
        
        If v_nro_rec = 0 Then 
          Begin 
          
            Insert Into pra 
              (nr_amostra, 
               nr_controle, 
               nr_repeticao, 
               cd_servico, 
               cd_anticorpo, 
               dt_realizacao, 
               dt_atualizacao, 
               cd_usuario, 
               vl_anticorpo) 
            Values 
              (:resultados_gerais.nr_amostra, 
               :resultados_gerais.nr_controle, 
               :resultados_gerais.nr_repeticao, 
               :resultados_gerais.cd_servico, 
               :cd_anticorpo1, 
               :resultados_gerais.dt_realizacao, 
               :resultados_gerais.dt_atualizacao, 
               :global.cd_pessoafisica, 
               :vl_anticorpo1); 
          
          Exception 
            When Others Then 
              controle_de_msg('ERR', Sqlerrm); 
            
          End; 
        --End If; 
        else 
        Delete From pra 
        Where nr_amostra = :nr_amostra 
        And nr_repeticao = :nr_repeticao; 
        end if;  
        v_nro_rec := 0; 
        End If; 
      
        forms_ddl('commit'); 
      End If; 
     Exit When :system.last_record = 'TRUE';
      next_record; 
    End Loop; 
  
  End If; 
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block('anticorpo2'); 
  v_top_rec := get_block_property('anticorpo2', top_record); 
  v_cur_rec := get_block_property('anticorpo2', current_record); 
  first_record; 

  If :cd_anticorpo2 Is Not Null Then 
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA 
  
    Loop 
      If :system.record_status In ('NEW', 'INSERT') Then 
        If :cd_anticorpo2 Is Not Null 
           And :vl_anticorpo2 Is Not Null Then 
          Select count(1) 
            Into v_nro_rec 
            From pra p 
           Where p.nr_amostra = :resultados_gerais.nr_amostra 
             And p.nr_controle = :resultados_gerais.nr_controle 
             And p.nr_repeticao = :resultados_gerais.nr_repeticao 
             And p.cd_servico = :resultados_gerais.cd_servico 
             And p.cd_anticorpo = :cd_anticorpo2; 
        
          Begin 
          
            Insert Into pra 
              (nr_amostra, 
               nr_controle, 
               nr_repeticao, 
               cd_servico, 
               cd_anticorpo, 
               dt_realizacao, 
               dt_atualizacao, 
               cd_usuario, 
               vl_anticorpo) 
            Values 
              (:resultados_gerais.nr_amostra, 
               :resultados_gerais.nr_controle, 
               :resultados_gerais.nr_repeticao, 
               :resultados_gerais.cd_servico, 
               :cd_anticorpo2, 
               :resultados_gerais.dt_realizacao, 
               :resultados_gerais.dt_atualizacao, 
               :global.cd_pessoafisica, 
               :vl_anticorpo2); 
          
          Exception 
            When Others Then 
              controle_de_msg('ERR', Sqlerrm); 
          End; 
           else 
        	  Delete From pra 
         Where nr_amostra = :nr_amostra 
           And nr_repeticao = :nr_repeticao; 
     
        End If; 
        v_nro_rec := 0; 
        
        End If; 
      
        forms_ddl('commit'); 
      
     -- End If; 
      Exit When :system.last_record = 'TRUE';
      next_record; 
    End Loop; 
  End If; 
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block(v_cur_block); 
  :system.message_level := 25; 
  Commit; 
  :system.message_level := 0; 
  message('Operação Realizada com Sucesso!'); 
Exception 
  When Others then 
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.'); 
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge) ;
End; 
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Pra ser bem exato.
Ele não salva a primeira linha do cd_anticorpo1.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Porém ele deletar algumas linhas. Não sei dizer o porque. Se eu modifico ele deleta alguma linhas
cuma???

Não entendi o que você quis dizer com esta frase acima...
O seu delete não é pela pk da tabela, desta forma você poderá excluir dados indevidos... revisa isso e reavalia este delete...
Qualquer coisa questiona quem analisou se ele realmente quer que exclua os registro que seriam duplicados...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

OIiii
Consegui fazer. Mais o site estava fora....
Então Lá vai.

Selecionar tudo

Declare 
	
  nr_rep Number; 
  REP NUMBER;
  v_top_rec   Number; 
  v_cur_rec   Number; 
  v_cur_block Varchar2(100) := :System.current_block; 
  v_nro_rec   Number; 
  
Begin 
-- fAZ DELETE NO CASO DE ALTERAR RESULTADO
  If :parameter.acao = 'A' Then 
                    
    Select Distinct pra.nr_repeticao 
      Into nr_rep 
      From pra               pra, 
           resultado_exame   re, 
           requisicao_exame  r, 
           crm               c, 
           resultados_gerais rg, 
           anticorpos_pra    a, 
           pessoa_fisica     pf, 
           pessoa_juridica   pj, 
           lista_exame       le 
     Where rg.nr_amostra = :parameter.numero_amostra 
       And rg.nr_amostra = re.nr_amostra 
       And le.nr_requisicao = r.nr_requisicao 
       And re.nr_amostra = le.nr_amostra 
       And re.nr_controle = le.nr_controle 
       And re.cd_servico = le.cd_servico 
       And re.nr_repeticao = le.nr_repeticao_atual 
       And rg.cd_servico = re.cd_servico 
       And rg.nr_controle = re.nr_controle 
       And rg.nr_repeticao = re.nr_repeticao 
       And re.nr_amostra = pra.nr_amostra 
       And re.cd_servico = pra.cd_servico 
       And re.nr_controle = pra.nr_controle 
       And re.nr_repeticao = pra.nr_repeticao 
       And pra.cd_anticorpo = a.cd_anticorpo 
       And c.cd_crm(+) = r.cd_crm 
       And pf.cd_pessoafisica = re.cd_pessoafisica 
       And pj.id_pessoajuridica = r.cd_pessoajuridica 
       And pra.dt_realizacao = rg.dt_realizacao 
       And pra.dt_atualizacao = rg.dt_atualizacao 
       And pra.cd_usuario = rg.cd_usuario; 
  
    If :cd_anticorpo1 Is Not Null And :vl_anticorpo1 Is Not Null 
       And :cd_anticorpo2 Is Not Null And :vl_anticorpo2 Is Not Null Then 
    
      If :nr_repeticao = nr_rep Then 
        Delete From pra 
        Where nr_amostra = :nr_amostra 
        And nr_repeticao = :nr_repeticao; 
      End If; 
    End If; 
  End If; 
  -- FINALIZA ALTERAÇÃO
 
 --ENTRA NO BLOCO ANTICORPO1  
  go_block('anticorpo1'); 
  v_top_rec := get_block_property('anticorpo1', top_record); 
  v_cur_rec := get_block_property('anticorpo1', current_record); 
  first_record; 
  
  If :cd_anticorpo1 Is Not Null Then 
     --Faz pesquisa no banco para verificar se já possui alterações. Se possuir, deletar e salvar no loop
       Select count(1) Into v_nro_rec
          From pra p 
          Where p.nr_amostra = :resultados_gerais.nr_amostra 
          And p.nr_controle = :resultados_gerais.nr_controle 
          And p.nr_repeticao = :resultados_gerais.nr_repeticao 
          And p.cd_servico = :resultados_gerais.cd_servico 
          And p.cd_anticorpo = :cd_anticorpo1; 
        
        if v_nro_rec > 0 then
     	  Delete From pra 
        Where nr_amostra = :nr_amostra 
        And nr_repeticao = :nr_repeticao; 
        end if;
      
      --Inicia o Loop, para inserir dados anticorpo1         
   Loop 
     If :system.record_status In ('NEW', 'INSERT') Then 
        If :cd_anticorpo1 Is Not Null And :vl_anticorpo1 Is Not Null Then 
         
                  
          Begin 
          --Faz insert no bloco pra
          Insert Into pra 
              (nr_amostra, 
               nr_controle, 
               nr_repeticao, 
               cd_servico, 
               cd_anticorpo, 
               dt_realizacao, 
               dt_atualizacao, 
               cd_usuario, 
               vl_anticorpo) 
          Values 
              (:resultados_gerais.nr_amostra, 
               :resultados_gerais.nr_controle, 
               :resultados_gerais.nr_repeticao, 
               :resultados_gerais.cd_servico, 
               :cd_anticorpo1, 
               :resultados_gerais.dt_realizacao, 
               :resultados_gerais.dt_atualizacao, 
               :global.cd_pessoafisica, 
               :vl_anticorpo1); 
          
          Exception 
            When Others Then 
              controle_de_msg('ERR', Sqlerrm); 
          End; 
             
     End If; 
    forms_ddl('commit'); 
    End If; 
    Exit When :system.last_record = 'TRUE'; 
    next_record;   
    End Loop; 
    End If; 
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  --FINALIZA ANTICORPO1
  
  
  --INICIAR BLOCO ANTICORPO2
  go_block('anticorpo2'); 
  v_top_rec := get_block_property('anticorpo2', top_record); 
  v_cur_rec := get_block_property('anticorpo2', current_record); 
  first_record; 

  If :cd_anticorpo2 Is Not Null Then 
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA 
  
    Loop 
      If :system.record_status In ('NEW', 'INSERT') Then 
        If :cd_anticorpo2 Is Not Null And :vl_anticorpo2 Is Not Null Then 
        
         Select count(1) Into v_nro_rec 
           From pra p 
           Where p.nr_amostra = :resultados_gerais.nr_amostra 
           And p.nr_controle = :resultados_gerais.nr_controle 
           And p.nr_repeticao = :resultados_gerais.nr_repeticao 
           And p.cd_servico = :resultados_gerais.cd_servico 
           And p.cd_anticorpo = :cd_anticorpo2; 
        
          Begin 
          
            Insert Into pra 
              (nr_amostra, 
               nr_controle, 
               nr_repeticao, 
               cd_servico, 
               cd_anticorpo, 
               dt_realizacao, 
               dt_atualizacao, 
               cd_usuario, 
               vl_anticorpo) 
            Values 
              (:resultados_gerais.nr_amostra, 
               :resultados_gerais.nr_controle, 
               :resultados_gerais.nr_repeticao, 
               :resultados_gerais.cd_servico, 
               :cd_anticorpo2, 
               :resultados_gerais.dt_realizacao, 
               :resultados_gerais.dt_atualizacao, 
               :global.cd_pessoafisica, 
               :vl_anticorpo2); 
          
          Exception 
            When Others Then 
              controle_de_msg('ERR', Sqlerrm); 
          End; 
      end if;
      -- v_nro_rec := 0; 
        
        forms_ddl('commit'); 
       
        End If; 

      Exit When :system.last_record = 'TRUE'; 
      next_record; 
    End Loop; 
  End If; 
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block(v_cur_block); 
  
  :system.message_level := 25; 
  Commit; 
  :system.message_level := 0; 
  message('Operação Realizada com sucesso!'); 
  
Exception 
  When Others then 
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.') ;
    message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge) ;
End; 

Brigada pela ajuda.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

tO COM OUTRO PROBLEMA EM UM WHEN BUTTON pRESS
dEPOIS QUE SALVO O VALOR IGUAL A ZERO
DEPOIS QUANDO VOU ALTERAR QUERO MUDAR ESSE VALOR PRA 5 POR EXEMPLO
pRECISO APERTAR UMA BOTÃO PRA INSERIR OS VALORES
ENTÃO OS CAMPOS FICAM TODOS ATIVADOS
POREM DA O MESMO ERRO DE NAVEGAÇÃO


Selecionar tudo

declare
 cursor c1 is select cd_anticorpo from anticorpos_pra where cd_classe = 1 order by cd_anticorpo;
 r1 	c1%rowtype;						
begin

    open c1;
 
    go_block('ANTICORPO1');
    first_record;
        
    loop
    	fetch c1 into r1;
    	exit when c1%notfound;
 			
 			if r1.cd_anticorpo is not null then
 			 		:cd_anticorpo1 := r1.cd_anticorpo;
 	       	next_record;
 	        end if;
                
     end loop;
     first_record;
     close c1;
 
 	  
exception  
	when no_data_found then  
  controle_de_msg('ERR','Não existem anticorpos cadastrados!');
end;
Responder
  • Informação
  • Quem está online

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