Auto incremento com interbase
29/09/2004
0
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
Posts
29/09/2004
Dixonsm
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.
29/09/2004
Josemars
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
30/09/2004
Dixonsm
30/09/2004
Beppe
O que eu faço é usar IDs negativos(temporários) no cliente e o servidor trata de arranjar definitivos para eles.
30/09/2004
Afarias
Infelizmente não é uma solução ´aplicável´ a sistemas com demanda de inclusões concorrentes -- mas para pequenos sistemas parece válida.
T+
30/09/2004
Beppe
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.
30/09/2004
Rod001
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 ?
30/09/2004
Afarias
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+
01/10/2004
Rod001
Teria diferença de estar gerando o ID antes ou depois ??? (ainda não consigo enchegar fora isso)...
01/10/2004
Afarias
|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+
Clique aqui para fazer login e interagir na Comunidade :)