Deletando valor ID bloco - zerar table of varchar

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
victorpsl
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Seg, 19 Mai 2008 8:51 am
Localização: SP
--
Victor Hugo

Boa tarde pessoal!!! sou novo aqui no fórum, e normalmente tem me ajudado muito, porém estou com um problema e não estou conseguindo resolver....!

é o seguinte!

No form existem 2 blocos onde, no 1º eu escolho 1 item e no 2º bloco posso escolher vários itens que fazem parte do item escolhido no 1º bloco.

Criei uma package Spec que apenas é declarado uma variável do tipo "binary_integer" , e implementei em uma trigger no campo "when validated item" para que pegasse o valor de cada item e fosse somando, de uma forma que caso o usuário coloque 2 itens iguais, aparece uma mensagem dizendo que a pessoa já escolheu o item.

Até aqui, beleza!!! ... um erro q esta ocorrendo no meu caso é quando:

deleto uma linha no 2º bloco, aperto commit, e vou para o bloco de cima. Ao mudar de item eu teria que zerar essa lista, pois não está acontecendo, então caso eu mude e tento inserir por exemplo o mesmo item q deletei o registro anterior, n consigo, pois ele está salvo na memória da lista.

Eu qria saber como posso estar fazendo para zerar essa lista quando o bloco de cima for alterado.

Se não expliquei direito, por favor pergunte o que n entendeu.

Obrigado!!!


segue um ex de como está o cod.

1º a package

Selecionar tudo


PACKAGE Lista IS
	TYPE lista is table of varchar2(20) index by binary_integer;
 	lista_item lista;
END;


2º essa parte fica no when validated item do 2º bloco

Selecionar tudo

Declare
	cur_blk VARCHAR2(40) := :System.Cursor_Block;
	cur_rec NUMBER;
	bk_id Block;
begin
	bk_id := Find_Block(cur_blk);
	cur_rec := Get_Block_Property( bk_id, CURRENT_RECORD);

	if(cur_rec > 1 ) then
		cont := 1;
		loop
	  	if(lista.lista_item(cont-1) = :itco_id_comp) then
	  		message('Já existe este item na lista. Por favor escolha outro.');	
	  		message('Já existe este item na lista. Por favor escolha outro.');
	  		raise form_trigger_failure;
	  	end if;
	   	cont := cont + 1;
	  	exit when cont = cur_rec;
		end loop;	
		
	--message('valor:'||cur_rec);
	--message('valor:'||cur_rec);
	end if;
	lista.lista_item(cur_rec-1) := :itco_id_comp;	
exception
    when NO_DATA_FOUND then 
      Message('Item não localizado.');
      Message('Item não localizado.');
      Message(lista.lista_item(0));
      Message(lista.lista_item(0));
		  raise form_trigger_failure;
end;



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

Você pode "LIMPAR" o seu table of varchar da seguinte forma:

Selecionar tudo

-- delete Pl/SQL table records
declare
  type myTextTableType is table of varchar2(200) index by binary_integer;

  l_tabela_texto      myTextTableType;
  l_tabela_vazia      myTextTableType;
begin
  l_tabela_texto(10) := 'Um valor';
  l_tabela_texto(20) := 'outro valor';
  l_tabela_texto(30) := 'mais um valor';

  l_tabela_texto := l_tabela_vazia;
  dbms_output.put  ('Uma vez que setamos nossa tabela VAZIA p/ uma TABELA POPULADA, ela se torna vazia.');
  dbms_output.put_line('Quantidade: ' || l_tabela_texto.count || ' varchars');

end;
/

Agora, vamos executar:

Selecionar tudo

SQL> set serveroutput on 
SQL> 
SQL> -- delete Pl/SQL table records
SQL> declare
  2    type myTextTableType is table of varchar2(200) index by binary_integer;
  3  
  4    l_tabela_texto      myTextTableType;
  5    l_tabela_vazia    myTextTableType;
  6  begin
  7    l_tabela_texto(10) := 'Um valor';
  8    l_tabela_texto(20) := 'outro valor';
  9    l_tabela_texto(30) := 'mais um valor';
 10  
 11    l_tabela_texto := l_tabela_vazia;
 12    dbms_output.put  ('Uma vez que setamos nossa tabela VAZIA p/ uma TABELA POPULADA, ela se torn
a vazia.');
 13    dbms_output.put_line('Quantidade: ' || l_tabela_texto.count || ' varchars');
 14  
 15  end;
 16  /
Uma vez que setamos nossa tabela VAZIA p/ uma TABELA POPULADA, ela se torna
vazia.Quantidade: 0 varchars

PL/SQL procedure successfully completed.

SQL> 

Você pode colocar MAIS UMA variável na sua package

Selecionar tudo

PACKAGE Lista IS
   TYPE lista is table of varchar2(20) index by binary_integer;
    lista_item  lista;
    lista_vazia lista;
END; 
Daí basta zerar a lista onde você quiser :-D
:-o
victorpsl
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Seg, 19 Mai 2008 8:51 am
Localização: SP
--
Victor Hugo

Faz tempo que não tinha visto esta resposta. hehe.. Obrigado! :D
Responder
  • Informação
  • Quem está online

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