Некорректная работа фильтра чрез lookupListConfig ?
Здравствуйте.
Есть две сущности: Arrears - задолженности, PromisesArrears - обещания.
Суть задачи в следующем: необходимо чтобы при добавлении нового обещания, когда открываем справочник задолженностей, чтобы отображались только те задолженности по которым еще не созданы обещания. Итак, на странице PromisesArrearsPage в свойство attributes добавляем
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.
Код с#
esq.AddColumn("[PromisesArrears:Arrears].Id");
var esqFirstFilter = esq.CreateIsNullFilter("[PromisesArrears:Arrears].Id");
esq.Filters.Add(esqFirstFilter);
resultSQLText = esq.GetSelectQuery(UserConnection).GetSqlText();
return true;
Полученный в результате запрос
[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 ?
Нравится
Добрый день Андрей!!!
вы сами в условии задачи описали открывать Справочник "Задолженности" по которым нет "Обещаний". Вижу у вас здесь неправильно составленный 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; }
Сейчас у вас Андрей получилось выполнить Фильтрацию по вашим условиям задачи? или еще остались вопросы?