Record not found or changed by another user ?
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.
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
Curtidas 0
Melhor post
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.
é 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
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
07/06/2004
Mais uma voz se junta. Estou quebranco a cabeca com isso tb.
SOCOOOOORROOOOOO!!!!!
SOCOOOOORROOOOOO!!!!!
GOSTEI 1
Rômulo Barros
07/06/2004
http://www.firebird.com.br/faq.php?topic=1
GOSTEI 1
Mauro Murari
07/06/2004
Obrigado resolveu o meu problema e de outros muitos.
GOSTEI 1
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
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
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
07/06/2004
Obigado. Resolveu e me ensinou muito.
GOSTEI 1
Felipe Riedi
07/06/2004
Ótimo post.
GOSTEI 1
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.
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
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