Record not found or changed by another user / Unable to find
Para fazer a inserção de um registro no banco de dados está funcionando perfeitamente. O problema acontece quando tento realizar uma edição deste registro que foi inserido, dando as seguintes mensagens de erro:
1 - Record not found or changed by another user
2 - Unable to find record. No key specified.
Segui as recomendações daqui do fórum, colocando a propriedade UpdateMode para WhereKeyOnly e coloquei o campo que representa a sua chave primária no ProviderFlags (SQLDataSet e ClientDataSet) para InKey=True.
Não funcionou.
No tópico http://forum.devmedia.com.br/viewtopic.php?t=18327&highlight=record+found
é falado de cofiguração do ´DataSetProvider de acordo com suas necessidades e então defina os ProviderFlags do DataSet de acordo com sua opção´
Quando deveriamos usar as opções fornecidas no DataSetProvider, ou seja, em que caso devemos usar que opção do UpdateMode?
A mesma questão vai para o SQLDataSet e o ClientData, para a propriedade ProviderFlags.
1 - Record not found or changed by another user
2 - Unable to find record. No key specified.
Segui as recomendações daqui do fórum, colocando a propriedade UpdateMode para WhereKeyOnly e coloquei o campo que representa a sua chave primária no ProviderFlags (SQLDataSet e ClientDataSet) para InKey=True.
Não funcionou.
No tópico http://forum.devmedia.com.br/viewtopic.php?t=18327&highlight=record+found
é falado de cofiguração do ´DataSetProvider de acordo com suas necessidades e então defina os ProviderFlags do DataSet de acordo com sua opção´
Quando deveriamos usar as opções fornecidas no DataSetProvider, ou seja, em que caso devemos usar que opção do UpdateMode?
A mesma questão vai para o SQLDataSet e o ClientData, para a propriedade ProviderFlags.
Daaneto
Curtidas 0
Respostas
Fred
01/04/2005
as provider flags, vc soh configura no SQLDataSet!!!
GOSTEI 0
Daaneto
01/04/2005
Fiz o que foi sugerido mas ainda apresenta o erro.
Segue o código utilizado para fazer a inserção e edição dos registros:
cdsTanques é o ClientDataSet, que agora está com o ProviderFlags com [pfInUpdate,pfInWhere], para todos os campos da tabela.
Já no sdsTanques que é o SQLDataSet, está com o ProviderFlags com [pfInUpdate,pfInWhere,pfInKey] = True para o campo de auto incremento. Para os outros campos está [pfInUpdate,pfInWhere] = True.
Obrigado pela ajuda.
Segue o código utilizado para fazer a inserção e edição dos registros:
Application.CreateForm(TfrmCadastroTanque, frmCadastroTanque); // Para Inserção: dm.cdsTanques.Insert; // Para Edição: dm.cdsTanques.Edit; If frmCadastroTanque.ShowModal = MROK Then Begin dm.cdsTanques.ApplyUpdates(0); End Else Begin dm.cdsTanques.Cancel; End;
cdsTanques é o ClientDataSet, que agora está com o ProviderFlags com [pfInUpdate,pfInWhere], para todos os campos da tabela.
Já no sdsTanques que é o SQLDataSet, está com o ProviderFlags com [pfInUpdate,pfInWhere,pfInKey] = True para o campo de auto incremento. Para os outros campos está [pfInUpdate,pfInWhere] = True.
Obrigado pela ajuda.
GOSTEI 0
Fred
01/04/2005
eu uso assim: pfinUpdate = True, para todos os campos, menos o chave, pfinupdate, pfinwhere, pfinkey para o campo chave!!
GOSTEI 0
Daaneto
01/04/2005
eu uso assim: pfinUpdate = True, para todos os campos, menos o chave, pfinupdate, pfinwhere, pfinkey para o campo chave!!
O campo chave deve ser pfInUpdate = True ou False?
Os outros campos devem ter pfinUpdate = True, pfInWhere = True, pfInKey = False?
GOSTEI 0
Vendre
01/04/2005
Errado.. os outros campos tem q ser apenas pfinupdate e naum pfinWhere pq senaum os outros campos tbm vaum entrar na clausula where... se ta acontecendo esse erro amigo vc deve conferir c ja existe este campo no banco pq as vezes ele pode estar ainda em cache e naum no banco ainda... ou entaum vai no teu datasetprovidet nas opcoes de updatecascate e coloca true.. pode ser q resolva
vlw
vlw
GOSTEI 0
Fred
01/04/2005
Op´s foi mal!! campo chave: pfInupdate = true, pfInWhere = true, pfInKey = true; demais campos: pfInUpdate = true, pfInWhere = false, pfInKey = false; campos nao pertencentes à tabela: pfInUpdate = false, pfInWhere = false, pfInKey = false.
GOSTEI 0
Daaneto
01/04/2005
Fiz as alterações que vocês sugeriram, mas ainda não deu certo.
Continua dando a mesma mensagem de erro: Record not found or changed by another user.
Testei, como sugerido, modificar apenas o ProviderFlags apenas do SQLDataSet, como não funcionou modifiquei também o do ClientDataSet e também não funcionou.
Modifiquei também o poCascadeUpdates do DataSetProvider e também não deu certo.
O que estou fazendo para remediar a situação é fechar o SQLDataSet após a inserção com o ApplyUpdates(0) e abrir novamente.
O problema é que quando é aberto novamente, logicamente ele não está mais no mesmo registro.
Sei que esta não é a solução correta.
Continua dando a mesma mensagem de erro: Record not found or changed by another user.
Testei, como sugerido, modificar apenas o ProviderFlags apenas do SQLDataSet, como não funcionou modifiquei também o do ClientDataSet e também não funcionou.
Modifiquei também o poCascadeUpdates do DataSetProvider e também não deu certo.
O que estou fazendo para remediar a situação é fechar o SQLDataSet após a inserção com o ApplyUpdates(0) e abrir novamente.
Application.CreateForm(TfrmCadastroTanque, frmCadastroTanque); dm.cdsTanques.Insert; If frmCadastroTanque.ShowModal = MROK Then Begin dm.cdsTanques.Post; End Else Begin dm.cdsTanques.Cancel; End; dm.cdsTanques.ApplyUpdates(0); dm.cdsTanques.Close; dm.cdsTanques.Open;
O problema é que quando é aberto novamente, logicamente ele não está mais no mesmo registro.
Sei que esta não é a solução correta.
GOSTEI 0
Antoniologica
01/04/2005
O clientdataset pode não está inserindo o registro.
coloca no evento onReconcilieError o código:
e verifique se retorna algum erro na inclusão.
coloca no evento onReconcilieError o código:
ShowMessage(E.Message);
e verifique se retorna algum erro na inclusão.
GOSTEI 0
Antoniologica
01/04/2005
Ah, outra dica que achei por aqui pelo forum, foi de adicionar também os Fields no SQLDataSet e configurar o ProviderFlags dos Fields como do ClientDataSet
GOSTEI 0
Pro2
01/04/2005
e o seguinte
coloca todos os campo (Fields) tanto no no clientdataset quanto no sqldataset
no clientdataset :
depois no campo chave vc colocar assim
pfiNUpdate := false;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;
no sqldataset
depois no campo chave vc colocar assim
pfiNUpdate := true;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;
e no DataSetProvider fica assim
UpdateMode = upWhereKeyOnly
deste forma resolve o problema
coloca todos os campo (Fields) tanto no no clientdataset quanto no sqldataset
no clientdataset :
depois no campo chave vc colocar assim
pfiNUpdate := false;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;
no sqldataset
depois no campo chave vc colocar assim
pfiNUpdate := true;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;
e no DataSetProvider fica assim
UpdateMode = upWhereKeyOnly
deste forma resolve o problema
GOSTEI 0