Fórum Recuperar próximo código a ser usado em uma aplicação #46570

07/09/2004

0

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

Responder

Posts

07/09/2004

Vinicius2k

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+


Responder

Gostei + 0

07/09/2004

Vinicius2k

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+


Responder

Gostei + 0

08/09/2004

Tuskinhu

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?


Responder

Gostei + 0

08/09/2004

Tuskinhu

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?


Responder

Gostei + 0

08/09/2004

Afarias

|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+


Responder

Gostei + 0

09/09/2004

Rodolpho123

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar