Добрый день возникла потребность фильтровать справочник с саб селектом. То-есть есть лукам/список привязанный к справочнику, хочу чтобы мне попадали в контрол значения по такому селекту:
FROM table1
WHERE NOT EXISTS (
SELECT tbale2.ID FROM table2 WHERE table2.table1 = table1.ID )
Или любой другой саб селект
Нравится
Здравствуйте, Сергей!
Как мы уже определились в рамках обращения, нужно использовать функцию создания not exists - фильтра:
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 }); }
Для Вашего случая наложение фильтра выглядит так:
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; }
Здравствуйте, Игорь!
А почему вместо not exists не использовать конструкцию:
var Select = new Select(UserConnection) .Column("Id") .From("Contact") .Where("AccountId").IsNotEqual(Column.Parameter(NId)) //NId - параметр Guid.Empty
Перефразирую, как в метод .CreateNotExistsFilter() передать условия фильтрации а не только имя поля по которому производится фильтрация? чтобы построить запрос вида:
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] = '<Id Категории активности>' ---!!!Интересует эта строка )
Вероятно CreateNotExistsFilter не позволит вам так сделать, попробуйте не использовать CreateNotExistsFilter, а сделать обычный LEFT JOIN своего SxActivityDocument к Document по SxDocumentId, к ним SxActivity по SxActivityId и [SxActivity].[ActivityCategoryId] = '', и уже поверх этого делать условие: (SxActivityDocument IS NULL)
Нашёл вариант в базовом коде BPM Online 7.3.
Добавляем группу фильтров, в которую добавляем все условия и устанавливаем свойство .IsNot = true.
После чего добавляем группу фильтров в фильтры запроса
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);
Получил то, что нужно. NotExists-фильтр с параметрами.
Может кому понадобится.