Vous pouvez utiliser UpdateStatus
propriété du TClientDataSet pour cela:
if Cds.UpdateStatus = usModified then
// current row was changed
D'autres valeurs possibles sont usUnmodified
, usInserted
et usDeleted
. Contrairement à la propriété TDataSet.Modified
, la ligne UpdateStatus
persiste après que ses modifications ont été renvoyées au CDS par CDS.Post. Évidemment, c'est à vous de choisir parmi ces valeurs numériques pour votre application.
Comme indiqué dans l'aide en ligne, vous pouvez utiliser la UpdateStatus
pour définir la valeur d'un champ calculé:
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
case TClientDataSet(DataSet).UpdateStatus of
usUnmodified: FieldByName('Status').AsString := '';
usModified: FieldByName('Status').AsString := 'M';
usInserted: FieldByName('Status').AsString := 'I';
usDeleted: FieldByName('Status').AsString := 'D';
end;
end;
Vous pouvez également utiliser sa propriété StatusFilter
pour filtrer temporairement un TClientDataSet pour sélectionner les lignes avec un specfic UpdateStatus
:
procedure TCDSForm.Button1Click(Sender: TObject);
begin
if CDS.StatusFilter = [] then
CDS.StatusFilter := [usModified]
else
CDS.StatusFilter := [];
Caption := IntToStr(CDS.RecordCount);
end;
Notez que CDS.RecordCount
avec le StatusFilter
mis à usModified
ne renvoie pas nécessairement la même valeur que lePropriété, car la valeur ChangeCount
inclut le nombre de lignes inséré ainsi que le nombre qui ont été modifié.
Notez que 'Cds.fields1.Value <> Cds.fields1.OldValue' inclura également les enregistrements insérés. Ce code est issu de la question. –
@SertacAkyuz: Je n'ai pas testé cela, mais si vous le dites, bon point. – MartynA
En fait, je n'ai pas testé aussi, je suppose que OldValue est nul pour un enregistrement inséré. –