Как многие знают, есть такое ограничение на использование 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-ное значение), все будет фильтроваться нормально. Если же строку - фильтрация работать не будет.
Есть еще одни неприятный момент - производительность такого запроса ниже. Впрочем, это скажется только на таблицах с весьма большим количеством записей.
Есть еще несколько путей решения такой задачи:
- чтобы обеспечить работу быстрого фильтра, можно создать в SelectQuery CustomSQLFilter с нужным условием и вручную применять его в обработчике событий OnQuickFilter соответствующего DataGrid - самый правильный и безотказный вариант, правда доступный только в более поздних версиях
- можно в реальной таблице создать вычисляемое поле (для случаев, когда все данные для вычисления берутся из одной таблицы и когда такое позволяет СУБД - MS SQl Server точно позволяет, насчет других не уверен, но скорее всего у них тоже с этим не будет проблем), а затем добавить его в сервис таблицы без сохранения структуры (в принципе, такой вариант я бы посоветовал вместо первого для тех случаев, когда возникает реальная необходимость в оптимизации запроса)
Можно просто использовать View:
http://community.terrasoft.ua/forum/topic/2693
http://community.terrasoft.ua/forum/topic/3301
>>чтобы обеспечить работу быстрого фильтра, можно создать в SelectQuery CustomSQLFilter с нужным условием и вручную применять его в обработчике событий OnQuickFilter соответствующего DataGrid - самый правильный и безотказный вариант, правда доступный только в более поздних версиях
Да, можно. Только кода больше нужно писать.
>>можно в реальной таблице создать вычисляемое поле
Только для случаев, когда данные находятся в одной таблице. К сожалению, такие случаи очень редки.
>>Можно просто использовать View:
Использование view не всегда возможно (как по мне, этот способ применим для решения частных задач), т.к. если Вам нужно подсчитывать что-то в запросе администрируемой таблицы, то использовать view, наверное, не получится (под пользователем и так используется view).
Можно подробнее про OnQuickFilter?
Я создал фильтр, вызываю его в этом обработчике, но датасет не фильтруется (пустой).
OnQuickFilter - метод, который срабатывает, когда пользователь применяет быстрый фильтр в реестре (выбирает в контекстном меню "Быстрый фильтр" - на англ. "Quick Filter"). Т.е. он не срабатывает, когда Вы применяете любой произвольный фильтр на датасете.