Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Richtiges Aktualisieren einer Query (https://www.delphipraxis.net/198677-richtiges-aktualisieren-einer-query.html)

mariusbenz 23. Nov 2018 07:23

Datenbank: Advantage Database, SQL-Server • Version: ? • Zugriff über: UNIDAC

Richtiges Aktualisieren einer Query
 
Guten Morgen,

folgende Situation: TDBGrid mit TDataSource mit TUniQuery als Dataset.
Wie aktualisiert man jetzt zuverlässig die Datenmenge?

Eigentlich ja mit "Query.Refresh". Allerdings hat mein Kollege den (evtl. Irr-)Glauben, dass das nicht immer funktioniert, was wir aber noch nicht nachstellen konnten.

Laut Delphi-Hilfe ist das auch berechtigt:
Anmerkung: Die Methode Refresh funktioniert nicht bei allen von TDataSet abgeleiteten Klassen. Insbesondere TQuery-Komponenten unterstützen Refresh nicht, wenn die Abfrage nicht "live" ist. Um ein statisches TQuery-Objekt zu aktualisieren, schließen und öffnen Sie die Datenmenge.

Was ist der Unterschied zwischen "live" und "statisch" in diesem Fall?
Ein Close und Open der Query hat natürlich zur Folge, dass z.B. AfterOpens der Query ausgeführt werden, das Grid neugezeichnet wird, man die letzte ausgewählte Zeile erneut suchen muss, etc.

hoika 23. Nov 2018 07:48

AW: Richtiges Aktualisieren einer Query
 
Hallo,
Open/Close ist meine erste Wahl.
Es kann sich ja zwischenzeitlich etwas geändert haben.
Das Refresh kommt noch aus der guten alten TTable-Zeit.

Zitat:

Ein Close und Open der Query hat natürlich zur Folge, dass z.B. AfterOpens der Query ausgeführt werden, das Grid neugezeichnet wird, man die letzte ausgewählte Zeile erneut suchen muss, etc.
Das lasse ich nicht gelten, weil ich keine datensensitiven Elemente (z.B. TDBGrid) benutze.
Was benutzt du denn?

Uwe Raabe 23. Nov 2018 08:13

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von hoika (Beitrag 1418878)
Zitat:

Ein Close und Open der Query hat natürlich zur Folge, dass z.B. AfterOpens der Query ausgeführt werden, das Grid neugezeichnet wird, man die letzte ausgewählte Zeile erneut suchen muss, etc.
Das lasse ich nicht gelten, weil ich keine datensensitiven Elemente (z.B. TDBGrid) benutze.

Die Notwendigkeit, auf den zuletzt aktiven Datensatz zu positionieren ist erstmal unabhängig vom Einsatz datensensitiver Controls. Für das Argument mit AfterOpen gilt sinngemäß dasselbe.

mariusbenz 23. Nov 2018 08:15

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von hoika (Beitrag 1418878)
Hallo,
Open/Close ist meine erste Wahl.
Es kann sich ja zwischenzeitlich etwas geändert haben.

Um das zu testen haben wir uns eine aktuelle Datenmenge anzeigen lassen, dann in der Datenbank Werte geändert (sodass sich nur bestimmte Werte ändern oder durch Filterung Zeilen dazukommen/verschwinden), und schließlich mit einem einfachen Refresh aktualisiert -> alle Änderungen wurden im Grid angezeigt.

Lemmy 23. Nov 2018 08:32

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von mariusbenz (Beitrag 1418881)
Um das zu testen haben wir uns eine aktuelle Datenmenge anzeigen lassen, dann in der Datenbank Werte geändert (sodass sich nur bestimmte Werte ändern oder durch Filterung Zeilen dazukommen/verschwinden), und schließlich mit einem einfachen Refresh aktualisiert -> alle Änderungen wurden im Grid angezeigt.


dann ist doch gut, wenn es bei Dir funktioniert.

gestern habe ich mit pgDac gespielt (Devart Komponenten für PostgreSQL) - da hat ein Refresh nicht funktioniert. und bei IBObjects mach ich inzwischen einen großen Bogen sowohl um Refresh als auch um locate.

Interessant wäre jetzt wie TUniQuery das Refrehs umsetzt - vielleicht macht das intern einen Open-Close mit Positionierung auf den letzt gewählten Datensatz (falls möglich)... Schon mal in den Source rein geschaut?

mariusbenz 23. Nov 2018 09:05

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von Lemmy (Beitrag 1418882)
Interessant wäre jetzt wie TUniQuery das Refrehs umsetzt - vielleicht macht das intern einen Open-Close mit Positionierung auf den letzt gewählten Datensatz (falls möglich)... Schon mal in den Source rein geschaut?

Delphi-Quellcode:
procedure TDataSet.Refresh;
begin
  DoBeforeRefresh;
  CheckBrowseMode;
  UpdateCursorPos;
  try
    InternalRefresh;
  finally
    Resync([]);
    DoAfterRefresh;
  end;
end;
Hab mal drübergschaut, die Aktualisierung der Daten passiert im InternalRefresh. Ein Strg+Klick führt mich da in eine leere Prozedur, über F7 beim debuggen verliert es sich dann irgendwann in ASM

mariusbenz 23. Nov 2018 09:08

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von mariusbenz (Beitrag 1418876)
Laut Delphi-Hilfe ist das auch berechtigt:
Anmerkung: Die Methode Refresh funktioniert nicht bei allen von TDataSet abgeleiteten Klassen. Insbesondere TQuery-Komponenten unterstützen Refresh nicht, wenn die Abfrage nicht "live" ist. Um ein statisches TQuery-Objekt zu aktualisieren, schließen und öffnen Sie die Datenmenge.

Was ist der Unterschied zwischen "live" und "statisch" in diesem Fall?

Weiß jemand was das genau bedeutet? Hat das evtl. damit zu tun, wie das SQL-Statement aufgebaut ist?

Schokohase 23. Nov 2018 09:09

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von mariusbenz (Beitrag 1418889)
Hab mal drübergschaut, die Aktualisierung der Daten passiert im InternalRefresh. Ein Strg+Klick führt mich da in eine leere Prozedur, über F7 beim debuggen verliert es sich dann irgendwann in ASM

Natürlich, denn das ist eine virtuelle Methode die dann von Nachfolgern wie z.B.
Delphi-Quellcode:
TUniQuery
überschrieben werden kann. Man muss also dort nachschauen und nicht bei
Delphi-Quellcode:
TDataSet
.

RSF 23. Nov 2018 09:37

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von mariusbenz (Beitrag 1418890)
Zitat:

Zitat von mariusbenz (Beitrag 1418876)
Laut Delphi-Hilfe ist das auch berechtigt:
Anmerkung: Die Methode Refresh funktioniert nicht bei allen von TDataSet abgeleiteten Klassen. Insbesondere TQuery-Komponenten unterstützen Refresh nicht, wenn die Abfrage nicht "live" ist. Um ein statisches TQuery-Objekt zu aktualisieren, schließen und öffnen Sie die Datenmenge.

Was ist der Unterschied zwischen "live" und "statisch" in diesem Fall?

Weiß jemand was das genau bedeutet? Hat das evtl. damit zu tun, wie das SQL-Statement aufgebaut ist?

Live: Die Datenmenge kann bearbeitet werden. Normale SQL-Abfrage
Statisch: Die Datenmenge kann nicht bearbeitet werden. z.B. wenn einer Abfrage aus Felder mehreren Tabellen zusammen gesetzt ist.

mariusbenz 23. Nov 2018 09:43

AW: Richtiges Aktualisieren einer Query
 
Zitat:

Zitat von RSF (Beitrag 1418898)
Zitat:

Zitat von mariusbenz (Beitrag 1418890)
Zitat:

Zitat von mariusbenz (Beitrag 1418876)
Laut Delphi-Hilfe ist das auch berechtigt:
Anmerkung: Die Methode Refresh funktioniert nicht bei allen von TDataSet abgeleiteten Klassen. Insbesondere TQuery-Komponenten unterstützen Refresh nicht, wenn die Abfrage nicht "live" ist. Um ein statisches TQuery-Objekt zu aktualisieren, schließen und öffnen Sie die Datenmenge.

Was ist der Unterschied zwischen "live" und "statisch" in diesem Fall?

Weiß jemand was das genau bedeutet? Hat das evtl. damit zu tun, wie das SQL-Statement aufgebaut ist?

Live: Die Datenmenge kann bearbeitet werden. Normale SQL-Abfrage
Statisch: Die Datenmenge kann nicht bearbeitet werden. z.B. wenn einer Abfrage aus Felder mehreren Tabellen zusammen gesetzt ist.

Kann man bei statischen Querys dann auch kein Query.Edit und Query.Post durchführen?
Weil bei der Query habe ich zwei LEFT JOINS drin, also müsste es ja eine statische Query sein (?), dennoch funktionieren Refresh, Edit und Post dabei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz