AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TQuery/TTable filtern ohne Daten neu abzurufen

TQuery/TTable filtern ohne Daten neu abzurufen

Ein Thema von Nils S. · begonnen am 23. Mai 2014 · letzter Beitrag vom 25. Mai 2014
Antwort Antwort
Seite 3 von 3     123
Perlsau
(Gast)

n/a Beiträge
 
#21

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 24. Mai 2014, 18:39
Du hast recht: auch bei mir mit IbDac und Firebird läuft das so, ebenso mit Ado und MsSQL. Ich hatte beim ersten Testen nicht daran gedacht, Filtered zuvor auf True zu setzen und daher ein falsches Testergebnis erhalten. Und die Datenmenge muß aus gutem Grund jedesmal neu eingelesen werden, wenn der Filter sich ändert, denn der Filter legt fest, was sich in der Datenmenge befindet: Ausgefilterte Datensätze sind nicht Teil der Datenmenge.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#22

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 08:14
Wenns bei IbDac so läuft, dann postuliere ich, das das mit FireDac auch geht. Ergo liegt ein Refresh-Problem im FMX-Framework vor. Wenn der Fragesteller mit einer TListView arbeitet, wird er das Refresh wohl selber vornehmen... Das könnte die Ursache sein.

Nils: Mehr Code!
  Mit Zitat antworten Zitat
Nils S.

Registriert seit: 10. Apr 2014
36 Beiträge
 
Delphi XE5 Professional
 
#23

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 09:20
Also ich habe das natürlich auch gerade mal ausprobiert mit Filtered := False/True.
Auch da wird der aktuelle Datensatz aus der Datenbank gelesen und angezeigt.
Aber wenn ich den letzten Teil der Disskusion jetzt richtig verstanden habe, ist das so ja der Normalfall.
Du hast recht: auch bei mir mit IbDac und Firebird läuft das so, ebenso mit Ado und MsSQL. Ich hatte beim ersten Testen nicht daran gedacht, Filtered zuvor auf True zu setzen und daher ein falsches Testergebnis erhalten. Und die Datenmenge muß aus gutem Grund jedesmal neu eingelesen werden, wenn der Filter sich ändert, denn der Filter legt fest, was sich in der Datenmenge befindet: Ausgefilterte Datensätze sind nicht Teil der Datenmenge.
Also erstmal kein Refresh Problem mit FMX. (Oder bringe ich jetzt etwas durcheinander?)

Meine ursprüngliche Frage ist ja, wie man dieses Refreshen umgehen kann um den Programmablauf bei großen Datenmengen zu beschläunigen.
Mittlerweile bin ich mir gar nicht mehr sicher ob ich das überhaupt machen will, weil sich ja, wie zuvor auch schon erwähnt wurde, die Daten geändert haben könnten.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#24

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 09:38
NEIN! Es ist *nicht* normal, das bei verändern der Filter-Eigenschaft die Daten neu gelesen werden.
Du hast doch immer noch 'Close/Open' im Code, oder?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#25

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 10:43
Kann ich zumindest für Ado-Dataset auf MsSQL zugreifend bestätigen: Habe eben im Server Manager einen Wert geändert und danach den Filter im bereits verbundenen (Active = True) Ado-Dataset gesetzt mit dem Resultat, daß weiterhin der alte Wert in der betreffenen Spalte angezeigt wurde. Demnach filtert Ado wohl nur die eigene Datenmenge und nicht die in der DB vorhandene. Erst ein Open/Close des Datasets bringt den geänderten Wert zur Ansicht z.B. im DBGrid.

Seltsamerweise erhalte ich beim Versuch, statt Open/Close ein Refresh auszuführen, diese Fehlermeldung:

' Nicht genügend Basistabelleninformationen zum Aktualisieren '

Wie sich das bei anderen DB-Komponenten, noch dazu unter FMX verhält, läßt sich mit Sicherheit ermitteln. Aber ich gehe mal davon aus, daß es sich hier um ein Standard-Verhalten handelt, von dem seriöse Anbieter von DB-Komponenten nicht abweichen.

Delphi-Quellcode:
procedure TFormMain.FilterTest;
Var
 Id : Integer;
begin
  Id := DatMod.Tab_VDateien.FieldByName('Id_Video').AsInteger;
  IF DatMod.Tab_VDateien.Filter = 'THEN
     DatMod.Tab_VDateien.Filter := 'Jahr = 1960ELSE
     DatMod.Tab_VDateien.Filter := '';

// Dieser Befehl führt zu besagter Fehlermeldung:
// DatMod.Tab_VDateien.Refresh;

// Damit werden auch zwischenzeitlich geänderte Daten korrekt angezeigt:
  DatMod.Tab_VDateien.Close;
  DatMod.Tab_VDateien.Open;
  DatMod.Tab_VDateien.Locate('Id_Video',Id,[]);
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#26

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 10:46
Für ein Refresh musst Du dem Dataset einen eindeutigen Schlüssel spendieren. Glaube ich.
  Mit Zitat antworten Zitat
Nils S.

Registriert seit: 10. Apr 2014
36 Beiträge
 
Delphi XE5 Professional
 
#27

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 11:06
Nein, auch ohne ein Close und Open wird die Datenmenge neu abgerufen.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#28

AW: TQuery/TTable filtern ohne Daten neu abzurufen

  Alt 25. Mai 2014, 11:09
Für ein Refresh musst Du dem Dataset einen eindeutigen Schlüssel spendieren. Glaube ich.
Schlüssel? Dataset? Was für ein Schlüssel? Meinst du, man benötigt in der Tabelle einen PK, um ein Refresh ausführen zu können? Der ist natürlich vorhanden: ID_Video.

Auch ein Ändern des Cursotypes im Dataset von ctStatic auf ctDynamic hat nicht die in der Online-Hilfe angekündigte Wirkung, denn der zuvor via DB-Manager geänderte Wert wird auch hier ohne nachstehendes Open/Close nicht angezeigt:

ctDynamic: Dynamischer Cursor. Die von anderen Benutzern hinzugefügten, geänderten und gelöschten Daten werden angezeigt. Die Datensätze können in beiden Richtungen durchlaufen werden.
ctStatic: Statischer Cursor. Eine statische Kopie der Datensätze. Die von anderen Benutzern geänderten Daten werden nicht angezeigt. Diese Cursor-Art wird hauptsächlich für Berichte verwendet.

Hat wohl mit der darunterstehenden Anmerkung zu tun: Wenn die Eigenschaft CursorLocation der ADO-Datenmenge den Wert clUseClientOnly hat, wird nur die Konstante ctStatic unterstützt. Und tatsächlich, clUseServer wird von diesem Provider nicht unterstützt, wie Delphi beim Start der Anwendung meldet, wenn ich die CursorLocation zuvor auf clUseClient (clUseClientOnly gibt's bei mir nicht) umgestellt habe:

' Das aktuelle Recordset unterstützt keine Lesezeichen. Hierbei handelt es sich möglicherweise um eine Einschränkung seitens des Providers oder des gewählten Cursortyps '

Nein, auch ohne ein Close und Open wird die Datenmenge neu abgerufen.
In meinem dargestellten Fall definitiv nicht. Wie hast du das überprüft? Wenn du richtig getestet hast, dann verhalten sich diverse DB-Komponenten diesbezüglich unterschiedlich.
Miniaturansicht angehängter Grafiken
filtertests.jpg  

Geändert von Perlsau (25. Mai 2014 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf