2016-07-08 3 views
5

j'ai un TClientDataset avec des champs n et je dois boucle à travers eux de compter combien ont changé, mais faire:Vérifiez si la ligne a été modifiée dans un TClientDataset

if (Cds.fields1.Value <> Cds.fields1.OldValue) and (Cds.fields2.Value <> Cds.fields2.OldValue) etc.... 

ou une boucle à travers Cds.fields [I] n'est pas très 'propre'

Y at-il une méthode Cds.RowChanged ou quelque chose?

Répondre

11

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é.

+0

Notez que 'Cds.fields1.Value <> Cds.fields1.OldValue' inclura également les enregistrements insérés. Ce code est issu de la question. –

+0

@SertacAkyuz: Je n'ai pas testé cela, mais si vous le dites, bon point. – MartynA

+0

En fait, je n'ai pas testé aussi, je suppose que OldValue est nul pour un enregistrement inséré. –

2

Vous n'avez pas à parcourir l'ensemble de données en boucle, vous pouvez utiliser la propriété ChangeCount.

+0

Cela me donne les changements globaux, pas spécifiques aux rangées. –

+1

J'ai été induit en erreur par votre question alors. * ".. Je dois passer à travers eux pour compter combien ont changé .." * m'a amené à penser que votre objectif était d'avoir un compte. –