Como popular uma lov com o retorno de uma procedure

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
aramatos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 15 Jan 2008 9:58 pm
Localização: santos - sp

Pessoal, boa tarde. Como faço para popular uma lov com o retorno de uma procedure, vi varios exemplos no site mas a partir de uma query, no meu caso para não ficar reescrevento a query da procedure...isto é possivel.
obrigado.
cream3
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 17 Mai 2010 10:49 pm
Localização: Belo Horizonte

não sei bem ao certo, mas uma trigger não ajudaria?
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

Eu acho que você vai ter que colocar os dados que vem da procedure numa tabela antes :-/
ricards
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Sáb, 29 Set 2007 12:59 am
Localização: Araraquara-SP
Contato:
Ricardo Neves
Analista e Instrutor Oracle Developer
Java Developer (JPA/JSF/Hibernate/WebServices/EJB)

A solução para LOV baseada em procedure é a seguinte:

1. Parar criar uma LOV baseada em Procedure é necessário construir umaa rotina que irá retornar os registros (Type) com as informações da LOV.

Segue em anexo a rotina exemplo que deve ser criada:

Selecionar tudo

create	or	replace	package	pkg_treinamento	is
	-- Registro de empregados
	type	v_rec_empregados	is	record	(
								empno	number(4),
								ename	varchar2(10)
							);
	type	v_tab_empregos	is	table	of	v_rec_empregados	index	by	binary_integer;
	-- Procedure responsavel por retorna os empregados em um registro
	procedure	prc_lov_empregados	(
							p_tab_empregados	in	out	v_tab_empregos,
							p_mens			in	out	varchar2
						);
end	pkg_treinamento;
/
create	or	replace	package	body	pkg_treinamento	is
	-- Procedure responsavel por retorna os empregados em um registro
	procedure	prc_lov_empregados	(
							p_tab_empregados	in	out	v_tab_empregos,
							p_mens			in	out	varchar2
						)	is

		cursor	c1	is
			select	empno,
				ename
			from	emp;

		v_ind		number	:=	0;
	begin
		-- Carrega o registro de empregados
		for	r1	in	c1	loop
			v_ind	:=	v_ind	+	1;
			p_tab_empregados(v_ind).empno	:=	r1.empno;
			p_tab_empregados(v_ind).ename	:=	r1.ename;
		end	loop;
	exception
		when	others	then
			p_mens	:=	'PKG_TREINAMENTO.PRC_LOV_EMPREGADOS - Problemas ao executar a rotina. Erro: '	||	sqlerrm;
	end;
end	pkg_treinamento;
/
2. Criar um RECORD_GROUP no forms

3. Adicione as colunas no Record Group EMPNO E ENAME

4. Modificar a propriedade “TIPO DE GRUPO DE REGISTRO” de “Estático” para “Consulta” do Record Group

5. Criar a LOV utilizando o WIZARD, selecionando o Record Group criado.

6. Criar a “TRIGGER” KEY-LISTVAL no campo onde é chamada a LOV.

7. Na trigger adicionar o seguinte código:

Selecionar tudo

 

declare
	v_tab_empregados	pkg_treinamento.v_tab_empregados;
	v_mens			varchar2(255);
	rg_name			varchar2(14)	:=	'RG_EMPREGADOS';
	rg_empno		varchar2(50)	:=	rg_name	||	'.EMPNO';
	rg_ename		varchar2(50)	:=	rg_name	||	'.ENAME';
	rg_id			recordgroup;
	gc_id			groupcolumn;
begin
	-- Executa a rotina para carregar os empregados no registro(Type)
	begin
		pkg_treinamento.prc_lov_empregados	(
																					v_tab_empregados,
																					v_mens
																				);		
	exception
		when	others	then
			message('PKG_TREINAMENTO.PRC_LOV_EMPREGADOS - Problemas ao executar a rotina. Erro: '	||	sqlerrm);
			message('PKG_TREINAMENTO.PRC_LOV_EMPREGADOS - Problemas ao executar a rotina. Erro: '	||	sqlerrm);
		raise	form_trigger_failure;
	end;
	--
	if	v_mens	is	not	null	then
		message(v_mens);
		message(v_mens);
		raise	form_trigger_failure;
	end	if;
	-- Procura o Record Group
	rg_id	:=	find_group(rg_name);
	-- Se encontrou o Record Group limpa todas as linhas do Record Group
	if	not	id_null(rg_id)	then
		delete_group_row(rg_id,ALL_ROWS);
		-- Le o registro carregados com os empregados e popula o Record Group
		for	v_ind	in	nvl(v_tab_empregados.first,1)..nvl(v_tab_empregados.last,0)	loop
			-- Adiciona uma linha no fim do Record Group
			add_group_row(rg_id, end_of_group);
			-- Seta os valores nas colunas do Record Group
			set_group_char_cell(rg_ename,v_ind,v_tab_empregados(v_ind).ename);
			set_group_number_cell(rg_empno,v_ind,v_tab_empregados(v_ind).empno);
		end	loop;
	end	if;
	-- Exibe a lista de valores com os empregados
	list_values;
	--	
exception
	when	form_trigger_failure	then
		raise;
	when	others	then
		message('KEY-LISTVAL - Problemas ao executar a rotina. Erro: '	||	sqlerrm);
		message('KEY-LISTVAL - Problemas ao executar a rotina. Erro: '	||	sqlerrm);					
end;


Sua LOV baseada em procedure está pronta.

:-o :-o
Responder
  • Informação
  • Quem está online

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