Здравствуйте, стоит задача отфильтровать справочник так, чтобы в него не попадали данные, которые уже есть на детали и также отсеивались все контрагенты, у которых тип не равно "наша компания" или "подрядчик".
СТРУКТУРА ДЕТАЛИ подрядчики
Контрагент| Стоимость | Основной

Пробовал 2-мя способами
1) делать запрос в базу, выбирать оттуда все существующие записи на детали и фильтровать по условию NOT_EQUAL.
вторым фильтром накладывать ограничение по типу, затем объединять их в группу,
Здесь проблема в том, что getEntityCollection() выполняется асинхронно и результаты выборки не успевают попасть в группу фильтров.
2) фильтровать по типу, а потом с помощью сообщения получать коллекцию с детали, но здесь также есть свои нюансы.
Во-первых, что будет, если у меня будет много записей на детали, все ли они заберутся при использовании метода getGridData();,
Каким образом мне получить коллекцию при первом открытии страницы и опубликовать сообщение с коллекцией?
ВАРИАНТ 1

 attributes:{

                    "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;
                        }
                    }
                }

Нравится

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Александр, здравствуйте.

В понедельник предоставим ответ по данному вопросу.

Здравствуйте, задача ещё актуальна. Заранее спасибо за помощь.

Александр, здравствуйте!
Вы можете строить Exist-фильтры прямо в ESQ без выполнения дополнительных запросов. Посмотрите статью http://www.terrasoft.ru/bpmonlinesdk/UsingEntitySchemaQuery.html (в самом конце).

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