Record not found or changed by another user ?

Delphi

07/06/2004

Olá Pessoal !

estou usando FireBird última versão com DBX em um Servidor Windows Server 2003, incluo um registro e gravo, depois se eu alterar e mudar uma vírgula aparece esse erro:

Record not found or changed by another user, isso se o banco de dados estiver local não acontece.

alguém sabe o que pode ser ?

estou usando SQLDataSet + DataSetProvider + ClientDataSet

estou usando no DataSet:

Edit = Para alterar.
ApplyUpdates(-1) = Para Gravar.


Muito obrigada !

Renata Coimbra.


Renata Coimbra

Renata Coimbra

Curtidas 0

Melhor post

Logado

Logado

11/07/2004

olá pessoal,

é com muito prazer q venho dar uma contribuição com vcs pois já passei por isso e perdi 7 horas de trabalho (com o dono da empresa em cima) por causa desse erro.

Isso eh um bug do componente e agora naum me lembro os detalhes pra explicar pra vcs o por que. Mas vamos ao q interessa:

No datasetprovider tem uma propriedade chamada ´ UpdateMode´ o valor default dela eh ´upWhereAll´ funciona muito bem com tabelas que não possuem chave primária, mas normalmente vc terá chave primária entaum mude para ´upWhereKeyOnly´ e isso deve resolver...

Se não resolver avisem!!

ABS.


GOSTEI 3

Mais Respostas

Eniorm

Eniorm

07/06/2004

Olá Pessoal ! estou usando FireBird última versão com DBX (...) depois se eu alterar e mudar uma vírgula aparece esse erro: Record not found or changed by another user, (...)


Estou com o mesmo problema, mas estou usando o DBX com
o MySQL, e o banco é local.
Ajuda será bem vinda, claro.
T+


GOSTEI 1
Xisto

Xisto

07/06/2004

Mais uma voz se junta. Estou quebranco a cabeca com isso tb.
SOCOOOOORROOOOOO!!!!!


GOSTEI 1
Rômulo Barros

Rômulo Barros

07/06/2004

http://www.firebird.com.br/faq.php?topic=1


GOSTEI 1
Mauro Murari

Mauro Murari

07/06/2004

Obrigado resolveu o meu problema e de outros muitos.
GOSTEI 1
Vitor Rubio

Vitor Rubio

07/06/2004

Na verdade não é bug, mas isso define que tipo de instrução irá ser "concatenada" no filtro where da instrução update.
O CDS + DBX irá criar uma instrução update automaticamente quando você salvar um registro alterado. Se estiver como WhereKeyOnly o sql será formado assim:
update tabela set campo1 = valor, campo2 = valor, campo3 = valor where chave = valordachave

com o UpdateWhereAll a instrução seria 
update tabela set campo1 = valor, campo2 = valor, campo3 = valor where chave = valordachave and campo1 = valor1, campo2 = valor2, campo3 = valor3 
e assim por diante.

O UpdateWhereAll  cria um comando maior pois poe todas as colunas no where, enquanto o WhereKeyOnly poe só a chave primária. UpdateWhereAll   é "pessimista". Ele só dá update se todos os campos do banco forem iguais ao que você tinha antes de alterar. Se algum campo for diferente é porque ele já sofreu um update de outra pessoa antes do seu. Nesse caso o where não traria nada, não modificaria nenhuma linha, pois mesmo com a chave sendo igual os outros campos no banco já são diferentes, e a linha não seria encontrada. 
O WhereKeyOnly dá update filtrando só pela chave primaria. Então se você pega um registro assimnome  telefone
joão    12345678
e altera para 
nome telefonejoão    11111111
mas antes de você dar o apply updates alguém altera para nome    telefonejosé      12345678
e dá o apply, o seu update vai ser por cima desse, ou seja, o cara mudou o nome do cliente pra josé, mas manteve o mesmo telefone. Você vai alterar o telefone, como queria, mas vai fazer o nome dele voltar para João.
Isso é raro de acontecer. 
Dê umas olhadas também nas propriedades provider flags dos fields e no evento onreconcileerror. Você vai aprender como resolver vários tipos de situação de conflitos. 

E se acontecer com você um erro de key violation em datasets aninhados, tá aí a dica http://blog.vitorrubio.com.br/2011/06/key-violation-em-nested-datasets.html
GOSTEI 1
Marcio Poffo

Marcio Poffo

07/06/2004

No caso do Report Builder, pode ser que após ter sido feita a leitura inicial da query, os dados foram eliminados, no caso de dados temporários. Isto é, gerou a pagina inicial d relatorio e, quando clicado em proxima página, a tabela foi limpa. Ocorrerá este erro também.
GOSTEI 1
Rmr Ltda

Rmr Ltda

07/06/2004

Obigado. Resolveu e me ensinou muito.
GOSTEI 1
Felipe Riedi

Felipe Riedi

07/06/2004

Ótimo post.
GOSTEI 1
Francisco Junior

Francisco Junior

07/06/2004

Cara,

Em 2021 vc me salvou, já tinha verificado tudo quanto há e não achava o diacho da solução. Bastou alterar isso que vc disse e funcionou perfeitamente.
GOSTEI 0
Marcos Castro

Marcos Castro

07/06/2004

Estou implementando um sistema novo e parti para o FireDac. Com o FireDac tive muitos problemas de não gravação de registros, ter que fechar programa, startar transação etc, etc. Não resolveu meu problema e voltei para o velho e seguro BDX. No entanto comecei a ter esta mensagem 'Record not found or changed by another user'. Quebrei muito a cabeça mas graças a esta dica do provider, upDateMode = upWhereKeyOnly resolveu. Muito obrigado a todos. No meu caso também tive que setar no campo da chave a propriedade ProviderFlags.pfInKey = True. Valeu comunidade.
GOSTEI 0
POSTAR