2016-07-08 24 views
5

Mam TClientDataset z polami N i muszę pętli przez nich liczyć, ile się zmieniło, ale robi:Sprawdź, czy wiersz został zmieniony w TClientDataset

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

lub przelotowego Cds.fields [I] nie jest bardzo "czysty"

Czy istnieje metoda Cds.RowChanged?

Odpowiedz

11

Można użyć UpdateStatus własność TClientDataSet za to:

if Cds.UpdateStatus = usModified then 
    // current row was changed 

Inne możliwe wartości to usUnmodified, usInserted i usDeleted. W odróżnieniu od właściwości TDataSet.Modified, UpdateStatus dla bieżącego wiersza jest zachowywana po tym, jak jego zmiany zostały przesłane do CDS przez CDS.Post. Oczywiście, od Ciebie zależy, które z tych wartości liczbowych będą potrzebne do twojej aplikacji.

Jak zauważono w Pomocy online, można użyć UpdateStatus ustawić wartość pola obliczono:

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; 

Można również użyć jej StatusFilter mienia tymczasowo filtrować TClientDataSet aby wybrać wiersze z SPECYFICZNIE UpdateStatus:

procedure TCDSForm.Button1Click(Sender: TObject); 
begin 
    if CDS.StatusFilter = [] then 
    CDS.StatusFilter := [usModified] 
    else 
    CDS.StatusFilter := []; 
    Caption := IntToStr(CDS.RecordCount); 
end; 

Zauważ, że CDS.RecordCount z StatusFilter ustawiony usModified niekoniecznie zwrócić taką samą wartość jakWłaściwość, ponieważ wartość ChangeCount obejmuje liczbę wierszy wstawionych oraz liczbę, które zostały zmodyfikowane.

+0

Należy pamiętać, że 'Cds.fields1.Value <> Cds.fields1.OldValue' będzie również zawierać wstawione rekordy. Ten kod pochodzi z pytania. –

+0

@ SertacAkyuz: Nie testowałem tego, ale jeśli tak mówisz, dobry punkt. – MartynA

+0

Właściwie nie przetestowałem też, zakładam OldValue na wartość zerową dla wstawionego rekordu. –

2

Nie trzeba przechodzić przez zbiór danych, można użyć właściwości ChangeCount.

+0

To daje mi ogólne zmiany, a nie konkretne wiersze. –

+1

Zostałem wprowadzony w błąd przez twoje pytanie. * "Muszę przechodzić przez nie, aby policzyć, ile osób się zmieniło." * Doprowadziło mnie to do wniosku, że twoim celem było zliczenie. –