Fórum Recuperar próximo código a ser usado em uma aplicação #46570
07/09/2004
0
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
Curtir tópico
+ 0Posts
07/09/2004
Vinicius2k
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
07/09/2004
Vinicius2k
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
08/09/2004
Tuskinhu
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
08/09/2004
Tuskinhu
mesmo que eu mesmo o incremente de 1 e o descarte na hora do insert?
Gostei + 0
08/09/2004
Afarias
|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
09/09/2004
Rodolpho123
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)