StatusFilter на ClientDataSet
У меня возникли некоторые трудности с использованием ClientDataSet.StatusFilter := [usDeleted]
,
Это ничего не делает. Я подключил свой ClientDataSet к провайдеру.
При применении StatusFilter DataSet не отображает удаленные записи.
Он просто показывает записи, как до применения StatusFilter.
С другой стороны. Если я использую ClientDataSet.CreateDataSet
который не подключен к провайдеру и использует ClientDataSet только как набор данных в памяти, тогда StatusFilter работает, как описано в документации.
DataSet отображает только удаленные записи.
ClientDataSet.UpdateStatus также показывает правильный статус usDeleted.
Единственный способ получить мой первый ClientDataSet, который подключен к провайдеру для отображения удаленных записей, - это использовать свойство ClientDataSet.Delta. Но это не позволяет мне вернуть удаленную запись.
//Note: cds.LogChanges = true
cds := TClientDataSet.Create(nil);
cds.Data := MyClientDataSet.Delta;
cds.First;
while not cds.eof do
begin
case cds.UpdateStatus of
usModified:
begin
ShowMessage('Modified');
cds.RevertRecord;
end;
usInserted: ShowMessage('Inserted');
usDeleted: ShowMessage('Deleted');
end;
cds.Next;
end;
cds.Free;
Что я делаю неправильно?
1 ответ
Код, который вы описываете
ClientDataSet1.StatusFilter := [usDeleted];
является правильным способом включить в текущий просмотр ClientDataSet только те записи, которые были удалены. Я не понимаю, почему он не работает для вас, так как я использую этот подход в своем коде все время, и он никогда не подводил. Единственное, о чем я могу думать, это то, что вы, возможно, вызывали ApplyUpdates или CancelUpdates до установки свойства StatusFilter, или у вас может быть LogChanges, установленный в False (по умолчанию это True).
Кстати, чтобы отменить фильтр состояния, установите его в пустой набор, например так:
ClientDataSet1.StatusFilter := [];
Это будет включать вставленные, измененные и неизмененные записи в вашем представлении. Удаленные записи не будут отображаться в текущем представлении.