AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Richtiges Aktualisieren einer Query

Richtiges Aktualisieren einer Query

Ein Thema von mariusbenz · begonnen am 23. Nov 2018 · letzter Beitrag vom 23. Nov 2018
Antwort Antwort
Seite 1 von 2  1 2   
mariusbenz

Registriert seit: 6. Mär 2015
21 Beiträge
 
#1

Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 08:23
Datenbank: Advantage Database, SQL-Server • Version: ? • Zugriff über: UNIDAC
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
6.426 Beiträge
 
Delphi XE4 Professional
 
#2

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 08:48
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?
Heiko

Geändert von hoika (23. Nov 2018 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.300 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 09:13
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
21 Beiträge
 
#4

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 09:15
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.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.128 Beiträge
 
Delphi 7 Professional
 
#5

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 09:32
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?
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
21 Beiträge
 
#6

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 10:05
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
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
21 Beiträge
 
#7

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 10:08
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?
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 10:09
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. TUniQuery überschrieben werden kann. Man muss also dort nachschauen und nicht bei TDataSet .
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
Ort: Frankenberg(Sa.)
121 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 10:37
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.
Ronald
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
21 Beiträge
 
#10

AW: Richtiges Aktualisieren einer Query

  Alt 23. Nov 2018, 10:43
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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