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

В одной из “Заметок на полях” я рассказывал о фильтрации в cxGrid. За рамками повествования осталась одна интересная задача, связанная с фильтрацией, с которой я недавно столкнулся. В отфильтрованном гриде необходимо определенным образом модифицировать все записи. Решение данной задачи привожу ниже.

for I := 0 to cxDBGridDBTableView1.DataController.FilteredRecordCount - 1 do
  begin
    cxDBGridDBTableView1.DataController.FocusedRecordIndex:=
      cxDBGridDBTableView1.DataController.FilteredRecordIndex[I];

      cxDBGridDBTableView1.DataController.DataSet.Edit;
      qryTimingApproved.AsInteger:= 1;

      cxDBGridDBTableView1.DataController.DataSet.Post;
  end;


Собственно, все достаточно очевидно. В коде мы последовательно перемещаемся по отфильтрованным записям, и редактируем соответствующие записи в связанном DataSet’е.

В процессе решения данной задачи и написания этого поста у меня возникло несколько мыслей, которыми я хочу поделиться здесь.

1. На нескольких русскоязычных форумах за много лет скопились сотни, если не тысячи подобных “солюшнов” для решения конкретных задач, связанных с cxGrid и другими DevExpress компонентами. Было бы не плохо их систематизировать, упорядочить и оформить в виде структурированного HowTo.

2. Ранее я пытался рассказать (конечно, не так подробно, как хотелось бы) о структуре и внутренней организации cxGrid. Многие работали и знают как устроен EhGrid. Сегодня же остается открытой задача написания “продвинутого” грида для 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.5
DevExpress. TIPS & TRICKS #6
DevExpress. TIPS & TRICKS #7


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

20 комментариев: DevExpress. TIPS & TRICKS #5

  • Коммент №1 – Александр, а можно действительно написать статью среднего размера на тему “как устроен грид”. Естественно, функционал познается действием, но понимание внутренних механизмов а) позволяет использовать функционал максимально эффективным способом б) уберегает программиста от ситуации, когда ищешь/ждёшь того, чего в принципе не может быть.

    • Если я не ошибаюсь, то про стандартный DBGrid еще в старых номерах Delphi Magazine было написано. А про продвинутые гриды писать можно много, там каждый из них по своему устроен. Но, ИМХО, для понимания работы грида нужно понимать работу DataSet’а. Тут тоже есть много материалов. Ох, как бы не пришлось мне это все перечитывать в скром будущем :(

  • Я обычно задачи избирательной модификации данных стараюсь решать через SQL. В крайнем случае, через работу с датасетом. Правда, мне и не приходилось работать с такими гридами, как cxGrid, умеющими кешировать данные из датасета и самостоятельно фильтровать их в памяти.

    Точнее как-то раз пришлось, но и там мне пришлось отключить кеширование данных гридом в память, после того, как при открытии огромного списка из БД, программка аккуратно откушала половину оперативки. На тот момент, это было около 120мб при установленном RAM-е в 256мб.

    Или вот ещё был случай, когда один отчёт считался в коде программы. И считался он, примерно полчаса. После того, как этот код был переписан в виде хранимой процедуре на PL/SQL (выполняемой СУБД), отчёт стал считаться за 2 минуты. Что, конечно, тоже не идеал, но всё-таки намного лучше, чем то, что было.

    С тех пор я считаю, что всё что только можно возложить на СУБД, стоит возложить на СУБД.

    Хотя, конечно, иногда приходится довольствоваться голым SQL-ом, без какой-либо поддержки хранимых процедур, триггеров, и прочих плюшек. Если по какой-либо причине приходится использовать Access-ный MDB и нельзя перейти, хотя бы тот же Firebird Embedded.

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

  • Замечание по коду:

    Сначала идёт работа с cxDBGridDBTableView1.DataController.DataSet, а потом с qryTimingApproved, что не есть гут. Точнее, всё будет отлично, до тех пор пока когда-нибудь при редактировании кода cxDBGridDBTableView1.DataController.DataSet не станет неравным qryTimingApproved.

    • :) Да, это называется лень…
      Конечно же нужно cxDBGridDBTableView1.DataController.DataSet.FieldByName(‘Approved’).asInteger:= …

  • Если задумывать аггрегатор типовых решений для DevExpress, то лучше в качестве основного наполнения приводить примеры из официального knowledge-base, поскольку не всегда на наших форумах даются верные решения.
    PS: кстати приведенное решение для фильтрованных записей тоже далеко не идеально ;)

    • И в официальной knowledge-base ляпы бывают.
      А в чем заключается “неидеальность” данного решения?

  • Вот, кстати, наткнулся на сборник рецептов/howto по DX-ам. В виде блога. К сожалению, без указания авторов решений. =(

    Линк: http://www.sql.ru/blogs/x11/

  • По-поводу неидеальности решения:
    был сделан небольшой тестовый пример, поэтому данные по времени исполнения из него. Правда не вижу возможности его приаттачить.
    время исполнения приведенного кода 2372 ms
    1. если использовать BeginUpdate/EndUpdate для вью, время сокращается до 484 ms
    2. если использовать более идеологически правильный подход и редактировать данные через датаконтроллер с включенной опцией DataModeController.SmartRefresh = True 468ms
    3. ну и самое правильное решение – никогда не стоит использовать визуальные компоненты для пакетной обработки данных! В данном случае решение было в назначении св-ву Filter датасета значения DataController.Filter.FilterText и прямая итерация по записям датасета при использовании DisableControls/EnableControls. В этом случае время составило 15 ms
    PS: а по-поводу “официальной knowledge-base ляпы бывают” – есть такое, за годы что-то устарело, обновляем по мере возможности ;)

    • Константин, так Вы из DevExpress?

      Да, Вы правы тут нужно использовать beginUpdate/endUpdate. Я почему-то решил, что эти методы стоит вызывать только если мы изменяем значения в DataController. Посмотрел по коду, почитал справку – действительно, метод отключает выполнение большого количества кода. Как я понял, это нечто вроде DisableControls, только для DataController. На моей выборке ускорил обработку примерно в 3 раза.

      С остальным тоже согласен. Откатал все 3 варианта, изобрел 4-й – один другого краше.

      Спасибо.

  • Периодически бывает желание помочь русскоязычному нету с нашими контролами или даже завести блог, но как всегда всё упирается в лень человеческую и отсутствие времени. Поэтому изредка могу прокоментировать чье-либо решение. Возможно в будущем наваяю статейку о режиме грида server-mode, а то не все правильно понимают его идеологию ограничения :)

    • Блог – было бы супер!
      Но, про cxGrid не то, что статью, книгу писать надо :)

    • Константин, я понимаю, что ваше сообщение уже 3 летней давности, но, вдруг, подумала я, может вы написали все-тики статью о режиме грида server mode? Если да, то дайте ссылку, пожалуйста, где можно почитать.
      Заранее спасибо.

  • Константин, спасибо за цифры.
    Случаем не знайте, cxGrid и др. для FM планируется?
    А то как то без них скучновато…

  • Планы есть, но… На текуший момент FireMonkey ещё очень сырой продукт. Идея хорошая – прямо как советовал Реймонд Чен для сложных элементов управления, если мы ходим сделать с максимальным быстродействием. Но реализация, губит весь потенциал. По нашим спайкам по быстродействию в текущем варианте FMX на порядок отстаёт от старой-доброй VCL,особенно драматична ситуация в MacOS. Отсутствие кеширования графических примитивов, масса тяжелых операций при рисовании, путаница с алигном и автосайзом. В принципе всё ещё как-то работает если нет никакого ресайзинга, но когда он есть – можно любоваться на слайд-шоу. Для такого сложного элемента как TcxGrid прямое следование идеологии FMX на текущем этапе невозможно. Т.е. сделать-то конечно можно, но репутация дороже :) Можно конечно наплевать на идеологию FMX и написать по-своему, но это большой труд, который может себя не окупить, особенно если потом переписывать под “дозревшую” FMX. Лучше немного подождать. Если Embarcadero доведёт FireMonkey до ума и удобства VCL (как я надеюсь) – то естесственно мы выпустим наши продукты под эту платформу, а если повторится судьба Kylix – то по крайней мере сэкономим ресурсы для развития VCL-продуктов. А пока мы пишем Embarcadero в QC. Как-то так :)

  • Константин, спасибо!
    Будем ждать)

Ответить на admin Отмена ответа

Ваш 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
Яндекс.Метрика