Допоможіть будьласка розібратися, як в FilterBuilderControl додати встановлений по замовченню фільтр. Тільки не на основі DataField, як вказано нижче, а на основі фільтру користувача створеного в сервісі SelectQuery?
var Dataset = fbcFilters.DatasetLink.Dataset;
var StateID = Dataset.DataFields.ItemsByName('StateID');
StateID.IsSimpleSelect = false;
var FBItem = fbcFilters.FiltersBuilder.RootItems. CreateItemByDataField(StateID);
FBItem.ValueNotSet = true;
fbcFilters.FiltersBuilder.RootItems.Add(FBItem);
У об'єкта RootItems ще є методи CreateItemByUserFilter() і CreateFiltersBuilderItems(). Але як користуватися ними, які створювати для них ввідні об'єкти? Не можу знайти інфо, допоможіть хто знає
Нравится
Попробуйте использовать CreateItemByUserFilter(UserFilter) в который надо передать UserFilter из запроса
Це зрозуміло,а от як це зробити? Як із SelectQuery отримати UserFilter?
SelectQuery.Filters.ItemsByCode(код пользовательского фильтра)
Правильно Dataset.SelectQuery.Items(0).Filters.ItemsByCode(код пользовательского фильтра)
Але для метода CreateItemByUserFilter() даний об'єкт не підходить. Пише "Type mismatch"
Небольшая поправка: надо Dataset.SelectQuery.Items(0).Filters использовать.
Кроме того желательно перед этим выполнить Dataset.SelectQuery.LoadUserFilters()
Dataset.SelectQuery.LoadUserFilters() нажаль також не допоміг
Скоріше всього об'єкт UserFilter не із SelectQuery, а метод CreateItemByUserFilter() призначений для іншого якогось об'єкту
Точно для этого. Проблема оказалась в том что Dataset.SelectQuery.Items(0).Filters.ItemsByCode(код пользовательского фильтра) все равно не возвращает нужного пользовательского фильтра.
Пользовательские фильтры чаще всего "спрятаны" внутри Exists фильтров и поэтому для того что бы докопаться до нужного фильтра нужно проделать дополнительную работу
var ExistsFilter = Dataset.SelectQuery.Items(0).Filters.ItemsByCode(код EXISTS фильтра); var UserFilter = ExistsFilter.TestExpression.ExpressionSelectQuery.Items(0).Filters.ItemsByCode(код пользовательского фильтра); fbcFilters.FiltersBuilder.RootItems.CreateItemByUserFilter(UserFilter);
Код получився:
dlData.Dataset.Open(); var Dataset = fbcFilters.DatasetLink.Dataset; var ExistsFilter = Dataset.SelectQuery.Items(0).Filters.ItemsByCode(код EXISTS фильтра); var UserFilter = ExistsFilter.TestExpression.ExpressionSelectQuery. Items(0).Filters.ItemsByCode(код пользовательского фильтра); var FBItem = fbcFilters.FiltersBuilder.RootItems.CreateItemByUserFilter(UserFilter); fbcFilters.FiltersBuilder.RootItems.Add(FBItem);
При визові FilterWindow.Show() виникає "Разрушительный сбой"
Попередній код такого не викликав :(
У Вас dlData.Dataset и fbcFilters.DatasetLink.Dataset это один и тот же датасет? Если да то после открытия датасета получить пользовательские фильтры для SelectQuery проблематично.
Дійсно, dlData.Dataset і fbcFilters.DatasetLink.Dataset один й той же датасет.
Фільтр я отримую із SelectQuery, дякуючи Вам, тепер успішно. Новий код в Prepare() вікна ні одної помилки не викликає. І тип вказаного вище фільтра підходить методу CreateItemByUserFilter().
Але я думаю виникає нестиковка по якомусь параметру об'єкта UserFilter. Можливо якийсь параметр потрібно змінити?
попробуйте создать фильтр до открытия датасета. Или при создании фильтра, датасет брать через GetSingleItemByCode.
Нажаль не те, не інше не допомогло
Тей самий "Разрушительный сбой" :(
Пример добавления фильтра в FilterBuilder по UserFilter (базовая версия, р. Контрагенты, фильтр Тип договора, см. прикрепленный файл):
var Dataset = dlData.Dataset; var SelectQuery = Dataset.SelectQuery; var Select = SelectQuery.Items(0); var FiltersBuilder = fbcFilters.FiltersBuilder; var FBItems = FiltersBuilder.RootItems; var ExistFilter = Select.Filters('ContractType'); var UserFilter = ExistFilter.TestExpression.ExpressionSelectQuery.Items(0).Filters('ContractType'); var FBItem = FBItems.CreateItemByUserFilter(UserFilter); FBItems.Add(FBItem); FBItem.ValueNotSet = true; fbcFilters.Refresh();
Дякую за допомогу Алексей, Артём без тебе ніяк :)
Знайшов свою помилку, в мене фільтр був 3 рівневий. Додав ще один InnerExistsFilter.TestExpression.ExpressionSelectQuery.Items(0).Filters.ItemsByCode() і все запрацювало!!!