[firebase-br] Erro sinistro !

Eduardo Bahiense eduardo em icontroller.com.br
Qui Jan 10 22:45:14 -03 2008


Olá Anderson

Isto não é problema do FB, mas do(s) componente(s) que vc está usando.
Já acompanhei um erro como esse na lista da Borland, então vou arriscar 
que seu caso seja semelhante.
Faz tempo que não trabalho com Delphi, então não leve as coisas ao pé da 
letra.

Se você estiver usando CDS+Provider, há uma propriedade no provider que 
se refere ao modo de atualização (updatemode, se não me engano). Esta 
propriedade, normalmente, vem com default Allfields (ou algo 
semelhante). O melhor é que ela seja KeyOnly, pelo seguinte:
Quando está All e você edita um registro, ele vai montar um update do tipo:
   UPDATE TABELA SET CAMPO = VALOREDITADO WHERE
   CAMPO1=X AND CAMPO2=Y AND CAMPO3=Z AND CAMPON=...

O problema é que se algum dos seus campos for TIMESTAMP, pode haver 
diferença de milisegundos pelo tratamento do componente de acesso. Se 
não me engano, isto também pode acontecer em campos FLOAT. A 
conseqüência é que como a instrução de update se refere a todos os 
campos, se um deles não for com o valor exato, vai furar a condição do 
WHERE e o número de registros afetados pela instrução retorna ZERO. O 
seu componente de acesso, por sua vez, interpreta isso como "Registro 
não existente ou modificado por outro usuário".

A solução então é trocar a propriedade para KeyOnly, ou seja, o UPDATE 
será montado considerando somente a chave primária da tabela. Algo assim:

   UPDATE TABELA SET CAMPO = VALOREDITADO WHERE CAMPOPK=X

Naturalmente, no mesmo componente de acesso, ou no provider, ou no CDS, 
não lembro bem, você terá que indicar quais campos compõem a chave 
primária da tabela em questão.

Espero ter conseguido me fazer entender e ter ajudado.
Talvez algum colega mais ativo nesse assunto possa ajudar melhor, 
principalmente se você nos disser mais sobre o seu ambiente de 
senvolvimento - Linguagem, Sistema Operacional e Componente de acesso 
utilizado.

Abs,

Eduardo

Anderson escreveu:
> Pessoal tenho uma tabela com uns 100 itens
> 
> o detalhe é que se tento alterar os primeiros registros ele altera na boa.
> 
> mas se tento alterar os ultimos ele da:
> 
> "record not found or changed by another user firebird"  e depois "record not 
> find"
> 
> Ja restaurei backup, recriei indice, apaguei o codigo 83 por exemplo, e 
> coloquei de novo !!!!
> 
> e mesmo assim ainda da o erro !
> 
> Uso fire 2.0 delphi 7 e Dbexpress
> 
> Abracos 
> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 





Mais detalhes sobre a lista de discussão lista