Коллеги, добрый день.
Версия 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-строку".
Нравится
Здравствуйте!
Подобную задачу решали в рамках этих обсуждений:
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.
Для более глубокого анализа причин такого поведения рекомендую Вам обратится в тех. поддержку.