29/09/2004

Auto incremento com interbase

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

Respostas

29/09/2004

Dixonsm

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.


Responder Citar

29/09/2004

Josemars

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


Responder Citar

30/09/2004

Dixonsm

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.


Responder Citar

30/09/2004

Beppe

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.


Responder Citar

30/09/2004

Afarias

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+


Responder Citar

30/09/2004

Beppe

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.


Responder Citar

30/09/2004

Rod001

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 ?


Responder Citar

30/09/2004

Afarias

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


Responder Citar

01/10/2004

Rod001

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)...


Responder Citar

01/10/2004

Afarias

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


Responder Citar