StatusFilter в наборе данных клиента

#delphi #dataset #delphi-2006

#delphi #набор данных #delphi-2006

Вопрос:

У меня возникли некоторые трудности с использованием ClientDataSet.StatusFilter := [usDeleted] .
Это ничего не делает. Я подключаю свой набор данных клиента к поставщику.
При применении StatusFilter в наборе данных не отображаются удаленные записи.
Он просто показывает записи, как и до применения StatusFilter.

С другой стороны. Если я использую ClientDataSet.CreateDataSet , который не подключен к поставщику, и использую только ClientDataSet в качестве набора данных в памяти, тогда StatusFilter работает так, как описано в документации.
В наборе данных отображаются только удаленные записи.
ClientDataSet.UpdateStatus также показывает правильный статус usDeleted.

Единственный способ, которым я могу получить свой первый ClientDataSet, подключенный к поставщику для отображения удаленных записей, — это использовать ClientDataSet .Дельта-свойство. Но это не позволяет мне вернуть удаленную запись.

 //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. Есть ли на ваших компакт-дисках LogChanges = False ?

Ответ №1:

Код, который вы описываете

 ClientDataSet1.StatusFilter := [usDeleted];
  

это правильный способ включить в ваше текущее представление ClientDataSet только те записи, которые были удалены. Я не понимаю, почему это не работает для вас, поскольку я постоянно использую этот подход в своем коде, и он никогда не подводил. Единственное, о чем я могу думать, это то, что вы, возможно, вызвали ApplyUpdates или CancelUpdates перед установкой свойства StatusFilter, или у вас может быть LogChanges установлено значение False (по умолчанию оно равно True).

Кстати, чтобы отменить фильтр статуса, установите для него пустой набор, например:

 ClientDataSet1.StatusFilter := [];
  

Это будет включать вставленные, измененные и неизмененные записи в вашем представлении. Удаленные записи не будут отображаться в текущем представлении.