Hallo zusammen,
ich weiß:
BDE ist alter Tobak und sollte ersetzt werden, genau wie das von mir verwendete Delphi 7...
...aber ich muss es halt aktuell (noch) verwenden
(und außerdem bin ich nicht sicher, ob es nicht bei anderen TDataSet-Klassen auch so ist)
Vielleicht kann mir trotzdem noch jemand aus seiner Erfahrung berichten - ich verstehe nämlich nicht so ganz, wie ich erkenne, ob sich ein Datensatz geändert hat oder nicht...
Hier kurz meine Problemschilderung:
Ich versuche in meinen datenbankbasierten Masken anzuzeigen, ob sich der aktuell aufgeschaltete Datensatz geändert hat (d.h. ob eine der Datenbankfelder auf der Maske sich verändert haben oder ob der gesamte Datensatz neu ist).
Die Datenbankverbindung ist zu einem MS-
SQL Server über einen
ODBC-Eintrag gemacht - es wird in der
BDE entsprechend die
ODBC-DSN verwendet.
Auf der Maske ist ein TQuery mit CachedUpdates=True, UpdateMode=upWhereKeyOnly und UpdateObject gesetzt (Rest der Properties sind "false") und das dazugehörige TDataSource, dass sich auf die
Query als DataSet bezieht; alle auf der Maske befindlichen Edit-Felder beziehen sich auf diese TDataSource und ein DataField aus dem TQuery.
Um zu prüfen, ob Änderungen im
Query sind, wird in einer allgemeinen Methode "HasChanges" folgendes geprüft:
Delphi-Quellcode:
Result := false;
if ( qry.Active and qry_.CanModify ) then begin
if ( (qry_.State = dsEdit) or (qry_.State = dsInsert) ) then begin
Result := true;
end
else
if ( qry_.CachedUpdates and qry_.UpdatesPending ) then begin
Result := true;
end;
end;
Wenn ich jetzt direkt nach dem Öffnen des Queries mit einem (!) Datensatz die Prüfmethode aufrufe, kommt "true" (d.h. es gibt Änderungen) zurück.
Wenn ich mir das
Query genauer anschaue, sehe ich folgendes:
Active=true, CanModify=true, RecordCount=1, UpdateStatus()=Modified, State=dsBrowse, CachedUpdates=true, UpdatesPending=true
Und wenn ich über alle Fields in dem Datensatz laufe und mir diese anschaue, sehe ich keinerlei Änderungen (Value, NewValue, ggf. OldValue sind alle gleich).
Wieso wird mir als "UpdateStatus()" Modified zurückgeliefert?
Und warum ist "UpdatesPending" gesetzt?
Und das direkt in "AfterScroll"!?
Ich glaube, ich verstehe die Properties sowie die Methode "UpdateStatus()" nicht so richtig...
...kann mir da jemand Licht ins Dunkel
bringen?