Aplicação em rede, problema com transação - IBX INTERBASE
Pessoal,
Estou com problemas no meu sistema, isso nunca tinha acontecido antes, acredito que eu esteja esquecendo de algo na transação pois a situação é a seguinte:
Tenho 1 IBDatabase e 1 IBTransaction, inicialmente estava com problemas que ao excluir um registro isto não refletia para os outros usuários da rede. Consegui contornar isso com um start transaction ao iniciar os forms de cadastro e um commit ao fechar o form.
O IBQuery está com o cachedupdates ativado e estou efetuando o applyupdate ao gravar.
Resolvi o problema da exclusão, porém efetuando outro teste percebi que se dois usuários entrarem na mesma tela de cadastro... o primeiro que salvar o registro, o sistema informa o código corretamente... este código é gerado da seguinte forma... no before post do IBQuery uso:
Bom, fazendo isso pego o último registro e logo em seguida o sistema aplica o applyupdates e salva o registro.
Porém.. se o outro cliente estava com a mesma tela aberta e vai salvar... ao executar o código acima... ele reconhece o último registro como sendo o último registro existente ao abrir a transação... e não o último registro REAL que está no banco... com isso estou tento problemas com a chave primária.... estranho é que não tinha passado por esta situação antes...
O que estou fazendo de errado????
Agradeço a ajuda dos colegas!
Estou com problemas no meu sistema, isso nunca tinha acontecido antes, acredito que eu esteja esquecendo de algo na transação pois a situação é a seguinte:
Tenho 1 IBDatabase e 1 IBTransaction, inicialmente estava com problemas que ao excluir um registro isto não refletia para os outros usuários da rede. Consegui contornar isso com um start transaction ao iniciar os forms de cadastro e um commit ao fechar o form.
O IBQuery está com o cachedupdates ativado e estou efetuando o applyupdate ao gravar.
Resolvi o problema da exclusão, porém efetuando outro teste percebi que se dois usuários entrarem na mesma tela de cadastro... o primeiro que salvar o registro, o sistema informa o código corretamente... este código é gerado da seguinte forma... no before post do IBQuery uso:
with TIBQuery.Create(nil) do try Database := frmPrincipal.ibdtbINDante; Transaction := frmPrincipal.ibtraINDante; SQL.Add(´SELECT MAX(CID_ID) AS MCID FROM CID_CIDADE´); Open; if FieldByName(´MCID´).IsNull then ibqryINCadastroCID_ID.AsInteger := 1 else ibqryINCadastroCID_ID.AsInteger := FieldByNAme(´MCID´).AsInteger + 1 finally Close; Free; end;
Bom, fazendo isso pego o último registro e logo em seguida o sistema aplica o applyupdates e salva o registro.
Porém.. se o outro cliente estava com a mesma tela aberta e vai salvar... ao executar o código acima... ele reconhece o último registro como sendo o último registro existente ao abrir a transação... e não o último registro REAL que está no banco... com isso estou tento problemas com a chave primária.... estranho é que não tinha passado por esta situação antes...
O que estou fazendo de errado????
Agradeço a ajuda dos colegas!
Techsoft
Curtidas 0
Respostas
Techsoft
08/02/2006
Alguém poderia me ajudar com este problema???
Estou realmente precisando descobrir onde estou errando.
Obrigado!
Estou realmente precisando descobrir onde estou errando.
Obrigado!
GOSTEI 0
Aroldo Zanela
08/02/2006
Colega,
Neste caso, acredito que o uso de uma tabela auxiliar de ´sequenciadores´ seria uma opção segura.
Neste caso, acredito que o uso de uma tabela auxiliar de ´sequenciadores´ seria uma opção segura.
GOSTEI 0
Siam
08/02/2006
Também tive um problema parecido e resolví com try/except aplicando Select Max 10 vezes e tentando gravar. Na décima vez que entrar no except, lanço a exceção.
GOSTEI 0
Techsoft
08/02/2006
Obrigado pelas respostas. Vou ver se consigo resolver com uma dessas formas!
GOSTEI 0