Проблема скорости фильтра Delphi KBMMemtable - PullRequest
1 голос
/ 23 мая 2011

Привет, я использую KBmmemtable в небольшом проекте и столкнулся с небольшой проблемой скорости, которую я не могу исправить.

В основном у меня есть поле в таблице, которое имеет логическое значение, в таблице около 100 записей. Если я проверяю записи в таблице, устанавливая значение поля в true, он делает это очень быстро, однако, если я устанавливаю фильтр для таблицы и затем перебираю отфильтрованные записи, это занимает примерно в 10 раз больше времени, хотя можно было только будет 10 записей для повторения.

Кто-нибудь есть идеи

Я использую код

DM1.DS1.Enabled := False;
  with DM1.DS1.DataSet do begin
    First;
    while not Eof do begin
      edit;
      Fields[18].AsBoolean := TickState;
//      FieldByName('Selected').AsBoolean := TickState;
      post;
      next;
    end;
  end;
DM1.DS1.Enabled := true;

У меня есть индекс на поле, я тоже пробовал без индекса

спасибо

Colin

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Есть способ использовать фильтр в kbmMemTable и заставить его работать очень быстро ...

Установить kbmmem.Filtered: = true;

и не используйте свойство Filter, вместо этого используйте событие OnFilter ...

procedure Tform1.kbmmemFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  Accept:=Fields[18].AsBoolean;
  // when you iter your table you would see only thouse rows having "true" 
  //  on the field "Selected"
end;

и да, не забывайте отключать элементы управления раньше ...

  with kbmMem do
  try
    DisableControls;
    Filtered:=true;
    First;
    while not eof do
    begin
      // do your stuff here
      Next;
    end;
  finally
    EnableControls;
  end;
0 голосов
/ 23 мая 2011

Это предложение для цикла, оно не должно занимать больше времени, чем при использовании нефильтрованной таблицы kbmMemTable:

with kbmMemTable do
begin
  First;
  while not EOF do
  begin
    //do something, but don't change the position of the record-pointer!
    //if you do some writing to the record, be sure to  
    // enable "AutoReposition" in your kbmMemTable
    Next;
  end;
end;

Отключение источника данных не является хорошим вариантом.Каждый компонент, подключенный к источнику данных, становится «пустым» и должен быть обновлен.Вы получаете много проблем, если используете рекурсию или более чем одно «отключение» источника данных.То же самое, когда вы включаете DataSet.С DisableControls вы сигнализируете всем подключенным компонентам, что они не должны обновлять данные.С EnableControls это условие завершается и элементы управления обновляются.Другое преимущество заключается в том, что счетчик увеличивается с каждым DisableControls и уменьшается с каждым EnableControls.Таким образом, вы можете вызывать это несколько раз (например, в рекурсии), и только последний вызов EnableControls, наконец, включает элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...