Re: [firebase-br] Campo Auto-Incremento Sem Perda da Seqüência..
Francisco Thiago
jeandeadlucky em yahoo.com.br
Qua Jul 13 09:34:57 -03 2005
O gen_id(asdf,0) + 1 é suicídio pelo fator que você considerou antes "(...)
e se duas transações (...)".
> E fiquei com uma dúvida agora também: ao iniciar uma transação, atualizar
> um generator e dar um rollback na transação, o valor do generator voltaria
> ao que era antes da transação?
O gen_id foge do contexto Transacional, ou seja, quando você incrementa um
generator ele é incrementado e pronto...
Voltar atrás o valor do generator é outro pulo do prédio...
Basicamente, o que você pode fazer é o seguinte:
1) Você precisa do código no momento do Insert
Você recupera o valor do generator (gen_id(generator,1)) e grava numa
variável, ou até mesmo já no campo chave. Se o usuário confirmar a gravação,
sem problemas... agora, caso ele cancele, você vai ter que fazer o seguinte:
Grave este valor numa tabela do tipo :
create table Gen_cancel (
Nome_generator
Valor_Generator
);
Daí sempre que você for recuperar o valor de um Generator, consulte antes
esta tabela. Se tiver algo nela, use este valor e o delete no mesmo
instante, caso contrário, pegue o resultado do gen_id(generator,1).
Você vai precisar escrever uma procedure (ou uma SP) pra automatizar isso.
Tome apenas cuidado com as transações na tabela Gen_Cancel... pois você pode
ter problemas (como pegar o mesmo número).
Acredito que tenha algum material sobre o assunto na ClubeDelphi, ou até
mesmo na Firebase.... Seria interessante vc dar uma olhada...
[]'s
Francisco Thiago de Almeida
Enter&Plug Sistemas
Divisão: Desenvolvimento / Banco de dados
Franca - SP
----- Original Message -----
From: "Giovani Benedetti Penha" <giovani em cooperval.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, July 12, 2005 5:03 PM
Subject: Re: [firebase-br] Campo Auto-Incremento Sem Perda da Seqüência..
> Allan,
> A meu ver, uma forma seria retornar um gen_id(gerador,0) do seu banco e
> atribuir +1 manualmente pelo código.
> O gen_id(gerador,0) não altera o valor do generator. Atribuindo +1 por
> código você "simularia" o próximo valor do gerador, mas sem alterar seu
> valor atual. Então, apenas se a inserção fosse confirmada, você chamaria o
> gen_id(gerador,1), para atualizar o valor do gerador. Porém, aí temos um
> problema grave: se existirem duas transações ativas ao mesmo tempo em dois
> clientes diferentes, as duas iriam obter o mesmo gen_id e tentariam gravar
> com a mesma chave, ocasionando problema de violação da chave primária. Mas
> se o sistema for executado por um único cliente, daí acredito que resolva
> seu problema.
> E fiquei com uma dúvida agora também: ao iniciar uma transação, atualizar
> um generator e dar um rollback na transação, o valor do generator voltaria
> ao que era antes da transação? Em teoria sim né? Se isso funcionasse, você
> poderia comitar a transação sempre que a inserção ocorresse ou rollback
> caso fosse cancelada. Alguém sabe o que aconteceria nesse caso?
>
> Espero ter ajudado mais do que confundido!
>
> []´s
> Giovani Benedetti Penha
>
>
> Allan Elias Ramos escreveu:
>
>>Olá pessoal, tudo bem? Espero que sim..
>>
>>Olha, não sei se tem algum jeito de fazer isso, mas minha dúvida é a
>>seguinte:
>>
>>Pra criar um campo auto-incremento no Firebird, é necessário um Generator
>>e uma Trigger. Isso eu sei fazer, e consigo também gerar o número no campo
>>antes de salvar o registro (eu preciso disso pq preciso desse código). Mas
>>assim, se eu criar um novo registro e não salvar ele, por acaso eu
>>cancelar a inserção de dados, esse código gerado se perde, por exemplo.
>>
>>Código 1 - Salvo
>>Código 2 - Salvo
>>Código 3 - Cancelado
>>Código 4 - Salvo
>>
>>A idéia seria não perder o código 3, ficando assim:
>>
>>Código 1 - Salvo
>>Código 2 - Salvo
>>Código 3 - Cancelado
>>Código 3 - Salvo
>>
>>Eu sei q, por exemplo, no Access ele funciona assim.. quando um código
>>gerado automaticamente não é usado, ele nao é descartado, é guardado pra
>>uso posterior.. tem como fazer isso no Firebird?
>>
>>Só pra deixar claro, quero esse funcionamento só no caso de um
>>cancelamento na inserção do registro. Sei que, quando um registro é
>>deletado, o código não pode mais ser aproveitado.
>>
>>Agradeço desde já a ajuda.. abraços..
>>
>>
>>Allan Elias Ramos
>>______________________________________________
>>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>>Para editar sua configuração na lista, use o endereço
>>http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>>Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> --
> No virus found in this incoming message.
> Checked by AVG Anti-Virus.
> Version: 7.0.323 / Virus Database: 267.8.13/47 - Release Date: 12/07/2005
>
_______________________________________________________
Yahoo! Acesso Grátis - Internet rápida e grátis.
Instale o discador agora! http://br.acesso.yahoo.com/
Mais detalhes sobre a lista de discussão lista