FireDAC - Master Detail

28/11/2020

0

Estou usando Delphi 10.2 + FireDAC + Cached Updates + MasterDetail
Fiz todas as configurações necessárias..

Master
CachedUpdate = True
SchemaAdapter

Detail
CachedUpdate = True
FetchOptions (Detail Cascade = True)
IndexFieldNames (Chave Detail)
MasterFields (Chave Master)
MasterSource (DataSource Master)
SchemaAdapter

SchemaAdapter
ApplyUpdates(-1)
Master.CommitUpdates
Detail.CommitUpdates

Porem apresenta esse erro: [FireDAC][DatS]-16. Cannot process - no parent row. Constraint [ForeignKeyConstraint].
Se eu incluir na master (der um POST), e depois incluir na detail, funciona, mas sai do Objetivo de "Cache"
Gabriel Kenji

Gabriel Kenji

Responder

Posts

30/11/2020

Gabriel Kenji

Estou usando Delphi 10.2 + FireDAC + Cached Updates + MasterDetail
Fiz todas as configurações necessárias..

Master
CachedUpdate = True
SchemaAdapter

Detail
CachedUpdate = True
FetchOptions (Detail Cascade = True)
IndexFieldNames (Chave Detail)
MasterFields (Chave Master)
MasterSource (DataSource Master)
SchemaAdapter

SchemaAdapter
ApplyUpdates(-1)
Master.CommitUpdates
Detail.CommitUpdates

Porem apresenta esse erro: [FireDAC][DatS]-16. Cannot process - no parent row. Constraint [ForeignKeyConstraint].
Se eu incluir na master (der um POST), e depois incluir na detail, funciona, mas sai do Objetivo de "Cache"



Enviei um e-mail para o responsável da Embarcadero, ele falo pra eu tentar atualizar o Delphi.
Sai do Delphi 10.2 e fui para o Delphi 10.3.3 (Rio) e adivinha? funcionou perfeitamente.
O mesmo fonte, funcionou no 10.3.3.. caso tenham esse erro, atualize que funciona..
Responder

01/07/2022

Wilson Pereira

Passei pela mesma situação e depois de 3 horas de pesquisa, tentativa e erro, testei a solução do link a seguir (Salvar e Editar) e Funcionou!!! https://www.devmedia.com.br/forum/firedac-mestredetalhe-postgre/531378 Então notei que no final das contas o problema era tentar dar um AppyUpdates com as duas Queryes (através do SchemaAdapter) com Chaves Temporárias (como o -1) que o Firedac cria. Ou seja, por estar em cache, o Firedac não "advinha" o próximo número número e tenta salvar com o "-1", logo dá este erro. Mas ao salvar primeiro o Mestre, já obtém o número correto do autoincremento e replica no Detalhe. Assim sendo, exatamente antes de salvar o Detalhe, adicionei esta linha de código "If QueryMestre.State IN [dsInsert, dsEdit] Then QueryMestre.Post();". E agora sim. Às 23:57 e morto de cansado, vou dormir tranquilo!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar