Verificar último código, incremtar '1'

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
roby.bnu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 24 Out 2008 10:01 am
Localização: Blumenau - SC
Robson Cristovão

Bom dia galera,

Estou iniciando meus estudos em pl/sql e forms, inclusive sou novato no fórum

Tenhos algumas tabelas de cadastro. Preciso que quando
o usuário clique em "NOVO" (por exemplo), seja verificado o último
código cadastrado, incremente 1 e já apresente no campo código
o novo código.

Grato,
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

O ideal é só fazer isso no momento da inserção. Senão 2 pessoas podem estar pegando o mesmo código.

Exemplo:
MAQ1 - pega o ultimo registro (25) e adiciona 1. (26). Enquanto isso, ele não salvou nada. Ainda está inserindo a linha
MAQ2 - 1 minuto após, um outro usuáriopega também o ultimo registro gravado (25, pois o cara da maq1 ainda não salvou) e soma 1.

Aí já deu problema! Duas pessoas tentando inserir o mesmo codigo. 26. O que gravar primeiro vai conseguir. O outro vai dar erro!

Se você colocar na PRE-INSERT esse comando de buscar o último, reduz muito o problema, pois ele vai buscar o código milésimos de segundo e já grava...

O ideal é usar mesmo uma sequence nesses casos. Daí não tem erro nunca! O problema é que se a pessoa não gravar, fique "buracos" nos código. Você tem que avaliar se isso é permitido...
roby.bnu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 24 Out 2008 10:01 am
Localização: Blumenau - SC
Robson Cristovão

Como ficaria esta procedure, assim ?

Selecionar tudo

PROCEDURE VERIF_COD (PAIS NUMBER) IS
	INC_CD_PAIS NUMBER(4);
	BEGIN
		 SELECT CD_PAIS INTO INC_CD_PAIS FROM PAIS
	  	WHERE CD_PAIS > INC_CD_PAIS;
	 		IF CD_PAIS < INC_CD_PAIS THEN
	 			 INC_CD_PAIS := CD_PAIS + 1;
	 		END IF;
END;

Desde já agradeço.
roby.bnu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 24 Out 2008 10:01 am
Localização: Blumenau - SC
Robson Cristovão

Reformulando..
Como irei rodar apenas na máq. local, fiz da seguinte maneira:

Selecionar tudo

 DECLARE 	
	INC_CD_PAIS 	NUMBER(4);
	wrk_prox_pais 	NUMBER(1);
	
BEGIN
	 SELECT max(cd_pais)+1
	 into wrk_prox_pais
	 from pais;
	 
	 --wrk_prox_pais
	 
	 SELECT CD_PAIS 
	   INTO INC_CD_PAIS 
	   FROM PAIS
	  WHERE CD_PAIS < INC_CD_PAIS;
	
	INSERT INTO PAIS (CD_PAIS)
	values (WRK_PROX_PAIS);
	
END;
roby.bnu
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 24 Out 2008 10:01 am
Localização: Blumenau - SC
Robson Cristovão

DR_GORI,

Concluí minha trigger, fiz um pre-insert mesmo.

Selecionar tudo

declare
		AUX_FLG_EXISTE varchar2(1);
begin
	if :PAIS.CD_PAIS is null then
			select NVL(max(CD_PAIS),0)+1
			  into :PAIS.CD_PAIS
				from PAIS;
	else
	   begin
			 select 'S'
			 		into AUX_FLG_EXISTE
			 		from PAIS
			 		where CD_PAIS = :PAIS.CD_PAIS;
	   exception
	   	WHEN no_data_found then
	   			 AUX_FLG_EXISTE := 'N';
	   end;
	   
	   if AUX_FLG_EXISTE = 'S' then
	   		select NVL(max(CD_PAIS),0)+1
			  into :PAIS.CD_PAIS
				from PAIS;
	   end if;
end if;
end;	
Valeu pelo help

[]´s
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 ia te dizer mesmo pra colocar o NVL no max, pois caso esteja VAZIA a tebela, ia retornar NULO e não 1!

:-)

Selecionar tudo

select NVL(max(CD_PAIS),0)+1 
Responder
  • Informação
  • Quem está online

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