Ajuda

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

Será que alguém pode me ajudar ai.
Já resolvi esse problema de salvar. Tinha que colocar no key_commit
Porem eu tenho 8 registro do campo cd_bloco1. Quando salva, salva somente a primeira ou o ultimo registro.
Preciso que salve todos que eu colocar. alguém tem uma ideia como fazer????
Ele esta assim

cd_bloco1 LOV
cd_bloco1 LOV
cd_bloco1 LOV
cd_bloco1 LOV
cd_bloco1 LOV
cd_bloco1 LOV
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

O pessoa alguém me ajuda.
PReciso fazer esse loop. PRa salvar mais de uma linha no banco
Lembrando tenho um aux e um bloco de banco de dados.

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

alguém pra ajudar???
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

Se o seu bloco não é BASE TABLE, então você vai ter que percorrer CADA LINHA (com um loop, por exemplo) e inserir manualmente as linhas.

Dai quando você commitar, vai comitar todos.

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

Ola dr_gori
Exatamente isso que eu queria.
Dentro do loop coloco a seguinte forma
:PRA.cd_codigo := aux.cd_codigo;
POrem não salva todas as linhas.
Tenho dois base table. Com esse cd_codigo do mesmo bloco PRA.
Tem algum exemplo pra me ajudar. Onde eu coloco o LOOP em que trigger.... no proprio key_commit?

Att.
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

Bom, pelo que eu entendi, você ta querendo copiar os dados desse bloco não BASE TABLE, pra um base-table...

Eu acho que não vale a pena fazer isso, pois você tem que fazer assim:

LOOP (pra cada linha do bloco de controle)
1. Ir pro bloco BASE TABLE
2. Criar uma nova linha nesse bloco
3. Copiar as informações do não BASE TABLE
4. Voltar pro bloco não BASE TABLE
5. NEXT RECORD
END LOOP.


Eu acho que é mais facil você simplesmente fazer o INSERT direto na tabela.

LOOP (pra cada linha do bloco de controle)
1. INSERT INTO suatabela ......
2. NEXT RECORD
END LOOP
COMMIT

Não tenho nenhum exemplo aqui, mas o caminho é esse.
Qualquer dúvida, prende o grito !
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Dr_gori

Olha só fiz dessa maneira

Selecionar tudo

  LOOP
   
     IF :SYSTEM.RECORD_STATUS <> 'NEW'  THEN
     	if :cd_anticorpo1 is not null and :vl_anticorpo1 is not null then
  		
  		insert into PRA (nr_amostra, nr_controle, nr_repeticao, cd_anticorpo, vl_anticorpo, cd_servico,
  			dt_realizacao, dt_atualizacao, cd_usuario) values (:parameter.numero_amostra, :parameter.numero_controle,
  			:parameter.numero_repeticao, :cd_anticorpo1, :vl_anticorpo1, :parameter.codigo_servico, sysdate,
  			sysdate, :global.cd_pessoafisica);
			   
 			end if;
     	 CREATE_RECORD;
     END IF;
 
  END LOOP;	
e da o erro ORA-01400
Porem todos os campo estão preenchido nenhum esta nulo.
Sabe me dizer o que eu passo estar errado. Coloquei no Pré insert do Base Table do SQL. Porem não aceita também o create_record.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Dr_gori
Fiz de outra maneira e da o seguinte erro FRM40102

Selecionar tudo

 LOOP
   GO_BLOCK('ANTICORPO1');
   FIRST_RECORD;
     IF :SYSTEM.RECORD_STATUS in ('NEW','INSERT')  THEN
     	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
  	  :PRA.cd_anticorpo := :cd_anticorpo1;
     :PRA.vl_anticorpo := :vl_anticorpo1;
     :PRA.cd_anticorpo := :cd_anticorpo2;
     :PRA.vl_anticorpo := :vl_anticorpo2;
		   
		   
     	end if;
     	
     	CREATE_RECORD;
     	
     END IF;
     IF :SYSTEM.LAST_RECORD ='TRUE' THEN
     	EXIT;
     END IF;
     NEXT_RECORD;
   
  END LOOP;	
-- teste;
 commit_form;
Na trigger Key_commit. do formulario.

Podes me ajudar?
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

Bom, no primeiro exemplo, você não precisa fazer CREATE_RECORD.
Você ta inserindo direto no banco.

Daí basta comitar, e quando você for fazer EXECUTE_QUERY, seus dados estarão na tabela. (essa é uma forma, as vezes não é possível fazer isso dependendo do contexto).


No segundo exemplo, tente assim:

Selecionar tudo

GO_BLOCK('bloco1');
FIRST_RECORD;
LOOP
  --aqui copia pra dentro de alguma var, ou array, etc.
  GO_BLOCK('bloco2');
  create_record;
  -- aqui copia todos os campos
  GO_BLOCK('BLOCO1')

Exit when :System.last_record='TRUE'; 
END LOOP;
Eu não testei isso aqui, é só uma idéia... Provavelmente tem que testar algumas coisas a mais. Eu prefiro usar menos possível o forms, go-BLOCK, essas coisas...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

DESCULPA DR_GORI. TA CHATEANDO. MAIS AGORA NÃO DA ERRO NENHUM, POREM SÓ INSERI UMA LINHA. TENHO DOIS NÃO BASE TABLE. ONDE ELES TEM QUE INSERIR NUM MESMO BASE TABLE.

Selecionar tudo

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 
       					 :cd_anticorpo1 := a1; 
       					 :vl_anticorpo1 := b1; 
    		        					go_block('PRA');
        			  					create_record;
          											a1 := :cd_anticorpo;
          											b1 := :vl_anticorpo;
          			
       				end if; 
        						
   GO_BLOCK('ANTICORPO2'); 
   NEXT_RECORD; 
    
        			if :cd_anticorpo2 is not null and :vl_anticorpo2 is not null then 
       				:cd_anticorpo2 := a2; 
      				:vl_anticorpo2 := b2; 
    
  			        					go_block('PRA');
        			  					create_record;
          											a2 := :cd_anticorpo;
          											b2 := :vl_anticorpo;
          			
       				end if; 
        							go_block('ANTICORPO2');               
     		END IF; 
       	Exit when :System.last_record='TRUE';  
     		END LOOP;    
 commit_form;
END;

ONDE ESTOU ERRANDO?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

alguém sabe tratar o ORA-00001
Fiz o Loop e ta dando meio certo agora.
Só ta dando o erro de duplicação.

alguém ajuda ai
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Fiz o loop, esse de baixo. Mais ele só esta salvando 1 linha.


if :cd_anticorpo1 is not null and :vl_anticorpo1 is not null then


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);


end if;

alguém pra ajudar...................
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

BOm Pessoa pronto, consegui a ajuda de um colega aqui é já deu certo.
Era só fazer um loop para cada bloco no key_commit.
Responder
  • Informação