Recuperar próximo código a ser usado em uma aplicação

Firebird

07/09/2004

Olá pessoal,

Estou com uma dúvida de qual será o melhor jeito de criar um contador para uma tabela, sendo que este contador não pode haver falhas na numeração de jeito nenhum, dever ser sempre continuo, pra inicio, simplesmente pra pular esse problema puxo esse código com um select max(codigo), mas analisei esse select pelo Quickdesk e ele nao utiliza nenhum índice pra chegar ao resultado, isto é a pesquisa é lenta, se alguem tiver uma boa opinião a respeito de qual o melhor jeito de aplicar isso a aplicação, se a perda de velocidade, já que o sistema nao rodará em grandes computadores e o código rápido e agil nesse caso é fundamental ao desenvolvimento...

Banco: Firebird 1.5
Uso pra acesso a dados: SQLConnection - SQLQuery
Pra consultas: SQLConnection - Provider - ClientDataSet

Até mais...


Tuskinhu

Tuskinhu

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

07/09/2004

Colega,

Utilize generators. Duas formas :

1. Generators + Triggers : 100¬ do controle efetuado pelo banco e o campo só recebe o valor ao chegar ao banco (o que força um refresh na Query para visualizar o valor que foi gerado, se for importante).

2. Apenas generators : o controle de incrementação é feito pelo banco, mas é a aplicação que dispara o incremento através de chamada à função GEN_ID do Firebird, por exemplo, uma query com a instrução:
select GEN_ID(Nome_do_Generator, 1)

Dispara o incremento e retorna o número gerado, caso vc precise para alguma outra operação.

Mais detalhes e outrs formas de trabalhar, faça uma uma [url=http://delphiforum.icft.com.br/forum/search.php]pesquisa aqui no fórum[/url] com o termo [b:e1932f9acb]GENERATOR[/b:e1932f9acb]

T+


GOSTEI 0
Vinicius2k

Vinicius2k

07/09/2004

Colega,
Desculpe, faltou uma parte do código...

Em :
select GEN_ID(Nome_do_Generator, 1)

Leia-se:
select GEN_ID(Nome_do_Generator, 1) from RDB$DATABASE


T+


GOSTEI 0
Tuskinhu

Tuskinhu

07/09/2004

Eu acho que a solução digamos mais ´bonita´ seria gerar uma triger no evendo before insert correto?

mas como eu faria isso? de trigers eu nao saquei ainda muito bem a ideia e como elas funcionam corretamente...

e no caso de varias máquinas estarem inserindo ao mesmo tempo na base não existe possibilidade de haver um rollback ou um cancelamento da inclusão?


GOSTEI 0
Tuskinhu

Tuskinhu

07/09/2004

Mais uma pergunta só que eu esqueci: Como posso apenas recuperar o valor atual do generator simplesmente para eu apresentá-lo na tela,
mesmo que eu mesmo o incremente de 1 e o descarte na hora do insert?


GOSTEI 0
Afarias

Afarias

07/09/2004

|Eu acho que a solução digamos mais ´bonita´ seria gerar uma triger no
|evendo before insert correto?

mais bonita?? bom -- dai eu não sei -- mas, nas aplicações em geral não é a melhor (mais adequada aos modelos de aplicação ´por ai´)


|mas como eu faria isso? de trigers eu nao saquei ainda muito bem a
|ideia e como elas funcionam corretamente...

create trigger nome_trigger for nome_tabela before insert as
begin
if (new.campo_tal is null) then
new.campo_tal = gen_id(nome_generator, 1);
end^

ou apenas::

create trigger nome_trigger for nome_tabela before insert as
begin
new.campo_tal = gen_id(nome_generator, 1);
end^


|e no caso de varias máquinas estarem inserindo ao mesmo tempo na
|base não existe possibilidade de haver um rollback ou um cancelamento
|da inclusão?

cancelamento da inclusão sim. mas do generator não. generators não são alterados no contexto de transações.


|Como posso apenas recuperar o valor atual do generator simplesmente
|para eu apresentá-lo na tela,

select gen_id(nome_generator, 0) from rdb$database


T+


GOSTEI 0
Rodolpho123

Rodolpho123

07/09/2004

E para não haver falhas na sua numeração, determine o seu ´campo_codigo´ como chave primária.


GOSTEI 0
POSTAR