Некорректная работа фильтра чрез lookupListConfig ?

Здравствуйте.

Есть две сущности: Arrears - задолженности, PromisesArrears - обещания.
Суть задачи в следующем: необходимо чтобы при добавлении нового обещания, когда открываем справочник задолженностей, чтобы отображались только те задолженности по которым еще не созданы обещания. Итак, на странице PromisesArrearsPage в свойство attributes добавляем

"Arrears": {
                dataValueType: Terrasoft.DataValueType.LOOKUP,
                dependencies: [
                                {
                                        columns: ["Arrears"],
                                        methodName: "arrearsFunction"
                                }
                        ],                             
                lookupListConfig: {
                                filters: [
                                        function() {
                                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                                var notHaveOtherPromisesFilter = Terrasoft.createColumnIsNullFilter("[PromisesArrears:Arrears].Id");
                                                filterGroup.add("notHaveOtherPromisesFilter", notHaveOtherPromisesFilter);
                                                return filterGroup;
                                        }
                                ]
                        }
                },

Но в результате открывается пустой справочник. Пробовал также указывать явно левосторонний join ">[PromisesArrears:Arrears].Id", но это ничего не дало. К сожалению, не знаю как получить sql текст на JS, поэтому для получения текста запроса создал esq на c# с идентичным как мне представляется фильтром и join.
Код с#

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Arrears");
        esq.AddColumn("[PromisesArrears:Arrears].Id");
       
        var esqFirstFilter = esq.CreateIsNullFilter("[PromisesArrears:Arrears].Id");
        esq.Filters.Add(esqFirstFilter);       
       
        resultSQLText = esq.GetSelectQuery(UserConnection).GetSqlText();

return true;

Полученный в результате запрос
SELECT
        [PromisesArrears].[Id] [PromisesArrears.Id]
FROM
        [dbo].[Arrears] [Arrears] WITH(NOLOCK)
        LEFT OUTER JOIN [dbo].[PromisesArrears] [PromisesArrears] WITH(NOLOCK) ON ([PromisesArrears].[ArrearsId] = [Arrears].[Id])
WHERE
        [PromisesArrears].[Id] IS NULL

^^И это именно тот запрос, что возвращает мне то что нужно (в части фильтрации и join).

Поэтому пара вопросов:
1) Что не так в lookupListConfig?
2) Как получить SQL текст на JS ?

Нравится

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

Добрый день Андрей!!!

вы сами в условии задачи описали открывать Справочник "Задолженности" по которым нет "Обещаний". Вижу у вас здесь неправильно составленный SQL запрос. Вот я как вижу правильный SQL запрос:

SELECT
        [PromisesArrears].[Id] [PromisesArrears.Id]
FROM
        [dbo].[Arrears] [Arrears] WITH(NOLOCK)
        LEFT OUTER JOIN [dbo].[PromisesArrears] [PromisesArrears] WITH(NOLOCK) ON ([PromisesArrears].[ArrearsId] = [Arrears].[Id])
WHERE
        [PromisesArrears].[ArrearsId] IS NULL

При вашем условии вы всегда получите пусто.

поэтому на Яваскрипте у вас должно быть написано следующее:

"Arrears": {
     dataValueType: Terrasoft.DataValueType.LOOKUP,
     dependencies: [
     {
          columns: ["Arrears"],
          methodName: "arrearsFunction"
     }],
     lookupListConfig: {
          filters: [function()
          {
               var filterGroup = Ext.create("Terrasoft.FilterGroup");
               var notHaveOtherPromisesFilter = Terrasoft.createColumnIsNullFilter("[PromisesArrears:Arrears].Arrears");
               filterGroup.add("notHaveOtherPromisesFilter", notHaveOtherPromisesFilter); 
               return filterGroup;
          }]
     }
},

Нет, не помогло.
Да и если запустить оба sql-скрипта, то можно убедиться, что результат будет идентичен. Один столбец со значением null во всех строках, а количество этих самых строк равно количеству задолженностей, по которым еще нет обещаний.

Добрый день Андрей!!!

совсем заработался сегодня уже стал неправильный код выдавать :)

вот правильный запрос на ваши условия:

SELECT
        COUNT([Arrears].[Id]) as CountArrearsId
FROM
        [dbo].[Arrears] [Arrears] WITH(NOLOCK)
WHERE [Arrears].[Id] NOT IN (SELECT [PromisesArrears].[ArrearsId]
                                          FROM [dbo].[PromisesArrears] [PromisesArrears] WITH(NOLOCK))

Да и тот запрос, что в моем первом сообщении возвращает те задолженности, по которым нет обещаний, то есть соответствует моим условиям. Конечно его нужно подправить в части SELECT (на SELECT [Arrears].[Id] вместо SELECT [PromisesArrears].[Id]), но это ведь не имеет отношения к свойству lookupListConfig.filters, где не фигурируют выбираемые колонки, а только колонки, по которым идет фильтрация (то есть, те что попадают в запрос в частях Where и Join).

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

Я в общем-то нашел решение, которое меня устроило в этой теме в конце http://www.community.terrasoft.ua/forum/topic/12500

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

filter: function() {
                        var Contact = this.get("Contact");
                        var filterGroup1 = this.Terrasoft.createFilterGroup();
                        filterGroup1.add("ContactFilter1",	Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
"[PromisesArrears:Arrears].Contact", Contact.value));
 
                        var filterGroup2 = this.Terrasoft.createFilterGroup();
 
                        var notHaveOtherPromisesFilter = this.Terrasoft.createNotExistsFilter("Id", filterGroup1);
                        filterGroup2.addItem(notHaveOtherPromisesFilter);
 
                        filterGroup2.add("ContactFilter",
			Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", Contact.value)); 
 
                        return filterGroup2;							
 } 

А вот как отобразить все задолженности (не привязываясь к конкретному контакту) по которым нет обещаний ?

И, кстати, для метода createNotExistsFilter в статье на академии представлен только вариант с одним параметром - columnPath, а не тот вариант, что использован в примере выше и о существовании которого оставалось только догадываться.

Добрый день Андрей!!!

вы в своем сообщение привели ссылку на статью Комьюнити где описывается как создать "createNotExistsFilter". Чем он вас не устраивает? Это такой же запрос, что я приводил выше, только переделанный на EXISTS. В чем у вас возникли сложности?

Да и вправду createNotExistsFilter возвращает требуемые задолженности. Код

filter: function() {
 
									var filterGroup1 = this.Terrasoft.createFilterGroup();
									filterGroup1.add("ArrearsInPromisesFilter1", Terrasoft.createNotExistsFilter("[PromisesArrears:Arrears].Id"));
 
 
									return filterGroup1;							
} 

Сейчас у вас Андрей получилось выполнить Фильтрацию по вашим условиям задачи? или еще остались вопросы?

Да, получилось то что нужно с последним кодом.

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