Reordenar sequencia

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
bessa_lucas
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Sex, 17 Out 2014 3:02 pm
Lucas Bessa
Analista de Sistemas

lucas.bessa@obers.com.br
lucas.bessa.ti@gmail.com

Olá pessoal.

Estou com uma dúvida.
Tenho um campo mult record ordenado.

Eu preciso que quando um registro seja removido ele reordene a sequencia.

Exemplo:

1-registro
2-registro2
3-registro3

Ao remover o registro2, o registro3 passaria a ser o numero 2

1-registro
2-registro3

Pensei em fazer um loop e diminuir os outros, mas não sei se é o certo ou se tem como fazer de outra forma.

Selecionar tudo

if (numero_registro > numero_removido) then
numero registro := numero_registro - 1;
endif;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá Lucas,

existem vários métodos de ordenação que você pode conferir aqui:
http://www.devmedia.com.br/algoritmos-d ... acao/28261

Pelo que entendi, sua sequência já está ordenada e apenas remove um item da sequencia, o que pode ser resolvido da forma simples como você fez, em complexidade linear de N (para poucos registros).
Porém se é mais complexa a ordenação ou se a quantidade de registros for grande sugiro implementar o quick sort.
Avatar do usuário
bessa_lucas
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Sex, 17 Out 2014 3:02 pm
Lucas Bessa
Analista de Sistemas

lucas.bessa@obers.com.br
lucas.bessa.ti@gmail.com

Olá DanielNN,

Iniciei os trabalhos para fazer a ordenação. Sabe se tem algum comando :system que consigo pegar o campo especifico.

Estou fazendo a primeira parte de ordenar na inserção. Estou fazendo no when-new-record-instance.
Depois vou usar algum gatilho para quando remover reorganizar.

Selecionar tudo

DECLARE
	max_sequencia_producao number;
	sequencia number;
	
BEGIN
	
	max_sequencia_producao := 0;
	
	loop
			sequencia := :system.trigger_record; -- errado
			
			if nvl(sequencia,0) >= max_sequencia_producao then
			
			max_sequencia_producao := nvl(sequencia,0);
		
			if :comp.sequencia_producao is null then
				
				:comp.sequencia_producao := max_sequencia_producao+1;
				
			end if;
			
  		
			
		end if;
		
	exit when :system.last_record = 'TRUE';
	next_record;
	end loop;

END;
Isso tudo estou fazendo na tela antes da inserção no banco.
BCR
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 22 Nov 2012 1:40 pm
Localização: Patos de Minas
Breno Cristovão Rocha.

Olá lucas

já passei por este problema, consegui resolver da seguinte forma

Selecionar tudo

declare
	a number;
begin
	select count(ordem) 
	into a 
	from trast_item
	where cod_rast = :trast_item.cod_rast
		and ordem > :trast_item.ordem;
		
	if a > 0 then
		
			declare cursor x is select cod_rast_item,ordem
				                  from trast_item
													where cod_rast = :trast_item.cod_rast
														and ordem > :trast_item.ordem
													order by ordem;
			begin
				for xx in x loop					
					update trast_item set ordem = ordem - 1 where cod_rast_item = xx.cod_rast_item;				
				end loop;
			end;
	end if;
end;

talvez te ajude !
BCR
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 22 Nov 2012 1:40 pm
Localização: Patos de Minas
Breno Cristovão Rocha.

usei o que citei acima no gatilho pre-delete !
Responder
  • Informação
  • Quem está online

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