NotExistsFilter в клиентской схеме

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {

            var masterId = this.get("MasterRecordId");

            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                rootSchemaName: this.entitySchemaName

            });

            esq.addColumn(segmentName);

            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));

            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));

            esq.getEntityCollection(function(result) {

                var existsContactsCollection = [];

                if (result.success) {

                    result.collection.each(function(item) {

                        existsContactsCollection.push(item.get(segmentName).value);

                    });

                }

                var config = {

                    entitySchemaName: segmentName,

                    multiSelect: true,

                    columns: ["Type"]

                };

                

                var isAccount;

                if (segmentName === "Account") {

                    config.filters = Ext.create("Terrasoft.FilterGroup");

                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(

                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));

                    isAccount = true;

                }

                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);

                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;


                    existsFilter.Name = "existsFilter";

                    if (isAccount) {

                        config.filters.add("second", existsFilter);

                    } else {

                        config.filters = existsFilter;

                    }

                }

                this.openLookup(config, function(config) {

                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);

                }, this);

            }, this);

        },

где detailColumnName = "Campaing",

segmentName = "Product",

entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {

            var masterId = this.get("MasterRecordId");

            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                rootSchemaName: this.entitySchemaName

            });

            esq.addColumn(segmentName);

            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));

            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));

            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));

                

            var config = {

                entitySchemaName: segmentName,

                multiSelect: true,

                columns: ["Type"]

            };

            

            var isAccount;

            if (segmentName === "Account") {

                config.filters = Ext.create("Terrasoft.FilterGroup");

                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));

                isAccount = true;

            }

            

            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);

            existsFilter.Name = "existsFilter";

            if (isAccount) {

                config.filters.add("second", existsFilter);

            } else {

                config.filters = existsFilter;

            }

            

            this.openLookup(config, function(config) {

                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);

            }, this);

        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)

Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)

 

Нравится

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

Также, как вариант, Вы можете реализовать получение нужных Вам записей на стороне сервера. Подробное обсуждение можете посмотреть здесь.

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

Также, как вариант, Вы можете реализовать получение нужных Вам записей на стороне сервера. Подробное обсуждение можете посмотреть здесь.

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