Auto incremento com interbase

Delphi

29/09/2004

Pessoal, boa tarde ...
Estou tento um grande problema em tabelas que necessitam de autoincremento, quando vários registros são cadastrados ...
Primeiramente, fiz uma função que me retorna-se o maximo do codigo, com select max, porém percebi que quando havia muitos usuários cadastrando, a função perdia o máximo e acabava ignorando o registro de ser salvo.
Mudei esse auto-incremento para o generator do interbase fazendo uma função da seguinte maneira:
´SELECT ´
´ GEN_ID(GEN_VENDASCARTAOPOS, 1) ´
´FROM RDB$DATABASE ´
Coloquei esse código dentro de uma função q incrementasse e retornasse o ID da tabela. Porém alguns registros ainda não são gravados na tabela.
Estou fazendo a aplicação com SQL padrao 92, porém tb já tentei fazer com DataSetProvider e ClientdataSet.
Estou pedindo para incrementar o ID somente quando salvo o registro, ou seja, somente quando o usuário preenche todos os campos, é que se gera o novo ID.
Também estou trabalhando com níveis de isolamento do Intertbase
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
e com excessoes, mas mesmo assim, ainda não resolveu o problema de alguns registros não serem salvos.
OBS: Os cadastros são feitos na pauleira. Ainda não havia passado por tal cituação.

Alguém já passou por isso e conseguiu resolver ?


Rod001

Rod001

Curtidas 0

Respostas

Dixonsm

Dixonsm

29/09/2004

Tente implementar o seu sistemas com o[color=blue:35945c8b85][b:35945c8b85] SUPER SEQUENCIADOR[/b:35945c8b85][/color:35945c8b85], o codigo fonte esta na secao de artigos do upload master.

Meu Artigo : [url=http://www.clubedelphi.net/principart11.html][color=blue:35945c8b85][b:35945c8b85]Super Sequenciador[/b:35945c8b85][/color:35945c8b85][/url]



Esse artigo esta em IBO, mas me mande um email que eu lhe enviarei uma copia do artigo convertido para IBX se for o seu caso.


Com certeza você irá resolver o seu problema de sequencias no seu sistema.


GOSTEI 0
Josemars

Josemars

29/09/2004

Colega,
eu geralmente utilizo da seguinte forma:

Faço um query que tenha um max para a colunm e table que eu quero. Com isso eu sempre estarei pegando o último código.

Qualque coisa, manda eu email
Suporte_Totall@yahoo.com.br


GOSTEI 0
Dixonsm

Dixonsm

29/09/2004

O Colega [b:0617805d4b]josemars[/b:0617805d4b] esta certo em certa parte, quando somente o sistema for monousuario, utilizando MAX no firebird, nem sempre garantirá que as estacoes capturem sequencias diferenciadas.


GOSTEI 0
Beppe

Beppe

29/09/2004

Os generators executam em uma transação em separado, vc não pode dar rollback neles.

O que eu faço é usar IDs negativos(temporários) no cliente e o servidor trata de arranjar definitivos para eles.


GOSTEI 0
Afarias

Afarias

29/09/2004

Com certeza você irá resolver o seu problema de sequencias no seu sistema


Infelizmente não é uma solução ´aplicável´ a sistemas com demanda de inclusões concorrentes -- mas para pequenos sistemas parece válida.



T+


GOSTEI 0
Beppe

Beppe

29/09/2004

E se houver exclusões? Não haverá buracos?

O método que utilizo é para a geração segura e eficiente de IDs. Usar generators diretamente seria uma solução por si só, mas é desnecessário uma nova comunicação com o banco, ou impossível, como no modelo briefcase.


GOSTEI 0
Rod001

Rod001

29/09/2004

caro Beep

Não já problemas de ter ´buracos´ entre os registros ...

Tentei fazer uma trigger no afterpost da tabela, para resolver isso, porém ainda os usuários reclamam que alguns registros não estao sendo salvos ...

Realmente, no aplicativo, há uma concorrencia de inserções muito grande. Certa de 30 usuários inserindo registros sem parar ...

Será que não seria uma falha do firebird ??? Caso eu mudasse o banco para mysql ou MSSQLServer resolveria esse problema?

Alguem de vcs trabalham com esse tipo de aplicação e passou pelos menos problemas ?


GOSTEI 0
Afarias

Afarias

29/09/2004

|Será que não seria uma falha do firebird ???

Com certeza não.


|Caso eu mudasse o banco para mysql ou MSSQLServer resolveria esse
|problema?

Se continuar com o mesmo código, Não.


Vc tem q carregar o valor gerado no campo no evento BEFORE POST e não AFTER POST. Mas tb tem q checar se a tabela está em INSERT e não em EDIT (do ClientDataSet -- se vc está usando)

Se ainda não resolver, post detalhes da sua implementação para q seja possível detectar o problema.


T+


GOSTEI 0
Rod001

Rod001

29/09/2004

O motivo de eu colocar no After é que o usuário não precisa saber o ID antes de completar o cadastro. E mesmo para evitar de que um usuário desista de gravar o registro, evitando assim um pouco mais de ID´s pulados.
Teria diferença de estar gerando o ID antes ou depois ??? (ainda não consigo enchegar fora isso)...


GOSTEI 0
Afarias

Afarias

29/09/2004

|O motivo de eu colocar no After é que o usuário não precisa saber o ID
|antes de completar o cadastro.

O motivo de vc NÃO colocar no AFTER é q uma vez postado vc NÃO tem como alterar o valor do campo!


|E mesmo para evitar de que um usuário desista de gravar o registro,
|evitando assim um pouco mais de ID´s pulados.

O BeforePost ocorre DEPOIS q é chamado o POST e antes das alterações serem realmente ´postadas´


T+


GOSTEI 0
POSTAR