2.4.4. Универсальный фильтр

2.4.4.1. Использование универсальных фильтров

Нажмите кнопку «Фильтр» на панели управления или в контекстном меню. Настройте условия фильтрации в отобразившемся диалоге.

../../../_images/UniFilter_GUI.png

Управляющие кнопки:

  • «Открыть…» - открывает диалог выбора (редактирования) пользовательских сохраненных настроек. Список также содержит общие настройки, они доступны только для выбора.
  • «Открыть общие настройки…» - (операция находится в выпадающем меню под кнопкой «Открыть…») открывает диалог выбора (редактирования) общих сохраненных настроек.
  • «Сохранить» - сохраняет настройку фильтра.
  • «Сохранить как…» - сохраняет настройку фильтра под новым именем.
  • «OK» - применяет фильтр и закрывает построитель фильтров«Отмена» - закрывает построитель фильтров с отменой всех изменений фильтра (кроме сохранений), без применения фильтра.
  • «Применить» - Применяет фильтр без закрытия построителя фильтра.

2.4.4.2. Для разработчика приложений

Универсальный фильтр позволяет создавать сложные условия фильтрации данных в визуальном редакторе фильтра. После применения универсального фильтра в GetSQLText выборки будут внесены условия, указанные в мастере фильтра. Если GetSQLText содержит простой запрос то, после применения универсального фильтра существующий запрос будет окружён запросом фильтрации (курсорный запрос окружаться запросов фильтрации не будет):

Select * from ('Исходный запрос') where 'условие фильрации'

Для того, чтобы GetSQLText не окружался дополнительным запросом, необходимо, чтобы в тексте запроса содержался макрос &DefUniFltMacros.

Select * from MyTable where &DefUniFltMacros

Если условий фильрации не задано, макрос &DefUniFltMacros будет заменён на строку «(2 = 2)»

Также для получения значения универсального фильтра в запросе можно использовать параметр :DefUniFltMacros.

Attention

Если вы используете курсорную выборку, и в запросе отсутствует макрос &DefUniFltMacros, выражение фильтра не будет поставлено.

2.4.4.2.1. Настройка фильтруемых атрибутов выборки

Для обычных (значимых) атрибутов настройка не требуется. Если вы хотите исключить атрибут из списка фильтруемых, установите свойство «Доступен в универсальном фильтре» в false. Для ссылочных атрибутов требуется следующая настройка:

  1. В свойстве «Заголовов ссылочного атрибута» должно быть указано имя атрибута являющегося заголовком для данного ссылочного атрибута.
  2. У атрибута, который является заголовком, должны быть проставлено свойства «Изменяемый атрибут» и «Ссылка на класс».Если вы хотите указать выборку с отображением, из которой пользователь должен выбирать значение для фильтрации, укажите свойства «Выборка» и «Отображение».

При компиляции класса все необходимые свойства будут проставлены.

Указание для ссылочного атрибута и его заголовка описанных выше свойств необходимо для того, чтобы:

  1. Фильтрация была доступна как для ссылочного атрибута, так и для его заголовка, причем, если в фильтре будет участвовать заголовок, фильтрация будет происходить не по тексту заголовка, а по идентификатору объекта, которому принадлежит заголовок.
  2. Была известна выборка, которую необходимо открыть для выбора значения ссылочного атрибута.

По умолчанию, для фильтрации доступны все видимые атрибуты, если вам необходимо фильтроватьпо невидимому атрибуту явно укажите свойство «Доступен в универсальном фильтре»

2.4.4.2.2. О доступности сохранённых настроек фильтров в отображениях

С помощью свойства «Использовать ун-ный фильтр Default отображения» можно указать, что выборка должна использовать настройки фильтра, общие для всех отображений (настроенные для отображения Default). Если этот флаг не установлен, настройки, сохранённые в каком-либо отображении, не будут видны в другом отображении.

2.4.4.2.3. Read-Only фильтр разработчика

Есть возможность задать условие фильтрации, которое не будет доступно пользователю для редактирования. для этого необходимо обратиться к полю UniFilterMacrosRO выборки:

Selection.UniFilterMacrosRO := 'AttrName > 100500';

Такое условие будет дополнять обычный фильтр, и будет выводиться в нижней части карточки универсального фильтра в виде текста. Оно недоступно для редактирования из карточки.

../../../_images/UniFilterMacrosRO.jpg

2.4.4.2.4. Паскаль-события фильтрации

Указанные события вызываются при работе с универсальным фильтром. Необходимы для работы с новым универсальным фильтром на базе выборки.

Перечень всех событий фильтрации с кратким описанием см. здесь

События OnApplyFilter, OnResetFilter и OnAddSelectedRecToFilter могут возвращать объект класса TbtkNamedArgs, созданный с помощью скриптового метода CreateArgs. Обязательные поля - Code (0 - успешно) и WhereMacro - текст запроса, который будет добавлен к макросу фильтрации при его применении (Apply). Условие, возвращенное в WhereMacro, будет приписано к макросу &DefUniFltMacros. Имеется особенность - тексты запросов, возвращаемых операциями OnApplyFilter, OnResetFilter и OnAddSelectedRecToFilter, записываются в специальное локальное значение. И каждое новое (непустое!) значение затирает старое.

События OnFilterInit и OnFilterFinalize вызываются сразу после и до операций OnLoadMeta и OnUnLoadMeta соответственно. Операция OnFilterInit может возвращать результат (типа Variant), который в последствии будет передаваться как входной параметр в методы OnApplyFilter, OnResetFilter и OnAddSelectedRecToFilter при каждом их вызове. Возвращение значения операцией OnFilterFinalize не предполагается (будет игнорировано).

События OnFilterInit среди своих параметров может содержать поле Alias, использующееся для формирования запроса GetSqlText. При применении серверного фильтра выборки некурсорная операция GetSqlText оборачивается следующим образом:

select &ServFilterAliasMacros.*
from ('исходный запрос') &ServFilterAliasMacros
where &DefUniFltMacros and &DefUniFltMacrosRO

где:

  • &ServFilterAliasMacros - макрос, принимающий значение параметра Alias.
  • &DefUniFltMacros и &DefUniFltMacrosRO - макросы фильтрации, изпользовавшиеся ранее.

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