Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Предыдущий пост вызвал довольно оживлённую дискуссию относительно оптимальности приведенного решения. Напомню, что ставилась задача в отфильтрованном гриде необходимо некоторым образом модифицировать все записи. Действительно, приведенный вариант был далеко не оптимальный. С подачи резидента DevExpress (Константин, спасибо) я набросал еще несколько вариантов решения данной задачи.

Наиболее приемлемым мне показался этот:

if cxDBGridDBTableView1Approved.Filtered then
  cxDBGridDBTableView1Approved.Filtered:= False;

qryTiming.filter:= cxDBGridDBTableView1.DataController.Filter.FilterText;
 qryTiming.DisableControls;
 qryTiming.filtered:= True;
 qryTiming.first;

 while not  qryTiming.Eof do
 begin
   qryTiming.Edit;
   qryTimingApproved.AsInteger:= Approving;
   qryTiming.Post;
   qryTiming.Next;
 end;

qryTiming.filtered:= False;
qryTiming.EnableControls;

Обратите внимание на то, если изменяемое поле присутствует в условии фильтрации, то фильтр по нему сбрасывается. В противном случае, проход через все записи в наборе данных не будет обработан корректно. Так устроен  DataSet.

Изначально у меня вызывала опасение конструкция типа:

qryPrExpenses.filter:= cxdgdPrExpensesDBTableView1.DataController.Filter.FilterText;

Однако опасения мои не подтвердились. Дело в том, что некоторые  поля, в частности то же поле qryTimingApproved имеет тип TWordField. А свойству Properties соответсвующего столбца cxDBGridDBTableView1Approved присвоено значение CheckBox.

Примерно так видит значение фильтра пользователь:

filter_condition

Тем не менее, cxDBGridDBTableView1.DataController.Filter.FilterText принимает следующее значение:

(Approved = 1)

Все работает корректно. И хотя фильтр по  cxDBGridDBTableView1Approved не учитывается в данном конкретном случае, в программе имеются аналогичные поля.

Альтернативным вариантом мог стать приведенный в оригинальном посте, но с использованием методов beginUpdate/EndUpdate. Насколько я понял, по своей сути эти методы чем-то напоминают DisabelControls/EnableControls класса TDataSet. Только beginUpdate/EndUpdate работают для внутреннего набора данных и блокируют/разблокируют некоторые операции, выполняемые при переходе между записями (возможно, и при изменении записей), за счет чего и увеличивается быстродействие.

Сами значения можно (возможно, удобнее и логически правильнее) менять в DataController’е. Примерно так.

cxDBGridDBTableView1.DataController.beginUpdate;
  for I := 0 to cxDBGridDBTableView1.DataController.FilteredRecordCount - 1 do
  begin
    cxDBGridDBTableView1.DataController.FocusedRecordIndex:=
      cxDBGridDBTableView1.DataController.FilteredRecordIndex[I];
     cxDBGridDBTableView1.DataController.SetValue(cxDBGridDBTableView1.DataController.FocusedRecordIndex,
     0, 1);
  end;
   cxDBGridDBTableView1.DataController.EndUpdate;
 end

Здесь я использовал метод  SetValue. Естественно, позицию нужного столбца необходимо искать отдельно. Я этого не делал, в данном случае искомый столбец размещен первым (нулевая позиция).

Еще одним вариантом решения может быть составление SQL запроса. Здесь возможно два подхода. Либо выбрать перебором все ID отфильтрованых записей и составить запрос примерно таким образом:

UPDATE tblTiming SET Approved = 1

WHERE Id IN (<Список Id>)

Либо попытаться проанализировать фильтр и составить конкретное выражение для WHERE.

Оба варианта имеют свои недостатки.

Первый вариант сопряжен с перебором, к тому же, в зависимости от реализации сам запрос может иметь ограничение на размер. При большом количестве отфильтрованых записей могут возникнуть проблемы.

Второй вариант более сложный, и, вероятно, универсальное решение сделать будет довольно трудно. Как следствие, утрачивается гибкость.

Возвращаясь к предыдущему посту, хочется еще раз обратить внимание на коментарии. В частности, был затронут вопрос грида для FireMonkey.

Постовой:

Games Town – надувные аттракционы по разумным ценам.

Другие статьи серии:

DevExpress. TIPS & TRICKS #0
DevExpress. TIPS & TRICKS #1
DevExpress. TIPS & TRICKS #2
DevExpress. TIPS & TRICKS #3
DevExpress. TIPS & TRICKS #4
DevExpress. TIPS & TRICKS #5
DevExpress. TIPS & TRICKS #6
DevExpress. TIPS & TRICKS #7


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика