Reaproveitar codigos

Delphi

01/04/2005

Como eu faço via SQL, para reaproveitar codigos q não existem mais?

Ex: Eu tenho uma tabela com 100 codigos, esses codigos são autoincremento, e vamos supor que o codigo 50 é apagado.
Como eu faço pra sugerir o codigo 50 na próxima vez?

No Aguardo

Bruno Bacelar


Blbacelar

Blbacelar

Curtidas 0

Respostas

Silviogs

Silviogs

01/04/2005

Olá

voce pode criar o loop com um contador e verificar se o numcontador é igual ao valor do código na sua tabela, caso a contagem seja interrompida esse é o codigo que deseja usar:

EX: for i := 1 to tabela.recordcount do
if i = tabelacodigo.value then
tabela.next
else begin
tabela.insert;
tabelacodigo.value := i;
tabela.post;
end;

Obs: não sei se é isto? qualquer dúvida estamos aí!

Atenciosamente

Silvio Guedes


GOSTEI 0
Blbacelar

Blbacelar

01/04/2005

Eu acho q isso funcionaria, mas tornaria o sitema muito lerdo....
não teria como fazer por SQL?


GOSTEI 0
Beppe

Beppe

01/04/2005

Tem quem ache isto útil http://forum.clubedelphi.net/viewtopic.php?t=59666&highlight=repovoar


GOSTEI 0
Motta

Motta

01/04/2005

Sendo uma chave artificial e não tendo nenhuma restrição leagl (apólices de seguro não podem ter saltos) não vejo o problema de ter ´banguelas´ , reutilizar a chave pode dar confusão dependendo do negócio, algum documento foi emitido com dados do código antigo e os dados não vão bater com os do novo.

Nos casos em que não pode ´pular´ a melhor solução é a próxima chave ser a última mais um , mais isto pode gerar problemas de deadlock e a implementação precisa ser cuidadosa.

Não dá para buscar os não existente num sql, mas a ideia da tabela auxiliar do outro link funciona.


GOSTEI 0
Marco Salles

Marco Salles

01/04/2005

Claro que dá pra repovoar os buracos, basta manter uma tabela com os IDs excluídos, usando generator apenas se ela estiver vazia.


Como assim Beppe :oops: :oops: :oops: :oops: :oops:


GOSTEI 0
Beppe

Beppe

01/04/2005

[quote:9030ffb149=´Marco Salles´]
Claro que dá pra repovoar os buracos, basta manter uma tabela com os IDs excluídos, usando generator apenas se ela estiver vazia.


Como assim Beppe :oops: :oops: :oops: :oops: :oops:[/quote:9030ffb149]

Foi só uma idéia que nunca implementei, mas seria algo assim:

set term ^ ;

-- este generator é usado quando a tabela 
-- auxiliar estiver vazia
create generator GEN1 ^

-- armazena IDs exluídos
create table ID_GEN1
(
    ID BIGINT
) ^

-- chame esta SP para obter um ID
create procedure ObtemID returns (ID BIGINT)
as
begin
    ID = select first 1 ID from ID_GEN1;
    if ID = null then
        ID = gen_id(GEN1);
    end;
    suspend;
end ^

set term ; ^

Espero não ter errado na sintaxe.

Sempre que você exluir um registro, vc adiciona seu ID na tabela auxiliar. Quando precisar de um ID, esta tabela é olhada primeiro, e se estiver vazia, o generator é usado.


GOSTEI 0
Marco Salles

Marco Salles

01/04/2005

Veja bem se eu entendi a sua idéia

Vamos supor que se tenha : 1,2,3,5,6,7,8

e na tabela Auxiliar se tem 4

Nesse momento a tabela principal , continua Esta com um buraco. Mas não em Forma de Queijo Suico... Porque , ao se incluir um novo registro, esta tabela é Olhada Primeiro e neste caso a tabela volta a estar cheia...

TabPrincipal : 1,2,3,4,5,6,7,8

TabAux --->>> agora nao tem nada


Conclusão : Se eu entendi a sua idéia , a tabela principal ,podera ficar em forma de buracos(Quijo suiço) somente no caso de muitas exclusões ocorrem seguidamentes..


GOSTEI 0
Beppe

Beppe

01/04/2005

Exatamente isso!


GOSTEI 0
POSTAR