Erro ao editar registro usando CLientDataset

Delphi

12/05/2006

Estou tendo problema nas tabelas que possuem chave estrangeira...
Em tabelas que não possuem chave estrangeira... está funcionando tudo perfeitamente (consultar,inserir,editar).
Agora em tabelas que possuem chave estrangeira o edição da erro... consigo inserir e consultar normal mais editar não!

SQLDataSet+DataSetProvider+ClientDataSet+DataSource

SQLDataSet
    select
    PRODUTOR.*,
    CIDADE.NOME_CIDADE
    from
    PRODUTOR
    inner join
    CIDADE on (PRODUTOR.COD_CIDADE = CIDADE.COD_CIDADE)
    where
    PRODUTOR.COD_PRODUTOR = :CODIGO


Para editar o registro uso apenas: dm.cdsProdutor.Edit;

E para salvar uso o dm.cdsProdutor.Post; aqui aparece o erro na edição!

Erro:
EDatabaseError "DBX Error: No Mapping for Error Code Found"


Tem alguma idéia do que pode estar errado?

Ah... no AfterPost estou usando

if (DataSet as TClientDataSet).ApplyUpdates(0) <> 0 then
raise EDataBaseError.Create(Exception(exceptobject).Message)
else
(DataSet as TClientDataSet).Refresh;


Por favor se alguém puder ajudar!

Obrigado


Slipkorn

Slipkorn

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

12/05/2006

você precisa informar ao provider que os campos ´estrangeiros´ não devem ser gravados. que eles servem somente para exibição.

mapeie esses campos estrangeiros com o ProviderFlags = pfHidden


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Tentei fazer o que vc sugeriu também não funcionou, no caso o campo NOME_CIDADE que é da tabela cidade e o campo COD_CIDADE que é a chave estrangeira...
Tentei alterar ambos para pfHidden, eles estavam dessa forma:
ProviderFlags:[pfInUpdate,pfInWhere]


Tentei de várias formas..

mudei para ProviderFlags:[pfInUpdate,pfInWhere,pfHIdden] ambos os campos...

mudei para ProviderFlags:[pfInUpdate,pfInWhere,pfHIdden] somente o campo NOME_CIDADE

Depois tentei fazer o mesmo com o COD_CIDADE...

tentei deixar somente pfHidden.... tentei de várias formas o problema continua...

Outra sugestão?

Obrigado pela ajuda!


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Tentei fazer o que vc sugeriu também não funcionou, no caso o campo NOME_CIDADE que é da tabela cidade e o campo COD_CIDADE que é a chave estrangeira...
Tentei alterar ambos para pfHidden, eles estavam dessa forma:
ProviderFlags:[pfInUpdate,pfInWhere]


Tentei de várias formas..

mudei para ProviderFlags:[pfInUpdate,pfInWhere,pfHIdden] ambos os campos...

mudei para ProviderFlags:[pfInUpdate,pfInWhere,pfHIdden] somente o campo NOME_CIDADE

Depois tentei fazer o mesmo com o COD_CIDADE...

tentei deixar somente pfHidden.... tentei de várias formas o problema continua...

Outra sugestão?

Obrigado pela ajuda!


GOSTEI 0
Eleusis

Eleusis

12/05/2006

Caro amigo, ja passei por esse problema, se resolve da seguinte forma:
-- Va no evento BeforeUpDateRecord do DataSetProvider e ponha o seguinte código:
DeltaDS.FieldByName(´Nome_do_Campo´).ProviderFlags :=[pfHidden]

Faz isso para cada chave estrangeira

Espero ter ajudado

Eleusis


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Olá Eusis....

Tentei fazer o que vc sugeriu também não funcionou...

Agora está aparecendo outro erro:

Dynamic SQL Error
         SQL Error code = -206
         column unknown
         NOME_CIDADE
         Column does not belong to referenced table
         Error Code: 249



Mais alguma idéia...????

Obrigado pela ajuda!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/05/2006

o problema pode estar ocorrendo por você ter mais de um clientdataset anexado ao provider (acontece quando se usa nesteddatasets).
tente assim:
if SourceDS = Seu_SQLDataset then
begin
  DeltaDs.FieldByName(´Campo_Estrangeiro1´).ProviderFlags := [pfHidden];
  DeltaDs.FieldByName(´Campo_Estrangeiro2´).ProviderFlags := [pfHidden];
end;



GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Esse tá difícil nada ainda apareceu o mesmo erro... E só estou usando um clientdataset nesse provider...


Outra sugestão


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

emerson.en

Se vc puder dar uma olhada... eu poderia enviar o fonte para vc...


Valew

T+


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/05/2006

envie o fonte e seu db pra eu dar uma olhada.

emerson.en@gmail.com


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Kra acabei de enviar o fonte e o banco!!

valew pela ajuda... qq coisa estou no msn...

diegobrandao85@hotmail.com


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/05/2006

o problema pode estar ocorrendo por você ter mais de um clientdataset anexado ao provider (acontece quando se usa nesteddatasets). tente assim:
if SourceDS = Seu_SQLDataset then
begin
  DeltaDs.FieldByName(´Campo_Estrangeiro1´).ProviderFlags := [pfHidden];
  DeltaDs.FieldByName(´Campo_Estrangeiro2´).ProviderFlags := [pfHidden];
end;

amigo, já sei o porque do seu problema!!!

preste atenção no código que eu postei pra você (acima). olhe minuciosamente...
encontrou?

se não encontrou, vou te falar: a verificação é feita em função do [b:82846e0c3d]SQLDataset[/b:82846e0c3d] (Seu_[b:82846e0c3d]SQL[/b:82846e0c3d]Dataset ). preste atenção no código acima.

mas você fez a verificação no ClientDataset!!!
if SourceDS = cdsProdutor then

altere para
if SourceDS = [b:82846e0c3d]SQLProdutor[/b:82846e0c3d] then
que seus problemas estarão resolvidos.


GOSTEI 0
Slipkorn

Slipkorn

12/05/2006

Salve Emerson


Kra valew pela ajuda... agora funcionou perfeitamento... Nem reparei nesse detalhe fundamental... mais uma vez obrigado!


Problema Resolvido!


GOSTEI 0
POSTAR