Фильтрация справочника
Технические вопросы
7.x

Фильтрация

Добрый день возникла потребность фильтровать справочник с саб селектом. То-есть есть лукам/список привязанный к справочнику, хочу чтобы мне попадали в контрол значения по такому селекту:

SELECT table1.ID, table1.Name
FROM table1
WHERE  NOT EXISTS  (
             SELECT tbale2.ID FROM table2 WHERE table2.table1 = table1.ID )

Или любой другой саб селект

Нравится

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

Здравствуйте, Сергей!
Как мы уже определились в рамках обращения, нужно использовать функцию создания not exists - фильтра:
[javascript]
Terrasoft.createNotExistsFilter
function (columnPath, subFilters) {
if (Ext.isEmpty(columnPath)) {
throw new Terrasoft.ArgumentNullOrEmptyException({
argumentName: "columnPath"
});
}
return Ext.create("Terrasoft.ExistsFilter", {
comparisonType: Terrasoft.ComparisonType.NOT_EXISTS,
leftExpression: Ext.create('Terrasoft.ColumnExpression', {
columnPath: columnPath
}),
subFilters: subFilters
});
}
[/javascript]

Для Вашего случая наложение фильтра выглядит так:
[javascript]
filter: function () {
var filters = Ext.create('Terrasoft.FilterGroup');
filter.Name = 'PeriodFilter';
filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;

var contact = this.get('Contact');
if (contact) {
var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
rootSchemaName: 'VK_TimePlanning'
});
esq.addColumn('Period');
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'Contact', contact.value));

Terrasoft.createNotExistsFilter('[VK_TimePlanning:Period].Period', esq);

filters.add(filterName, filter);
}
return filters;
}

[/javascript]

как сделать Not exists c условиями на сервере в C#?

Здравствуйте, Игорь!

А почему вместо not exists не использовать конструкцию:

[csharp]
var Select = new Select(UserConnection)
.Column("Id")
.From("Contact")
.Where("AccountId").IsNotEqual(Column.Parameter(NId))
//NId - параметр Guid.Empty

[/csharp]

мне нужно через ESQ

Перефразирую, как в метод .CreateNotExistsFilter() передать условия фильтрации а не только имя поля по которому производится фильтрация? чтобы построить запрос вида:
[sql]
SELECT
[Document].[Id] [Id]
FROM
[dbo].[Document] [Document] WITH(NOLOCK)
WHERE
AND [Document].[SxCompletionDate] <= GETDATE()
AND NOT EXISTS (
SELECT
[SxActivityDocument].[Id] [Id]
FROM
[dbo].[SxActivityDocument] [SxActivityDocument] WITH(NOLOCK)
LEFT OUTER JOIN [dbo].[Activity] [SxActivity] WITH(NOLOCK) ON ([SxActivity].[Id] = [SxActivityDocument].[SxActivityId])
WHERE
[Document].[Id] = [SxActivityDocument].[SxDocumentId]
AND [SxActivity].[ActivityCategoryId] = '' ---!!!Интересует эта строка
)
[/sql]

Вероятно CreateNotExistsFilter не позволит вам так сделать, попробуйте не использовать CreateNotExistsFilter, а сделать обычный LEFT JOIN своего SxActivityDocument к Document по SxDocumentId, к ним SxActivity по SxActivityId и [SxActivity].[ActivityCategoryId] = '', и уже поверх этого делать условие: (SxActivityDocument IS NULL)

Нашёл вариант в базовом коде BPM Online 7.3.
Добавляем группу фильтров, в которую добавляем все условия и устанавливаем свойство .IsNot = true.
После чего добавляем группу фильтров в фильтры запроса

[code]
var notExistsFilterGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.And);
notExistsFilterGroup.IsNot = true;
var accountClientType = new Guid("03a75490-53e6-df11-971b-001d60e938c6");
notExistsFilterGroup.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"[Account:PrimaryContact].Type.Id", accountClientType));
esq.Filters.Add(notExistsFilterGroup);
[/code]
Получил то, что нужно. NotExists-фильтр с параметрами.
Может кому понадобится.

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