Ir para conteúdo
  • Cadastre-se

dev botao

MasterDetail Firedac CacheUpdate


  • Este tópico foi criado há 151 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal, boa tarde!

Sobre as configurações do M/D com o FireDAC, acredito que tudo seja bastante simples e intuitivo. No meu caso, utilizo o PostgreSQL e tudo aparentemente roda com perfeição.

Recentemente, tive a necessidade de fazer um M/D em três níveis: mestre->detalhe->detalhe->detalhe. O comportamento é bem estranho e parece que estou deixando alguma coisa passar, pois não estão funcionando os recursos de propagar nos detalhes e ao alterar um mestre (seja o principal ou um dos detalhes mestres), o seu detalhe imediato perde dados.

Abaixo, o exemplo dos dois métodos usados para configurar o M/D dos datasets e mais abaixo, as consultas realizadas e configuradas (todas com as FKs devidamente definidas)

Métodos para configuração:

class procedure TUtil.Dados.prepararConsultaMestre(mestre: TFDRdbmsDataSet);
begin

  mestre.CachedUpdates := true;
  mestre.SchemaAdapter := TFDSchemaAdapter.Create( mestre );
  mestre.UpdateOptions.CheckRequired := false;

end;

class procedure TUtil.Dados.prepararConsultaDetalhes(detalhes: TFDRdbmsDataSet; dsMestre: TDataSource; campoMestre, camposIndice: string);
begin

  detalhes.MasterSource := dsMestre;
  detalhes.MasterFields := campoMestre;
  detalhes.IndexFieldNames := camposIndice;
  detalhes.CachedUpdates := true;
  detalhes.SchemaAdapter := TFDSchemaAdapter( TFDRdbmsDataSet( dsMestre.DataSet ).SchemaAdapter );
  detalhes.FetchOptions.DetailCascade := true;
  detalhes.UpdateOptions.CheckRequired := false;

end;

Consultas:

  ///  Tabela salarial
  tabela := TFDQuery.Create( Self );
  tabela.SQL.Add( 'select * from tabelas_salariais where id = :id' );
  tabela.par( id ); <- o método par já faz a configuração para o parâmetro
  TUtil.Dados.prepararConsultaMestre( tabela );
  tabela.Open;

  ///  Classes de tabelas
  classe := TFDQuery.Create( Self );
  classe.SQL.add( 'select * from tabelas_salariais_classes where idTabela = :id order by codigo' );
  classe.par( id ); <- o método par já faz a configuração para o parâmetro
  TUtil.Dados.prepararConsultaDetalhes( classe, ds, 'id', 'idTabela' );
  classe.Open;

  ///  Níveis salariais
  nivel := TFDQuery.Create( Self );
  nivel.SQL.Add( 'select * from tabelas_salariais_niveis where idClasse = :id order by codigo' );
  nivel.ParamByName( 'id' ).DataType := ftInteger;
  TUtil.Dados.prepararConsultaDetalhes( nivel, dsClasse, 'id', 'idClasse' );
  nivel.Open;

  ///  Valores salariais
  valor := TFDQuery.Create( Self );
  valor.SQL.Add( 'select * from tabelas_salariais_valores where idNivel = :id order by iniValidade desc' );
  valor.ParamByName( 'id' ).DataType := ftInteger;
  TUtil.Dados.prepararConsultaDetalhes( valor, dsNivel, 'id', 'idNivel' );
  valor.Open;

Agradeço antecipadamente qualquer dica ou sugestão, bem como indicar algum possível erro na estrutura.

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • 1 mês depois ...
Em 06/10/2023 at 17:43, Ozael Silva disse:

@jcmferreira conseguiu encontrar uma solução?

Bom dia @Ozael Silva!

Ainda não. Em todos os testes que eu fiz com mais de um nível de detalhe (detalhe do detalhe), o cancel em qualquer formato ou método sempre cancela todo o cache.

Posso estar errado mas acho até que o FireDAC não consegue fazer isso.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 151 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...