Всем привет.
Ввиду не внятности документации прошу помощи.
Как составить такой запрос используя ESQ на клиенте?
SELECT account.UsrINN,(SELECT TOP(1) ModifiedOn FROM Activity activity WHERE activity.AccountId=account.Id ORDER BY ModifiedOn) AS LastComunicationDate FROM Account account WHERE account.UsrINN = '7730616959'
Собственно запрос выводит дату последней измененной активности по контрагенту.
Нравится
Последовский Роман,
А так?
var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" }); esq.addColumn("UsrINN"); esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn"); esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959")); esq.getEntityCollection(function (result) { if (result.success && result.collection.getCount() > 0) { result.collection.collection.each(function(item) { //some logic }, this); } }, this);
Роман, приветствую,
А у вас проблема в подзапросе или в сортировке?
Есть в сортировке, то возможно вам поможет вот это: https://community.terrasoft.ru/questions/entityschemaquery-order
Если в подзапросе, то можно
1. Сделать один запрос, а в его колбэке (или в цикле foreach, если это C# сделать еще один запрос).
2. Судя по всему подзапрос можно заменить обычным джойном.
На клиенте? Тогда как-то так:
var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Activity" }); esq.addColumn("Account.UsrINN", "AccountINN"); var column = esq.addColumn("ModifiedOn"); column.orderDirection = Terrasoft.OrderDirection.ASC; //asc по modifiedOn esq.rowCount=1; //top1 esq.filters.addItem(esq.createColumnFilterWithParameter(3, "Account.UsrINN", "7730616959")); //фильтр по INN esq.getEntityCollection(function (result) { if (result.success && result.collection.getCount() > 0) { var item = result.collection.getByIndex(0); var INN = item.get("AccountINN"); var modOn = item.get("ModifiedOn"); } }, this);
Мне кажется, тут сам SQL-запрос надо вывернуть наизнанку:
SELECT max(ModifiedOn) FROM Activity activity left join Account account on activity.AccountId=account.Id WHERE account.UsrINN = '7730616959'
То есть получим запрос с одной колонкой и одним фильтром по прямой связи. Заодно вместо TOP 1 можно просто максимум при помощи addAggregationSchemaColumn. А затем фильтруем, применив createColumnFilterWithParameter к колонке «Account.UsrINN».
Спасибо большое, вариант Данилы работает, но
Затык как раз в том что мне нужно вывести именно список контрагентов(UsrINN), а уже к каждому из них привязать дату последней работы с активностью.
Судя по исходному вопросу, код контрагента известен и равен 7730616959, следовательно, в списке всегда будет одна строка. Если таких номеров несколько, можно получить этим кодом в цикле для каждого.
Это часть системы поиска дублей.
Контрагентов с одинаковыми инн в системе может быть много, но не у каждого из них могут активности. Основная задача вывести контрагентов, а дата последнего взаимодействия по активностям - это довесок.
ИНН:123
10 контрагентов, но у 5ти из них есть активности.
Если я сначала полезу в таблицу активности, то мне выведется на экран только 5ть контрагентов, а реально их 10.
В самом начале я указал именно тот SQL запрос, который нужно изобразить с помощью ESQ.
Конечно можно это сделать двумя циклами, но хочется понять можно ли это сделать одним запросом
Такое есть смысл делать на сервере. В классе Select можно делать почти то же, что в SQL-запросах, плюс дубли могут быть недоступны через ESQ из-за прав доступа текущего пользователя, а Select работает в обход них.
Последовский Роман,
А так?
var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" }); esq.addColumn("UsrINN"); esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn"); esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959")); esq.getEntityCollection(function (result) { if (result.success && result.collection.getCount() > 0) { result.collection.collection.each(function(item) { //some logic }, this); } }, this);