![]() |
TQuery/TTable filtern ohne Daten neu abzurufen
Guten Tag zusammen,
wenn man bei einem Query oder Table den Filter setzt (
Delphi-Quellcode:
), wird die Datenmenge, welche die Komponente abrufen soll, neu abgerufen (mit einer Where-Klausel o.ä.) oder nicht?
Table1.Filter := 'Column1 = abc';
Wenn dem so ist, würde das die Performance bei größeren Datenmengen wohl stark beeinflussen. Gibt es eine Möglichkeit, dass einfach nur die vorhandene Datenmenge der Komponente gefiltert und angezeigt wird ohne, dass die Daten neu abgerufen werden? |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Ich war bisher der Meinung, dass keine neue Abfrage an die DB geschickt wird, sondern, dass der Filter auf die abgerufene Datenmenge angewendet wird.
|
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Filter ist noch nur von TDataSet vorgegeben, wie die konkrete Implementierung aussieht, kann wahrscheinlich jede Implementierung (FireDAC, dbExpress, ...) selbst entscheiden, oder?
Das hätte ich jetzt geraten ohne irgendetwas zu prüfen... |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Also in meinem Fall handelt es sich um FireDAC Komponenten.
Ich habe mal was gehört von server- und clientseitigem Filter. Finden kann ich unter diesen Begriffen aber nichts. |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Kannst Du den sicherstellen, dass sich zwischendurch nichts geändert hat?
Wenn nicht, dann wäre es nicht sinnvoll, wenn Du nur in den bereits gelesenen Daten filtern würdest. Moin |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
FireDAC verweist auf die Data.DB-Grundphilosophie.
Zitat:
|
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Zitat:
Du programmierst dir eine Methode zum Setzen bzw. Löschen des Filters:
Delphi-Quellcode:
Die rufst du – meinetwegen mit einem Buttonklick – auf, nachdem du mit deinem Lieblings-Datenbank-Manager einen Wert in dieser Tabelle geändert hast. Wird der geänderte Wert auch in deiner Anwendung angezeigt, hat das Setzen des Filters aktuelle Daten aus der DB geschaufelt, andernfalls nicht.private {private Deklarationen} Procedure TFormMain.Filtern(MyTable : TTable; MyFilter : String; Setzen : Boolean); begin MyTable.Filtered := False; if Setzen then begin MyTable.Filter := MyFilter; MyTable.Filtered := True; end; end; |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Zitat:
Habe nun festgestellt, dass bei einem Filter die Daten aus der Datenbank neu abgerufen werden. |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Zitat:
Und wenn du nicht willst, daß beim Filtern die Datenmenge neu abgerufen wird, verwendest du ein TClientDataset oder ein TMemoryDataSet, das zum Zeitpunkt der Filtersetzung keine Verbindung zur Datenbank besitzt, was bei großen Datenmengen selbstverständlich entsprechende Speicherkapazitäten voraussetzt. |
AW: TQuery/TTable filtern ohne Daten neu abzurufen
Geprüft habe ich es jetzt selbst noch nicht, aber das hätte ich jetzt nicht erwartet! :oops:
Ich hatte mehr aus Interesse einfach mal nicht die Query angepasst, sondern mal mit der Filter-Einstellung gespielt. Wenn es um ein paar GB geht ist ein Memory-Dataset bei mir allerdings auch keine Option mehr :lol: Ich glaube, ich lasse die ganze Filter-Geschichte einfach sein... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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 by Thomas Breitkreuz