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

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

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

Нравится

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

Здравствуйте, Сергей!
Как мы уже определились в рамках обращения, нужно использовать функцию создания 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 c условиями на сервере в C#?

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

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

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

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

Перефразирую, как в метод .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-фильтр с параметрами.
Может кому понадобится.

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