Einzelnen Beitrag anzeigen

Bodenseematze

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

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

  Alt 29. Aug 2024, 15:03
Ein Blick in die Sourcen macht das klar:
Delphi-Quellcode:
procedure TBDEDataSet.SetUpdateRecordSet(RecordTypes: TUpdateRecordTypes);
begin
  CheckCachedUpdateMode;
  CheckBrowseMode;
  UpdateCursorPos;
  Check(DbiSetProp(hDbiObj(Handle), curDELAYUPDDISPLAYOPT, Longint(Byte(RecordTypes))));
  Resync([]);
end;
Delphi-Quellcode:
procedure TDataSet.CheckBrowseMode;
begin
  CheckActive;
  DataEvent(deCheckBrowseMode, 0);
  case State of
    dsEdit, dsInsert:
      begin
        UpdateRecord;
        if Modified then Post else Cancel;
      end;
    dsSetKey:
      Post;
  end;
end;
OK - das erklärt es, wobei das (vermutlich wg. CachedUpdates) ja immer noch nicht tatsächlich in der Datenbank angekommen ist, sondern wohl "nur" in der internen (Paradox basierten) Speichertablle, oder?
(OffTopic: eine Methode "CheckXXXX" zu nennen und dann in der Methode die Daten zu verändern, halte ich übrigens für seehr schlechten Programmierstil - und hatte ich ebenfalls beim groben durchsehen der Quellen nicht erwartet)

Wenn man überlegt, ist das auch nachvollziehbar, da die Hilfe ja erwähnt, dass es eine Art Filter ist, und beim Ändern eines Filters könnte ja der aktuelle Datensatz aus der Anzeige rausfallen. Insofern ist ein Wechsel in den dsBrowse State schon angebracht
Stimmt, der umgekehrte Weg, dass jemand ein bestehendes Flag (z.B. rtModified) aus den UpdateRecordTypes entfernt, könnte ja auch sein - habe ich mir noch gar nicht klar gemacht...

Wäre denn (anhand der o.a. Ergebnisse) für die Status-Abfrage des aktuellen Records folgendes richtiger?
Delphi-Quellcode:
Result := usUnmodified;
if ( (ds_ is TBDEDataSet) and TBDEDataSet(ds_).UpdatesPending and (ds_.UpdateStatus() <> usUnmodified) ) then begin
  Result := ds_.UpdateStatus();
else
if ( ds_.Modified ) then begin
  Result := usModified;
end;
oder einfach ganz ohne TBDEDataSet-Prüfung (da UpdateStatus() in der Basis-Implementierung und ohne CachedUpdates usUnmodified zurückliefert):
Delphi-Quellcode:
Result := usUnmodified;
if ( ds_.UpdateStatus() <> usUnmodified ) then begin
  Result := ds_.UpdateStatus();
else
if ( ds_.Modified ) then begin
  Result := usModified;
end;
Aber für die Abfrage des Status des gesamten Queries müsste dann doch tatsächlich über alle Records gelaufen werden - auf das State-Property kann ich mich da ja nicht verlassen (wenn CachedUpdates gesetzt ist), oder?

Geändert von Bodenseematze (29. Aug 2024 um 15:24 Uhr)
  Mit Zitat antworten Zitat