Добрый день возникла потребность фильтровать справочник с саб селектом. То-есть есть лукам/список привязанный к справочнику, хочу чтобы мне попадали в контрол значения по такому селекту:
FROM table1
WHERE NOT EXISTS (
SELECT tbale2.ID FROM table2 WHERE table2.table1 = table1.ID )
Или любой другой саб селект
Нравится
Здравствуйте, Сергей!
Как мы уже определились в рамках обращения, нужно использовать функцию создания 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 не использовать конструкцию:
[csharp]
var Select = new Select(UserConnection)
.Column("Id")
.From("Contact")
.Where("AccountId").IsNotEqual(Column.Parameter(NId))
//NId - параметр Guid.Empty
[/csharp]
Перефразирую, как в метод .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-фильтр с параметрами.
Может кому понадобится.