Добрый день.

Подскажите пожалуйста, как проводить фильтрацию с помощью бизнес правил по логическому полю?

Например у меня есть правило:

rules: {

            "Status": {

                "FiltrationStatusNrbUseInCalls": {

                    ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,

                    autocomplete: true,

                    autoClean: true,

                    baseAttributePatch: "Finish",

                    comparisonType: Terrasoft.ComparisonType.EQUAL,

                    type: BusinessRuleModule.enums.ValueType.CONSTANT,

                    value: true

                },

        },

},

и оно не работает, ошибки в консоли нет.

но если я буду фильтровать по полю с id (например укажу baseAttributePatch: "Id"? а в value конкретный Id), то фильтр работает.

 "Status" указан в атрибутах, как виртуальная колонка.

Нравится

1 комментарий

Решила вопрос сама, где бы не располагалась фильтрация, будь то в секции filters у атрибута, или в rules, для справочников типа ENUM это не работает. Помогло только вынести метод getLookupQuery и все его зависимые методы на страницу. 

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

Всем добрый день!

Бьюсь второй день. Нужно добавить группу фильтров в разделе с оператором OR.

По умолчанию в коробке в коллекцию фильтров filters добавляются группы через AND, при этом легко добавляется просто одиночный фильтр (например "FilterStatus"). Но вот группа фильтров - уже не работает.

Судя по примеру добавления фильтров "FixedFilter" и "CustomFilter" в коробке продукта - нужно как то хитро определять конфиг этой группы. Я добавляю items в группу, но получается не так, как у Terrasoft. Их исходного кода найти не могу. Помогите, пожалуйста :( Что не так...

getFilters: function() {
 
debugger;
var filters = this.callParent(arguments);
var items = this.$UsrGroups;
let counter = 1;
//создание группы фильтров
var usrFilterGroup = this.Ext.create("Terrasoft.FilterGroup");
usrFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
//добавление фильтра по каждой группе юзера
for (var item in items) {
	var tempFilterGroup = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "Group.Id", item);
	usrFilterGroup.addItem(tempFilterGroup);
	window.console.log("Добавлен фильтр по группе " + item.Name);
	counter++;
}
filters.add("UserGroupsFilter", usrFilterGroup);
return filters;
}

 

Нравится

4 комментария

Вам нужно вернуть фильтр с условием User filter или Section filter, так?

 

Если так, то тогда нужно создать две группы, одна группа, которая будет объединять фильтры секции и вторая с вашими фильтрами. В общей группе сделать тип or, в вашей вам нужно. И потов вернуть не filters, а объединяющую группу.

 

var usrSectionFilterGroup = this.Ext.create("Terrasoft.FilterGroup");

usrSectionFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;



usrSectionFilterGroup.add("SectionFilter", filters);

var usrFilterGroup = this.Ext.create("Terrasoft.FilterGroup");

//ваш фильтр

usrSectionFilterGroup.add("UsrFilterGroup", usrFilterGroup);

return usrSectionFilterGroup;

 

 

Трефилов Павел Сергеевич,

Ваш вариант не работает (

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

Помогите разобраться (

 

В ActivitySectionV2 так, и все работает... Тут тоже самое - нет... Каааааак?

getFilters: function() {
 
var filters = this.callParent(arguments);
	var fixedFilters = filters.contains("FixedFilters")	? filters.get("FixedFilters") : null;
	if (!this.Ext.isEmpty(fixedFilters) && fixedFilters.contains("Owner")) {
	var ownerFilters = fixedFilters.get("Owner");
	if (ownerFilters.contains("OwnerDefaultFilter")) {
	ownerFilters.removeByKey("OwnerDefaultFilter");
}
}
if (this.isSchedulerDataView()) {
	if (!filters.contains("ShowInSchedulerFilter")) {
	filters.add("ShowInSchedulerFilter", this.Terrasoft.createColumnFilterWithParameter(
		this.Terrasoft.ComparisonType.EQUAL, "ShowInScheduler", true));
	}
	if (!fixedFilters) {
		fixedFilters = this.Terrasoft.createFilterGroup();
		fixedFilters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
		filters.add("FixedFilters", fixedFilters);
	}
	var hasPeriodFilters = fixedFilters.contains("PeriodFilter");
	var periodFilter = hasPeriodFilters ? fixedFilters.get("PeriodFilter") : null;
	if (!hasPeriodFilters || (periodFilter && !(periodFilter instanceof Terrasoft.Collection))) {
		this.setDateFiltersCurrentDate(fixedFilters);
	}
}
	if (this.isNotSchedulerDataView() &&
		filters.contains("ShowInSchedulerFilter")) {
		filters.removeByKey("ShowInSchedulerFilter");
}
 
filters.add("NotEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.NOT_EQUAL, "Type", ConfigurationConstants.Activity.Type.Email
));
 
return filters;
},
 
				/**
				 * ############# ############ ####### ## ####### ### ########## ## ####### ####.
				 * @private
				 * @param {Object} fixedFilters ###### ############ ########.
				 */
setDateFiltersCurrentDate: function(fixedFilters) {
	var now = new Date();
	var periodFilter = this.Terrasoft.createFilterGroup();
	periodFilter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	periodFilter.add("DueDate", this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.GREATER_OR_EQUAL, "DueDate",
	this.Terrasoft.startOfDay(now)));
	periodFilter.add("StartDate", this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.LESS_OR_EQUAL, "StartDate",
	this.Terrasoft.endOfDay(now)));
	if (fixedFilters.contains("PeriodFilter")) {
	fixedFilters.removeByKey("PeriodFilter");
}
fixedFilters.add("PeriodFilter", periodFilter);
},

 

Добрый день, Надежда!



Хочу у вас уточнить, вы проводили отладку вашего кода?

Также мне интересно, что именно у вас представляет $UsrGroups?

Попробовал запустить ваш код, в итоге объект items был undefiend.

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

Добрый день. Вопрос - можно ли добавить несколько фильтров                 accountEsq.Filters.LogicalOperation = LogicalOperationStrict.Or;

var accountIdNumberEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsIdNumber", request.IdNumber);

var accountIdFixEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsIdFix", request.IdNumber);

var accountServiceCrmIdEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsServiceCrmId", request.IdNumber);

accountEsq.Filters.Add(accountIdNumberEsqFilter);

accountEsq.Filters.Add(accountIdFixEsqFilter);

accountEsq.Filters.Add(accountServiceCrmIdEsqFilter);

в

CreateEntity(UserConnection)

так как в

UserConnection.EntitySchemaManager.GetInstanceByName,

или только использовать FetchFromDB ?

Нравится

1 комментарий

Функция CreateEntity создаёт новую запись с пустыми полями, фильтры тут не имеют смысла:

var contactCareerSchema = UserConnection.EntitySchemaManager.GetInstanceByName("ContactCareer");	
var contactCareerEntity = contactCareerSchema.CreateEntity(UserConnection);
contactCareerEntity.SetDefColumnValues();
contactCareerEntity.SetColumnValue("Id", Guid.NewGuid());
contactCareerEntity.SetColumnValue("ContactId", NewMainContact);
contactCareerEntity.SetColumnValue("AccountId", EntityPrimaryColumnValue);
contactCareerEntity.SetColumnValue("Current", true);
contactCareerEntity.Save();

Другой её способ использования вместе с FetchFromDB, вытягивание записи по Id:

var schema = UserConnection.EntitySchemaManager.FindInstanceByName("SysAdminUnit");
var sysAdminUnit = schema.CreateEntity(UserConnection);
if (sysAdminUnit.FetchFromDB(recordId)) {
	var p = new Dictionary<string, string>();
	p.Add("LDAPEntryId", sysAdminUnit.GetTypedColumnValue<string>("LDAPEntryId"));
...

Наконец, вытягивать можно не только по Id, но и по другим условиям, как тут:

Dictionary<string, object> conditions = new Dictionary<string, object>();
var userId = (context.ThrowEventArgs as List<object>)[0].ToString();
var roleId = new Guid("A29A3BA5-4B0D-DE11-9A51-005056C00008");
conditions["SysUser"] = userId;
var sysUserInRoleSchema = Page.UserConnection.EntitySchemaManager.GetInstanceByName("SysUserInRole");
conditions["SysRole"] = roleId;
var sysUserInRole = sysUserInRoleSchema.CreateEntity(Page.UserConnection);
if (sysUserInRole.FetchFromDB(conditions)) {
	return true;
}

Возможно, Вам нужно сделать похожее на последний вариант. Но если из-за Or условие слишком сложное, проще будет использовать обычное получение коллекции после наложения фильтров:

var couponESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Coupon");
	couponESQ.AddColumn("BonusesPayedAmount");
	couponESQ.AddColumn("CouponCard");
couponESQ.Filters.Add(couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "Purchase", purchaseId));
var cardFilters = new EntitySchemaQueryFilterCollection(couponESQ, LogicalOperationStrict.Or);
var permanentCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.PermanentTypeUId);
cardFilters.Add(permanentCardIdfilter);
var temporaryCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.TemporaryTypeUId);
cardFilters.Add(temporaryCardIdfilter);
var certificateCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.SertificateTypeUId);
cardFilters.Add(certificateCardIdfilter);
couponESQ.Filters.Add(cardFilters);
var couponEntities = couponESQ.GetEntityCollection(UserConnection);
if (couponEntities.Count > 0) {
	foreach (var coupon in couponEntities) {
		var bonusesPayedAmount = coupon.GetTypedColumnValue<decimal>("BonusesPayedAmount");
...

 

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

Доброго времени суток

Создал замещающую схему для Section base schema ( NUI ) в новом пакете (не Custom). В схеме добавляется фильтр для EntitySchemaQuery через esq.filters.addItem(). Фильтр рабочий, т.к. проверялся на локальной машине с последующим пушем на препрод.

На препроде фильтр не работает. Вероятно, не хватает какой-то генерации или чего-то еще. Но вопрос, чего именно.

Я делал генерацию source code для выбранного файла, в котором прописан скрипт, делал генерацию для модифицированных, в общем, я по очереди делал все виды генераций и после этого компилил. Результата нет.

Нравится

2 комментария
Лучший ответ

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Попробуйте очистить кэш браузера или проверить в другом броузере или в приват моде, проверьте наличие ошибок в консоли браузера

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