Record not found or changed by another user / Unable to find

Delphi

01/04/2005

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.


Daaneto

Daaneto

Curtidas 0

Respostas

Fred

Fred

01/04/2005

as provider flags, vc soh configura no SQLDataSet!!!


GOSTEI 0
Daaneto

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:

    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

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

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

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


GOSTEI 0
Fred

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

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.

    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

Antoniologica

01/04/2005

O clientdataset pode não está inserindo o registro.
coloca no evento onReconcilieError o código:
 ShowMessage(E.Message);


e verifique se retorna algum erro na inclusão.


GOSTEI 0
Antoniologica

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

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


GOSTEI 0
POSTAR