Fórum Erro de Key Violation #276250

08/04/2005

0

Tenho uma aplição em delphi com banco firebird usando os componente ib pra acesso... quando esta em rede se duas pessoas ao mesmo tempo mandar incluir um registro da um erro de ´Key Violation´ mesmo eu usando uma função pra pegar um novo código.
Alguem saberia como resolver eu problema?


Daniel.felgar

Daniel.felgar

Responder

Posts

08/04/2005

Rjun

Tem certeza q essa funçao esta retornando códigos diferentes para as duas pessoas ?


Responder

Gostei + 0

08/04/2005

Silviogs

Olá

vc poderia postar a função pra pegar um novo código.


Silvio Guedes


Responder

Gostei + 0

08/04/2005

Ariovaldo

Daniel conforme o Rjun já informou se vc realmente garante que sua função atribui valores diferente o problema pode estar no Componente Ibtransaction não esta configurado corretamente, Dê dois cliques neste componente vai aparecer uma janela com 3 radio buton seleciona o Radio do Meio não me lembro a descrição agora.


Responder

Gostei + 0

08/04/2005

Daniel.felgar

Não.... mas em uma maquina só sempre retorna..... eu tenho o ´ssql´ de inclusão antes de ele executar o sql ele puxa o novo código....


Responder

Gostei + 0

08/04/2005

Daniel.felgar

o componente já esta como read-comited...


Responder

Gostei + 0

08/04/2005

Rjun

Em uma maquina ele so vai fazer uma requisição. Ai com certeza ele retorna um numero novo. Você ta usando trigger ? Senão, quando vc pega o novo codigo teria q salvar o codigo novo para que quando a outra maquina pedisse o novo codigo, ele teria o valor correto.


Responder

Gostei + 0

08/04/2005

Daniel.felgar

Tipo eu num usu triger....mas logo após pegar o código ele salva seria tipo asism: novocodigo
salvana tabela







qyGeral.sql.clear;
qyGeral.sql.close;
qyGeral.sql.add(´Select max(´+nomecampo+´) as lastcode´);
qyGeral.sql.add(´from ´+nometabela);
qyGeral.Open;
if qyGeral.RecordCount = 0 then
result := 1
else
result := qyGeral.fieldbyname(´lastcode´).asinteger + 1;


Responder

Gostei + 0

08/04/2005

Rjun

Nesse trecho voce esta so pegando o codigo. Não esta salvando. Então deve ser isso q esta acontecendo. Por que você não utiliza Stored Procedure ?


Responder

Gostei + 0

08/04/2005

Ariovaldo

Neste Caso o Registro não esta fisico na tabela, ele só esta lógico portanto outra requisição solicitada não pegara o novo, seria interessante usar uma Trigger neste caso


Responder

Gostei + 0

08/04/2005

Daniel.felgar

num esses trecho é so o do codigo.... depois q vem o ´insert into...´
num da pra usar.


Responder

Gostei + 0

08/04/2005

Daniel.felgar

depois de executado o sql eu faço o
if trFB.InTransaction then
trFB.Commit;


Responder

Gostei + 0

08/04/2005

Ariovaldo

Quando vc da o Insert vc commita a Tabela? se não o registro só vai estar lógico lá, e o select não pega ele


Responder

Gostei + 0

08/04/2005

Ariovaldo

Tenta mudar o Comando Para:

if trFB.InTransaction then
trFB.CommitRetaining;


Responder

Gostei + 0

08/04/2005

Daniel.felgar

qual a diferença entre os dois


Responder

Gostei + 0

08/04/2005

Ariovaldo

Puts a Diferença eu não sei, mas tive um problema desses uma vez e só alterei isso, claro que existe uma propriedade no IBTransaction que vc seta ´TaCommit´ ou ´TaCommitRtaining´ muda para este segundo


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar