lookupListConfig
Технические вопросы
7.x

Некорректная работа фильтра чрез 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 запрос:

[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
[/sql]

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

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

[javascript]
"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;
}]
}
},
[/javascript]

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

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

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

вот правильный запрос на ваши условия:
[sql]
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))
[/sql]

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

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

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

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

[javascript]

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;
}
[/javascript]

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

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

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

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

Да и вправду createNotExistsFilter возвращает требуемые задолженности. Код
[javascript]
filter: function() {

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

return filterGroup1;
}
[/javascript]

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

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

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