Bom dia galera ....

tenho a seguinte situacao:

CDS_MASTER
----------CDS_DETAIL1 ( ITEM DE CDS_MASTER)
----------CDS_DETAIL2 (ITEM DE CDS_MASTER)
--------------------CDS_SUB_DETAIL3 (ITEM DE CDS_DETAIL2)

todos os fields dos ClientDataSets estao configurados
([pfInUpdate,pfInWhere,pfInKey] p/ os PK, e [pfInUpdate] para os demais), do
SqlDataSet tambem, e o DataSetProvider está com o UpdadeMod em WhereKeyOnly,
e o PropagateChanges em True;

no Evento AfterInsert de todos os CDSs, eu passo um valor temporario para o
Field ID da tabela em questao, e no Evento BeforeUpdateRecord do provider eu
chamo uma funcao que pega o ultimo id do banco e passo para o field atraves
da funcao Get_LastID;.

if UpdateKind = ukInsert then
  if SourceDS = sql_MASTER then
  DeltaDS.FieldByName('ID_MASTER).NewValue := Get_LastID
else
  if SourceDS = sql_DETAIL1 then
 DeltaDS.FieldByName('ID_DETAIL1').NewValue := Get_LastID
   else
  if SourceDS = sql_DETAIL2 then
     DeltaDS.FieldByName('ID_DETAIL2').NewValue := Get_LastID
   else
  if SourceDS = sql_SUB_DETAIL3 then
    DeltaDS.FieldByName('ID_SUB_DETAIL3').NewValue := Get_LastID;


um exemplo para facilitar o entendimento:

Insiro um novo registro, atribuo o valor aleatorio para o ID_MASTER ex:
1552;
Insiro um DETAIL1, atribuo o valor aleatorio para o ID_DETAIL1 ex: 3256;
Insiro um DETAIL2, atribuo o valor aleatorio para o ID_DETAIL2 ex: 4458;
Insiro um SUB_DETAIL3, atribuo o valor aleatorio para o ID_SUB_DETAIL3 ex:
9875;

mando salvar, o metodo BeforeUpdateRecord é chamado;

A funcao Get_LastID, pega o valor do ultimo ID_MASTER cadastrado, e já
insere + 1 e retorna o valor 95; atribuo esse valor ao Field ID_MASTER. OK;
quando passa para o sql_DETAIL1, faço a mesma coisa, é retornado o valor
852;
porem dá um erro de violacao de chave estrangeira pois o Field ID_MASTER do
DeltaDS do CDS_DETAIL1 ainda está com o valor antigo ( 1552 );

teoricamente o provider, apos eu alterar o valor do ID do CDS_MASTER, nao
deveria passar essa altualização para todos os IDs vinculados a ele ?

vlw.


[As partes desta mensagem que não continham texto foram removidas]

Responder a