Como alimentar blocao não base table com cursor???

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

povo, estou precisando de um exemplo simples aqui, mas que não lembro como faz! :S vi isso no cursinho e até agora não tinha trabalhado ainda com bloco multi record

o select retorna 4 registros num determinado filtro aqui, mas ele só alimenta a primeira linha do bloco, as demais ficam desabilitadas

não me lembro como faço um 'insert' no bloco dentro do loop! :(

imaginei algo assim:

Selecionar tudo

DECLARE
    CURSOR c_ IS 	
	SELECT gelogramal.inra_ddd,
          gelogramal.inra_nr,
	       gelogramal.lora_dt,
	       gelogramal.lora_qt_duracao,
	       gelogramal.lora_nr_custo,
	       gelogramal.lora_bo_particular
	  FROM gelogramal
	 WHERE gelogramal.rama_nr_ddd   = :b01.ddd
	   AND gelogramal.rama_nr_ramal = :b01.ramal                             
	   AND gelogramal.lora_dt BETWEEN :b01.dt_inicial AND :b01.dt_final; 
	
BEGIN

	FOR reg IN c_ LOOP	
      :b02.inra_ddd := reg.inra_ddd;
		:b02.inra_nr  := reg.inra_nr;
		:b02.lora_dt  := reg.lora_dt;
		:b02.lora_nr_custo 	    := reg.lora_nr_custo;
		:b02.lora_qt_duracao    := reg.lora_qt_duracao;
		:b02.lora_bo_particular := reg.lora_bo_particular;			
	END LOOP;	
	
	IF c_%NOTFOUND THEN 
		MSG_AGENERICO('Cursor vazio!');
	END IF;
	
END;
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

Acho que você está procurando por CREATE_RECORD;
:-o
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

valeu Gori, agora estou aprimorando aqui...


vai a dica aí tb, com a palavra chave ficou tranquilo de achar no help:

Selecionar tudo

/*  

** Built-in:  CREATE_RECORD 
** Example:   Populate new records in a block based on return 
**            values from a query 
*/ 
PROCEDURE Populate_Rows_Into_Block( projid NUMBER)  IS 
  CURSOR tempcur( cp_projid NUMBER ) IS 
    SELECT milestone_name, due_date 
      FROM milestone 
     WHERE project_id = cp_projid 
    ORDER BY due_date; 
BEGIN 
  /* Add these records to the bottom of the block */ 
  Last_Record; 
  /* Loop thru the records in the cursor */ 
  FOR rec IN tempcur( projid ) LOOP 
    /* 
    ** Create an empty record and set the current row's 
    ** Milestone_Name and Due_Date items. 
    */ 
    Create_Record; 
  : Milestone.Milestone_Name := rec.milestone_name; 
  : Milestone.Due_Date       := rec.due_date; 
  END LOOP; 
  First_Record; 
END; 
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

vamos ao pergaminho...

galera, preciso de um help de novo, estive mexendo com outras coisas mas agora preciso retomar e mudei o esquema dessa tela de acordo com um conselho de um amigo (que infelizmente não pode me ajudar na seqüência)

ele sugeriu eu utilizar bloco 'BASE TABLE' ao invés no 'NO BASE TABLE', assim o fiz, consegui alimentar o bloco normalmente dessa forma:

Selecionar tudo

WHEN-BUTTON-PRESSED do botão de pesquisa:

GO_BLOCK('B02');		
CLEAR_BLOCK(NO_VALIDATE);
EXECUTE_QUERY;
ligado a tabela GELOGRAMAL (Log dos Ramais telefônicos), cláusula Where e Order By devidamente configuradas, tdo belezinha, quando o bloco é populado, eu tenho um campo onde preciso especificar o funcionário (LOV buscando funcionário de outra tabela) que fez aquela ligação e se ela é particular ou não (check), os demais campos são só pra visualização (display)

tudo está funcionando, exceto a parte de gravação, quando clico para salvar, estou tentando algo como POST e/ou COMMIT:

Selecionar tudo

WHEN-BUTTON-PRESSED do botão de pesquisa:
IF MSG_AGENERICO_SN( 'Deseja gravar as alterações?' ) = ALERT_BUTTON1 THEN		

  GO_BLOCK('b02');	
  POST;
  COMMIT;    	
END IF;
mas o sistema deve estar chamando alguma função da biblioteca que diz 'Campo obrigatório não preenchido', a impressão que eu tenho é que o bloco 'pensa' que eu estou incluindo um novo registro, quando na verdade isso não acontece nesse bloco, o usuário apenas altera o duas colunas

fiz o teste aqui e o status do bloco está como :System.Record_Status = INSERT


dúvida, o bloco realmente está no status que deve estar para ser editado?, se não, como eu faço pra deixá-lo nessa situação?

foi mal aí se a dúvida foi meio idiota, mas é que até agora só tinha trabalho com lists ao invés de blocos base-table multirecord
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

ah, e debugando, TODOS os campos chaves/not nulls estão preenchidos
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

é hoje! hehe

esqueci de um detalhe, o status ali é do registro e não do bloco, como tinha dito


e o status do bloco está assim:

:System.Block_Status = QUERY
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

galera, desculpem o transtorno, consegui resolver aqui (COMMIT_FORM), não tinha nada a ver com bloco base table ou status e etc, era um outra função da biblioteca padrão do sistema aqui que tava ferrando o negócio!
Responder
  • Informação
  • Quem está online

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