Array
(
)

Aplicação em rede, problema com transação - IBX INTERBASE

Techsoft
   - 08 fev 2006

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:
#Código

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
   - 09 fev 2006

Alguém poderia me ajudar com este problema???

Estou realmente precisando descobrir onde estou errando.

Obrigado!


Aroldo Zanela
   - 09 fev 2006

Colega,

Neste caso, acredito que o uso de uma tabela auxiliar de ´sequenciadores´ seria uma opção segura.


Siam
   - 09 fev 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.


Techsoft
   - 10 fev 2006

Obrigado pelas respostas. Vou ver se consigo resolver com uma dessas formas!