Einzelnen Beitrag anzeigen

Bodenseematze

Registriert seit: 10. Jul 2023
68 Beiträge
 
#7

AW: TQuery (BDE) / TDataSet - Verständnisproblem "Modified"

  Alt 26. Aug 2024, 16:25
Das heißt im Umkehrschluss, dass ohne CachedUpdates nur der aktuelle Datensatz geändert sein kann?
Das weiß ich tatsächlich nicht, da ich die BDE-Sourcen gerade nicht verfügbar habe (ich glaube sogar, die waren nie verfügbar). Ich vermute, dass das aber nicht für den aktuellen Datensatz gilt, da dieser ja bei Cancel nicht in den Update-Buffer übernommen wird.
Also bei "normalen" TDataSets (ohne CachedUpdates) bzw. wenn CachedUpdates auf False steht, muss ich über alle Records loopen und deren Modified abgfragen, damit ich herausfinde ob einer der Records geändert ist?
Oder wird dort dann automatisch beim Wechsel des Records die geänderten Daten in die Datenquelle geschrieben?
Dann wäre es in dem Fall ja tatsächlich nur möglich, dass der aktuelle Record Änderungen hat...

Und: warum ist bei mir (bei nur einem Record!) dann UpdatesPending auf True gesetzt?
Das kann ich dir aus demselben Grund auch nicht sagen.
Das finde ich immer noch sehr seltsam und unlogisch!

[EDIT]: ich habe in meinen Quellen mal nachgeschaut, das Property UpdatesPending ist über einen Getter in TBDEDataSet folgendermaßen implementiert:
Delphi-Quellcode:
function TBDEDataSet.GetUpdatesPending: Boolean;
begin
  Result := GetIntProp(FHandle, curDELAYUPDNUMUPDATES) > 0;
end;
Damit bin ich so schlau wie vorher - zumal ich curDELAYUPDNUMUPDATES nirgends definiert finden kann

Und der Aufruf von UpdateStatus() macht auch nur Sinn, wenn CachedUpdates gesetzt ist - nur dann bringt es einen Wert ungleich usUnmodified zurück. Und es bezieht sich wohl auch nur auf den aktuellen Record (zumindest lt. Doku)...

Also sicherheitshalber immer vor der Status/Modified-Abfrage ein UpdateRecord()-Aufruf einfügen?
Ja, wenn der State in [dsEdit, dsInsert] ist.
Das habe ich auch gerade gemerkt - einfach "immer" aufgerufen, fliegt ggf. eine Exception, dass sich "die Datenmenger weder im Editier- noch im Einfügemodus befindet"...
--> dann macht das ja nur Sinn, wenn ich bereits weiß, dass ich im Editier-/Insert-Modus bin und ich Fields auf Änderungen prüfen möchte, oder?
[EDIT]: lt. Embarcadero-Doku ist der Aufruf für die Gegenrichtung zuständig, d.h. es werden die Controls davon informiert, dass sich im Record Änderungen befinden - wenn das so ist, benötige ich es sicherlich für diesen Anwendungsfall hier nicht...

Jedes DataSet hat seinen eigenen Modified Status, egal ob Master/Detail oder nicht. Es betrifft immer den jeweils aktuellen Datensatz. Wenn du also ein Master- und ein Detail-DataSet hast, dann musst du das bei beiden machen.
Ja, das ist schon klar - ich meinte, wenn z.B. im Detail-Grid mehrere Zeilen geändert sind - dann muss ich eine Schleife über alle Records des Detail-DataSet machen und kann nur so herausfinden, ob Records: neu sind oder geändert sind oder gelöscht wurden, oder verstehe ich das immer noch falsch?

Geändert von Bodenseematze (26. Aug 2024 um 17:33 Uhr)
  Mit Zitat antworten Zitat