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 ?
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
Curtidas 0
Respostas
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.
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
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
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
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
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.
O que eu faço é usar IDs negativos(temporários) no cliente e o servidor trata de arranjar definitivos para eles.
GOSTEI 0
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
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.
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
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 ?
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
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+
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
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)...
Teria diferença de estar gerando o ID antes ou depois ??? (ainda não consigo enchegar fora isso)...
GOSTEI 0
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+
|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