Вопрос

Создание фильтров с подзапросом на клиенте

Коллеги, добрый день.

Версия 7.17.2.1728.

 

Возможно ли использование фильтров по колонке и подзапросу на клиенте, аналогично данному примеру:

public IEntitySchemaQueryFilterItem CreateFilter(FilterComparisonType comparisonType, string leftExpressionColumnPath, EntitySchemaQuery rightExpressionValue)

Где: comparisonType – тип сравнения leftExpressionColumnPath – путь к колонке в левой части фильтра rightExpressionValue – подзапрос в правой части фильтра



Пример:

var esq = new EntitySchemaQuery(EntitySchemaManager, "ESQCityNA"); esq.AddColumn("Id"); var subEsq = new EntitySchemaQuery(EntitySchemaManager, "ESQCityNA"); subEsq.AddColumn(subEsq.CreateAggregationFunction(AggregationTypeStrict.Max"ModifiedOn")); var filter = esq.CreateFilter(FilterComparisonType.Equal"ModifiedOn", subEsq); esq.Filters.Add(filter); string sqlText = esq.GetSelectQuery(CurrentConnection).GetSqlText();



SqlText запроса:

SELECT "ESQCityNA"."Id" "Id" FROM "ESQCityNA" "ESQCityNA" WHERE "ESQCityNA"."ModifiedOn" = (SELECT MAX("ESQCityNA"."ModifiedOn") "Max" FROM "ESQCityNA" "ESQCityNA")

Взято отсюда: https://community.terrasoft.ru/articles/opisanie-osnovnykh-metodov-entityschemaquery-chast-1

 

Попытка аналогичной подстановки:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Object"
});
 
esq.addAggregationSchemaColumn("ObjectColumn.InnerColumn", Terrasoft.AggregationType.MAX, "ActivityRoute", Terrasoft.AggregationEvalType.ALL);
filters.addItem(Terrasoft.createFilter(Terrasoft.ComparisonType.EQUAL, "ObjectColumn.InnerColumn", esq));

Приводит к ошибке в консоли с сообщением "Ошибка кодирования значения в JSON-строку".

Изображение удалено.

 

Нравится

3 комментария

Здравствуйте!

 

Подобную задачу решали в рамках этих обсуждений:

https://community.terrasoft.ru/articles/esq-select-s-neskolkimi-exists-…

https://community.terrasoft.ru/questions/dobavlenie-filtra-notexists-ne…

 

К сожалению, по тем данным, которые Вы предоставили я не могу точно сказать где проблема. Просьба обратиться в тех. поддержку и предоставить обезличенную копию БД. Тогда мы сможем более точно сориентировать Вас в проблеме и вариантах ее решения.

Zarichnyi Anton,

Антон, здравствуйте!

 

Пример запроса на SQL может выглядеть так:

SELECT *
  FROM [BPMSrvEntSS].[dbo].[ORDVisa] iov
  Where iov.ORDId = '4024cda7-ff90-4068-b872-c27851c33108'
  and [CreatedOn] in (SELECT max([CreatedOn])
  FROM [BPMSrvEntSS].[dbo].[ORDVisa] iov
  Where iov.ORDId = '4024cda7-ff90-4068-b872-c27851c33108'
  and [StatusId] = 'e79facb3-3c32-43e7-a59e-12ba125e6132'
  group by Objective,[VisaOwnerId])

То есть найти все положительные визы раздела ORD для конкретной записи, при этом в случае, если у нас визы назначались на одного пользователя несколько раз, то нужно выбрать только последнюю.

 

Вся проблема на мой взгляд в том, что мы можем не знать, сколько раз виза переназначалась, т.к. может быть несколько кругов согласования. Отсюда невозможно точно определить CreatedOn.

Смородинов Денис,



Добрый день, Денис. 



Если у в результате согласования и переназначения меняется существующая запись, а не создается новая, то CreatedOn не должен изменяться.  

Если Вы обнаружили, что именно это происходит, то скорее всего у Вас есть кастомизации, которые могут влиять на поле CreatedOn.



Для более глубокого анализа причин такого поведения рекомендую Вам обратится в тех. поддержку. 

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