Insert quando null

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

Estou com um problema no LOOP.
No LOOP peço que faça um insert no bloco. POrém pode acontecer que um determinado campo seja nulo, quando eu deixo nulo ele não salva no banco. alguém sabe tratar esse problema.....
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

Se tu quer salvar os dados de um bloco, qual o motivo do loop? Ele não é base table?

Ele não salva apenas um campo ou não salva um registro inteiro quando um campo m especifico é nulo?

Este erro acontece só com um campo em especial ou qualquer campo do formulário?

É apontado algum erro ou apenas para o processo?

Ele salva os registros posteriores ao registro com dado nulo?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Sim são dois campos não base table.....
Não salva o registro todo. Mais quando um campo especifico está nulo. Quando esse campo esta preenchido salva tudo.
Não aponta nenhuma erro, ele deveria salvar normalmente.
So salva esse campo especifico quando estiver preenchido....
Mais deveria salvar também quando nulo
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

VOu Postar aqui o codigo.
Bom esse codigo já postei ate aqui. De tanto problema que me traz..

Selecionar tudo

  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 
 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 and :vl_anticorpo1 is not null
	or :cd_anticorpo1 is null and :vl_anticorpo1 is 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 
               Delete From pra 
               Where nr_amostra = :nr_amostra 
               And nr_repeticao = :nr_repeticao; 
            end if; 
       
    
    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; 
   
         forms_ddl('commit'); 
        end if; 
      End If; 

      Exit When :system.last_record = 'TRUE'; 
 
      next_record; 
      End Loop; 
   
   
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block(v_cur_block); 
  End If; 
  --finaliza bloco 1
  
  --Iniciar bloco anticorpo 2
    If :cd_anticorpo2 Is Not Null and :vl_anticorpo2 is not null 
    	or :cd_anticorpo2 Is Null and :vl_anticorpo2 is null    	Then 
  go_block('anticorpo2'); 
  v_top_rec := get_block_property('anticorpo2', top_record); 
  v_cur_rec := get_block_property('anticorpo2', current_record); 
  first_record; 


  	      
  	      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; 
         
            if v_nro_rec > 0 then 
               Delete From pra 
               Where nr_amostra = :nr_amostra 
               And nr_repeticao = :nr_repeticao; 
            end if; 
         
    
    Loop 
    /*	if :vl_resultado2 = 000 then
         :cd_anticorpo2 := null;
         :vl_anticorpo2 := null;
    	end if;*/
    
      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'); 
      End If; 

      Exit When :system.last_record = 'TRUE'; 
      next_record; 
      End Loop; 
  
   
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block(v_cur_block); 
  End If; 
  
If :parameter.acao = 'I' Then 
 		commit_form;
   	habilitar_botoes;
else
:system.message_level := 25; 
Commit; 
:system.message_level := 0; 
message('Operação Realizada com Sucesso!');

end if;
 
End;
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

Primeiramente eu preciso entender um pouco o que tu estas a fazer para então poder dar a melhor sugestão.

Porque o bloco é não base table?
Como esta estruturado seu loop?
(preferencia postar o código)
Qual o motivo de salvar um registro nulo? ou estas informações são parde de um registro e o que você esta fazendo é atualiza-lo?
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

Mais uma coisa, se este código esta a lhe dar tantos problemas assim, esta na hora de repensar sua tela e quems sabe refazer ela de forma a não precisar deste código.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

sIM JÁ PENSEI EM MUDAR. MAIS PRECISO COM MAIS URGENCIA. SE NÃO PARA TUDO.

PRA ENTENDER MELHOR....
PRECISO QUE SALVE MESMO QUANDO OS VALORES CD_ANTICORPO1 E 2 SEJAM NULOS.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

tIPO, ELES NÃO são DATA TABLE.
porque PRECISO DE UMA TELA COM 2 RESULTADOS. POREM FICAM SALVO EM UM BLOCO SO E UM CAMPO SO CHAMADO CD_ANTICORPO, VL_ANTICORPO. NÃO ESTOU ATUALIZADO. SÃO PARTE DE UM REGISTRO...
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

Ele não salva pois sua lógica os impede...

Selecionar tudo

If :cd_anticorpo1 Is Not Null
     And :vl_anticorpo1 Is Not Null
     Or :cd_anticorpo1 Is Null
     And :vl_anticorpo1 Is Null Then
Graças a este comando, se os dois campos estiverem vazios ou cheios, ele obriga a salvar, caso um esteja vazio e o outro não ele não salvara.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

rETIREI ESSE CODIGO.
PORÉM AINDA NÃO SALVA.....
PERCEBI QUANDO RETIRO O

Selecionar tudo

If :cd_anticorpo1 Is Not Null And :vl_anticorpo1 Is Not Null Then
DENTRO DO LOOP ANTES DO INSERT.
ELE NÃO ME DEIXA INSERIR POR ESTAR NULO....
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 acaso algum destes campos é obrigatório na tabela?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Na tela não é obrigatorio. mais no banco o cd_anticorpo não pode ser nulo
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

Ai esta, se na tabela ele é obrigatório vce não tem como inserir sem o informar não importa o que a tela diz... você não conseguirá persistir esta informação no banco...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Gfkauer....
POis depois que postei aqui, fiquei pensando nisso.
Mais mesmo assim obrigada pela ajuda. Pensei em uma forma de gerar um relatorio atraves desse tela. e imprimir da mesma forma.
Mais gostaria de uma dica sua. Qual seria a melhor forma de fazer esse codigo.... Nesse situação....

Tenho duas colunas, na tela. Uma chamada cd_anticorpo1 e outra cd_anticorpo2
Porem vão salvar em um mesmo campo chamado cd_anticorpo1...
Sabe qual melhor forma??...

Obrigada pela atenção
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

teria que testar com IF,

ou então nvl(anticorpo1, anticorpo2) no insert,

se um estiver nulo grava o 2, mas ai tem que ver qual a sua regra, de quando grava 1 e quando grava o 2,
Responder
  • Informação
  • Quem está online

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