Фильтрация CustomSQLColumn-а

Как многие знают, есть такое ограничение на использование CustomSQLColumn-а: датафилд, полученный по нему, нельзя фильтровать (как быстрым фильтром, так и фильтром из FilterBuilder-а), что значительно ограничивает нас при реализации сложных запросов с использованием функций и хранимых процедур. Но недавно случайно один из разработчиков (Дмитрий Мушенко - страна должна знать своих героев :)) обнаружил, что в случае, если завернуть CustomSQLColumn в subselect, то все будет нормально работать. Т.е. датасет, полученный по запросу вида

select
    ID as ID,
    Amount1 - Amount2 as Difference
from tbl_MyTable

где Amount1 - Amount2 - это CustomSQLColumn,
не будет фильтроваться по датафилду Difference

Но если видоизменить запрос на

select 
    ID as ID,
    (select  top 1
         m.Amount1 - m.Amount2 
     from tbl_MyTable m
     where m.ID = tbl_MyTable) as Difference

from tbl_MyTable

то все будет работать замечательно.

Прим.: Единственный неприятный момент, что удалось обнаружить, - эта фича не работает со строковыми полями. Т.е. если Вы в таком поле получаете дату, числовое значение или значение из справочника (GUID-ное значение), все будет фильтроваться нормально. Если же строку - фильтрация работать не будет.

Нравится

Поделиться

5 комментариев

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

Есть еще несколько путей решения такой задачи:

  • чтобы обеспечить работу быстрого фильтра, можно создать в SelectQuery CustomSQLFilter с нужным условием и вручную применять его в обработчике событий OnQuickFilter соответствующего DataGrid - самый правильный и безотказный вариант, правда доступный только в более поздних версиях
  • можно в реальной таблице создать вычисляемое поле (для случаев, когда все данные для вычисления берутся из одной таблицы и когда такое позволяет СУБД - MS SQl Server точно позволяет, насчет других не уверен, но скорее всего у них тоже с этим не будет проблем), а затем добавить его в сервис таблицы без сохранения структуры (в принципе, такой вариант я бы посоветовал вместо первого для тех случаев, когда возникает реальная необходимость в оптимизации запроса)

>>чтобы обеспечить работу быстрого фильтра, можно создать в SelectQuery CustomSQLFilter с нужным условием и вручную применять его в обработчике событий OnQuickFilter соответствующего DataGrid - самый правильный и безотказный вариант, правда доступный только в более поздних версиях

Да, можно. Только кода больше нужно писать.

>>можно в реальной таблице создать вычисляемое поле

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

>>Можно просто использовать View:

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

Можно подробнее про OnQuickFilter?
Я создал фильтр, вызываю его в этом обработчике, но датасет не фильтруется (пустой).

OnQuickFilter - метод, который срабатывает, когда пользователь применяет быстрый фильтр в реестре (выбирает в контекстном меню "Быстрый фильтр" - на англ. "Quick Filter"). Т.е. он не срабатывает, когда Вы применяете любой произвольный фильтр на датасете.

Показать все комментарии