Erro frm - 40106 não há itens navegaveis

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

TO com esse errinho ai FRM-40106
O que acontece tenho um loop que quando o valor for igual a ZERO
Meus campo, auxiliares. Ficam desabilitados e esses campos ficam tudo zerado
POrem quando peço pra salvar da esse erro.
Sei que é por causa de um go_block, porem sou obrigada a deixar essa go_block.
Será que alguém ai pode me ajudar.

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.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  
If :cd_anticorpo1 Is Not Null and :vl_anticorpo1 is not null Then
 
   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 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;
     End If; 
      
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  --FINALIZA ANTICORPO1 
  --end if;
  
  If :cd_anticorpo2 Is Not Null and :vl_anticorpo2 is not null Then 
  --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; 

  
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA 
  If :cd_anticorpo2 Is Not Null and :vl_anticorpo2 is not null Then 
    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); 
  end if;
  
    If :parameter.acao = 'I' Then 
   		validar_obrigatorios; 
  	commit_form;
    	habilitar_botoes;
  	else
  :system.message_level := 25; 
  Commit; 
  :system.message_level := 0; 
  message('Operação Realizada com sucesso!');
 end if;
  
End;
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

poem um desses itens desse bloco com visivel,
nem que você tenha que setar o tamanho dele com 1 de largura e 1 de altura, um item do bloco tem que ser navegavel se você esta indo pra ele...

só um detalhe

Selecionar tudo

forms_ddl('commit'); 
isso é perigoso, pois se no commit der algum erro você não ficara sabendo,

trigger/chave, qualquer coisa...

uma solucao é tentar o uso do POST
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

E como eu faria o uso do post.
você diz o post_commit
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

só POST;

mas da uma lida nele,

é como se fosse um commit...
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 uma duvida por aqui
Situação:
Tenho essa tela, que já comentada. RS
Apos salvar tela tudo preenchido. Se o usuario for alterar.
E digitar um valor zero pra o campo vl_resultado1
o campo cd_anticorpo1 devera ficar nulo. Como eu faço isso em tempo de execução?

Agradeço desde já
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

pode ser no when-validate-item do campo vl_resultado,

Selecionar tudo

:cd_anticorpo1 := null;
ou um IF no key-commit
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Então. Ele tem um loop. por estar dessa maneira. e ser blocos auxiliares

Selecionar tudo

text 1
text 1
text 1

se eu colocar apenas null
ele coloca so uma linha
preciso que seja em todas
fiz uma procedure pra um loop. porem no validate item não aceita go_block
Mais alguma ideia
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Consegui Diego.
Coloquei um if no meu key_commit dentro de um loop que eu já tinha
Obrigada
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Não querendo ser folgada!
vê se você pode me ajudar com mais uma coisa. Agora quando peço pra salvar. E deixo tudo zerado. os dois campos auxiliares. Salva normal. Quando vou alterar e inserir no lugar do zero um 4 por exemplo no campo cd_anticorpo 1. Ele da o erro ora-01403.

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.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  
--If :cd_anticorpo1 Is Not Null and :vl_anticorpo1 is not null Then
 
  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 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 :vl_resultado1 = 000 then
          	:cd_anticorpo1 := null;
          	:vl_anticorpo1 := null;
   	end if;
   	
     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 
  --end if;
  
  --If :cd_anticorpo2 Is Not Null and :vl_anticorpo2 is not null Then 
  --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; 

  
    --Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA 
  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; 
         
        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; 
    End If; 
   
  go_record(v_top_rec); 
  go_record(v_cur_rec); 
  go_block(v_cur_block); 
   --end if;
  
    If :parameter.acao = 'I' Then 
   		validar_obrigatorios; 
  	commit_form;
    	habilitar_botoes;
  	else
  :system.message_level := 25; 
  Commit; 
  :system.message_level := 0; 
  message('Operação Realizada com sucesso!');
 end if;

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

esse codigo ta sinistro, veja os lugares onde você tem SELECT
e coloque tratativas neles

Selecionar tudo

WHEN NO_DATA_FOUND THEN
  MESSAGE('1');
END;
ai você vai descubrir em que lugar o select não retorna dados.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Era no primeiro select.
Estava fazendo delete demais.
Pronto agora esta certo. Tirei o primeiro select
Responder
  • Informação
  • Quem está online

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