FilterBuilderControl (продовження)

Допоможіть будьласка розібратися, як в FilterBuilderControl додати встановлений по замовченню фільтр. Тільки не на основі DataField, як вказано нижче, а на основі фільтру користувача створеного в сервісі SelectQuery?

dlData.Dataset.Open();
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(). Але як користуватися ними, які створювати для них ввідні об'єкти? Не можу знайти інфо, допоможіть хто знає

Нравится

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

Попробуйте использовать CreateItemByUserFilter(UserFilter) в который надо передать UserFilter из запроса

Це зрозуміло,а от як це зробити? Як із SelectQuery отримати UserFilter?

SelectQuery.Filters.ItemsByCode(код пользовательского фильтра)

Пише Dataset.SelectQuery.Filters is null

Правильно 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. Можливо якийсь параметр потрібно змінити?

Або те ж саме з FBItem

попробуйте создать фильтр до открытия датасета. Или при создании фильтра, датасет брать через 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() і все запрацювало!!!

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