FilterBuilder доступ к элементам фильтра по коду фильтра указанному в SelectQuery

У меня в форме добавлен элемент FilterBuilder.
И направлен на нужный мне Dataset.

У меня есть необходимость проверять выбран или нет фильтр по определенному полю и получить значение фильтрации и тип сравнения(больше/меньше/равно) по коду указанному в SelectQuery .

Нравится

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

Смотрите по SDK http://terrasoft.com.ua/sdk/
есть свойство IFiltersBuilder.RootItems, возвращающее IFiltersBuilderItems
находим нужный IFiltersBuilderItem
у него DataFieldName - имя поля набора данных, на основе которого создается элемент построителя фильтров
DisplayValue - правая часть элемента построителя фильтров
тип операции смотрите в IFiltersBuilderItems::LogicalOperator - операция между элементами

Это все хорошо и работает, но с одним но.

В SelectQuery присутствуют фильтры пользователя (это не простые фильтры).

Вот эти фильтры в IFiltersBuilder.RootItems присутствую но непонятно как их идентифицировать если их несколько, ведь у них значения DisplayValue и DataFieldName пустые. :confused:

Могу посоветовать проверить существование системного набора фильтров FiltersBuilderOriginalFilters, который создается при применении фильтров с содержанием пользовательских фильтров.
Dataset.SelectQuery.Items(0).Filters.ItemsByCode('FiltersBuilderOriginalFilters')
Если набор фильтров непустой, то попробуйте поискать в его элементах. Пока больше идей нет...

Да, Вы правы. Я тоже таким образом смог добраться до него. Но встал опять в тупик. :smile:
Как понять, установлен ли он в FilterBuilder или нет, и какие данные для филтрации и тип сравнения.

Мне всего то нужно, проверять задан этот пользовательский фильтр или нет.
Если задан то применить его к другому Dataset-у.

У интерфейса IFiltersBuilderItems метод ItemsByName возвращает IBaseFiltersBuilderItem, от которого наследуется IFiltersBuilderItem, а из него -- IUserFilterFiltersBuilderItem. Соответственно, если фильтр есть пользовательским, то он описывается последним интерфейсом, в котором есть свойство UserFilter, возвращающее интерфейс IUserFilter, среди декларируемых свойств которого есть:
Code - Код фильтра
FilterType - Тип фильтра
UserFilterType - Тип пользовательского фильтра
IsEnabled - Признак активности фильтра

Все шикарно.
Но осталось последнее.
Нашел я этот UserFilter что надо.
Как теперь получить значение которое в нем установлено?
Свойство DisplayValue как у обычного фильтра отсутствует. :(

А разве в свойстве Code нет нужного значения?
В любом случае смотрите SDK по нужному интерфейсу, там весь перечень свойств и методов с описанием, я ведь туда же смотрю по данному вопросу )

Цытирую SDK
'Code - Код фильтра.'

Я сам сижу в этом SDK уже не первый день...

Код это не значение которое указывает пользователь при включении фильтра.

UserFilter.Code: RoomTypeID
UserFilter.IsEnabled: false
UserFilter.KeyValue: RoomTypeID

Например, у меня есть пользовательский фильтр по дате. Как мне получить эту дату?

Вот каким образом я добрался в разделе контактов до фильтра пользователя:

Self.Attributes('WorkspaceWindow').ComponentsByName('fbcFilters').FiltersBuilder.RootItems.Items(0).UserFilter.LookupDataset('State')

Брал Items(0), потому что добавил только один фильтр, так проще.
Фильтр "Документ.Состояние". Выбирал значение "В планах". Оно и вернулось указанным способом.

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