AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail
Thema durchsuchen
Ansicht
Themen-Optionen

FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail

Ein Thema von Gremlin · begonnen am 18. Jul 2025 · letzter Beitrag vom 4. Aug 2025
Antwort Antwort
Gremlin

Registriert seit: 18. Apr 2006
Ort: Im Süden
178 Beiträge
 
Delphi 7 Enterprise
 
#1

FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail

  Alt 18. Jul 2025, 09:51
Datenbank: Firebird • Version: 3 • Zugriff über: Delphi 10.2 Firedac
Hallo,


ist euch etwas darüber bekannt, dass eine Master/Detail-Beziehung ignoriert wird, wenn eine Filterbedingung im Detail via OnFilterRecord verwendet wird? Problem: Es werden alle Datensätze der Detail-Datenmenge geladen, mit Auslösen einer EOutOfMemory-Exception, wenn ausreichend viele Details vorhanden sind.

Wird die Datenmenge jedoch über eine Filter := <Ausdruck>-Bedingung gefiltert, so tritt das Problem nicht auf. Leider kann der Filter nicht darüber verwendet werden.
Master und Detail sind jeweils TFDTable, die über eine TFDConnection an einem Firebird 3.x Server verbunden sind. Spezielle Anpassungen wurden nicht vorgenommen. Detail enthält Master als MasterSource, verknüpft über das Feld 'Nr'

Verwendete Tabellen des Demo-Projekts:

Master (ca. 2000 DS)

Nr integer
Name varchar(50)

Detail (ca. 800000 DS)

Nr integer
PosNr integer
Name1
Name2 varchar(50)
Anzahl integer


Die Exception passiert an dieser Stelle (FireDac.DatS.pas)

procedure TFDDatSRowListWithAggregates.AddObjectAt(AObj: TFDDatSObject;
AIndex: Integer);
begin
inherited AddObjectAt(AObj, AIndex);
if FAggregateSlotAllocated > 0 then
AddAggregatesRow(AIndex);
end;


Vielen Dank
Gruss Gremlin
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail

  Alt 18. Jul 2025, 10:23
Statt TFDTable solltest du besser TFDQuery verwenden und auf Parameter-based M/D umstellen. Bei Range-based M/D werden tatsächlich alle Datensätze geladen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ashlelton

Registriert seit: 28. Jul 2025
3 Beiträge
 
#3

AW: FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail

  Alt 4. Aug 2025, 03:09
Das beschriebene Verhalten ist bekannt – OnFilterRecord wirkt clientseitig, weshalb zunächst alle Detail-Datensätze geladen werden, was bei großen Datenmengen zu Speicherproblemen führt. Für große Datenmengen empfiehlt sich stattdessen serverseitiges Filtern, z. B. über Filter-Eigenschaft mit Filtered := True oder ein angepasstes SQL mit WHERE-Klausel in einer TFDQuery.

Geändert von TBx ( 4. Aug 2025 um 06:23 Uhr) Grund: Full-Quote entfernt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#4

AW: FireDac: Filterbedingung über OnFilterRecord ignoriert Master/Detail

  Alt 4. Aug 2025, 08:34
Es kommt drauf an, wie "Filter" beim FireDAC artbeitet / implementiert ist. (auf Ebene des TDataSet scheint die Implementation noch leer zu sein)
  • ebenfalls nur clientsitig (hat dann das selbe Problem, wie OnFilterRecord)
  • oder wird das WHERE-Statement damit umgeschrieben/erweitert (hier wird nur das vom Server geholt, was getroffen wird)

z.B. pgDAC (und eventuell auch AnyDAC und die anderen, jenes Herstellers) besitzen neben dem Filter noch ein zusätzliches SQLFilter.
Beim FireDAC seh ich nur dieses "Filter", aber das kann man ja leicht prüfen, was hier der Fall ist (am Sichersten im Log).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Aug 2025 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz