Здравствуйте, стоит задача отфильтровать справочник так, чтобы в него не попадали данные, которые уже есть на детали и также отсеивались все контрагенты, у которых тип не равно "наша компания" или "подрядчик".
СТРУКТУРА ДЕТАЛИ подрядчики
Контрагент| Стоимость | Основной
Пробовал 2-мя способами
1) делать запрос в базу, выбирать оттуда все существующие записи на детали и фильтровать по условию NOT_EQUAL.
вторым фильтром накладывать ограничение по типу, затем объединять их в группу,
Здесь проблема в том, что getEntityCollection() выполняется асинхронно и результаты выборки не успевают попасть в группу фильтров.
2) фильтровать по типу, а потом с помощью сообщения получать коллекцию с детали, но здесь также есть свои нюансы.
Во-первых, что будет, если у меня будет много записей на детали, все ли они заберутся при использовании метода getGridData();,
Каким образом мне получить коллекцию при первом открытии страницы и опубликовать сообщение с коллекцией?
ВАРИАНТ 1
"Account": {
lookupListConfig: {
filter: function() {
var filters_res = new Terrasoft.createFilterGroup();
filters_res.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
var filters = new Terrasoft.createFilterGroup();
filters.name = 'TypeFilter';
filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.OR;
filters.isEnabled = true;
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.OurCompany));
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.Contractor));
var filterGroup = new Terrasoft.createFilterGroup();
filterGroup.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
var addParams = {item1: 'Account', item2: 'PrfService'};
var filterValue = this.get('PrfService').value;
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
esq.addColumn("Id");
esq.addColumn(addParams.item1 + '.Id');
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("filterChild", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, addParams.item2, filterValue));
esq.getEntityCollection(function(result) {
var existsContactsCollection = [];
if (result.success) {
result.collection.each(function(item) {
existsContactsCollection.push(item.get(addParams.item1 + '.Id'));
});
}
if (existsContactsCollection.length > 0) {
var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
existsFilter.Name = "existsFilter";
//filterGroup.add(filters);
//filterGroup.add(existsFilter);
filterGroup.add(existsFilter);
}
});
filters_res.add(filterGroup);
filters_res.add(filters);
return filters_res;
}
}
}
},
ВАРИАНТ 2
this.sandbox.subscribe('ContractorCollectionMessage',
function(params) {
this.set("ExistsCollection", params.existsCollection);
},
this
);
.......
attributes:{
"Account": {
lookupListConfig: {
filter: function() {
var existsCollection=this.get("existsCollection");
//фильтр по нашей компании и подрбядчику
var filters = new Terrasoft.createFilterGroup();
filters.name = 'TypeFilter';
filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.OR;
filters.isEnabled = true;
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.OurCompany));
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.Contractor));
//общий фильтр
var filterGroup = new Terrasoft.createFilterGroup();
filterGroup.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
//добавляем фильтр по типу контрагента
filterGroup.add(filters);
if (typeof (existsCollection)!=undefined && existsCollection.length > 0) {
var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsCollection);
existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
existsFilter.Name = "existsFilter";
//фильтр по имеющимся на детали записям
filterGroup.add(existsFilter);
}
return filterGroup;
}
}
}
Нравится
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.
Александр, здравствуйте.
В понедельник предоставим ответ по данному вопросу.
Здравствуйте, задача ещё актуальна. Заранее спасибо за помощь.
Александр, здравствуйте!
Вы можете строить Exist-фильтры прямо в ESQ без выполнения дополнительных запросов. Посмотрите статью http://www.terrasoft.ru/bpmonlinesdk/UsingEntitySchemaQuery.html (в самом конце).