Добрый день!

Есть объект "TableDataBase" с колонками "Name" (строка), "Positiv" (логическое).

Помогите составить запрос таким образом, чтобы в коллекцию ESQ попадали только значения колонки "Name" объекта "TableDataBase".

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "TableDataBase");
esq.AddColumn("Positiv");
var typeActivityFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Positiv", true);   esq.Filters.Add(typeActivityFilter);
var entityCollection = esq.GetEntityCollection(UserConnection);

 

Нравится

2 комментария
Лучший ответ

либо я тебя не понял, но чем вариант 

esq.AddColumn("Name"); не подходит?

либо я тебя не понял, но чем вариант 

esq.AddColumn("Name"); не подходит?

Dima Avdoshin,

Да. Точно. Это я уже мудрить начал. Спасибо!

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

Добрый день. У меня в таблице Account лежат два внешних ключа на таблицу Contact. Подскажите, как явно указать столбец для джойна. Это:

esq.addColumn("=Contact.Name", "ContactName");

возвращает не верные значения. К тому же, хотелось бы использовать inner join, но запрос летит в виде:
 

LEFT OUTER JOIN [dbo].[Contact] [PrimaryContact] WITH(NOLOCK) ON ([PrimaryContact].[Id] = [UsrAccount].[PrimaryContactId])

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

Нравится

5 комментариев
Лучший ответ

Вот статья https://academy.terrasoft.ru/docs/7-17/developer/front-end_development/…

 

Не надо писать равно.

 

Если у вас root таблица в esq это Account в нем к примеру есть поле Ответственный Owner справочник контакта. Вам надо получить какое-то из полей Owner.

 

esq.addColumn("Owner.Id", "OwnerId");

esq.addColumn("Owner.Name", "OwnerName");

 

Также если в контакте тоже есть справочное поле Lookup у справочника которого есть поле Name можно провалится и дальше 

esq.addColumn("Owner.Lookup.Name", "OwnerLookupName");

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

 PrimaryContactId*

Два внешних ключа это два справочных поля со справочником контакта в объекте контрагент? 

Полозюков Евгений Петрович, верно. Один указывает на Основной контакт контрагента, второй на Менеджера работающего с контрагентом.

Другими словами, запрос:
 

SELECT offer.* from UsrCommercialOffer as offer
INNER JOIN Account as acc
    ON offer.UsrAccountId = acc.Id
WHERE acc.OwnerId = @currentUserId

Его нужно написать на фронте. 

Вот статья https://academy.terrasoft.ru/docs/7-17/developer/front-end_development/…

 

Не надо писать равно.

 

Если у вас root таблица в esq это Account в нем к примеру есть поле Ответственный Owner справочник контакта. Вам надо получить какое-то из полей Owner.

 

esq.addColumn("Owner.Id", "OwnerId");

esq.addColumn("Owner.Name", "OwnerName");

 

Также если в контакте тоже есть справочное поле Lookup у справочника которого есть поле Name можно провалится и дальше 

esq.addColumn("Owner.Lookup.Name", "OwnerLookupName");

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

Добрый день, возникла проблема, что я не могу взять больше 20 тыс одним запросом, поэтому было решено ограничить , брав только первую запись из выборки , каким образом это можно сделать. (это не бизнес процесс)

 

Нравится

6 комментариев
var userConnection = Get<UserConnection>("UserConnection");
var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, <SchemaName>);
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, <FieldName>, fieldValue));
var enitites = esq.GetEntityCollection(userConnection);
ver entity = enitites.FirtsOrDefault();

Примерно так.

Дамиан, так делать неправильно, в момент GetEntityCollection всё равно будут получены все записи, соответствующие условиям.

Правильнее будет перед этим дописать:

esq.RowCount = 1;

Аналогично и с колонками, оставить только нужные.

Дмитрий, а почему такие крайности, от 20000 к 1? Что именно Вы получаете и что потом с этими данными делаете? Может, подобрать оптимальный размер порции для обработки за раз?

Как пропустить часть записей с начала и выбрать следующие несколько, см. в теме.

Александр, спасибо за уточнение. Нашёл еще один подход.

public Entity GetEntity(UserConnection userConnection)
{
    var entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(name);
    var esq = new EntitySchemaQuery(entitySchema);
    esq.AddAllSchemaColumns();
    return esq.GetEntity(userConnection, primaryColumnValue);
}

 

Тут всё зависит, сколько реально записей отфильтруется по такому условию. Если всегда 0 или 1, то можно и первым, и вторым Вашим способом. А если есть риск получить 100500 результатов, то лучше перестраховаться, ограничив количество в запросе.

Зверев Александр,
у нас логи по 1с пишутся в системе, куда отправили , что отправили , также получаем данные из 1с, из-за этого логов за один проход чуть больше 100 получается каждые пол часа
а первую запись из выборки мне надо для нумерации этих логов

Соответственно он не сможет дальше писать ничего , если при записи лога взял пулом 20 тыс записей разом

Если реально нужно считать одну запись, см. мой пример выше. Или вообще хранить и менять текущий номер отдельно в какой-то системной настройке, как сделано для нумерации договоров, счетов и подобного.

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

Добрый день,  коллеги. Помогите пожалуйста сделать ESQ запрос с фильтрацией. Вывести 

TOP1 номер который соответсвует критерию. 

Читал статьи так и не понял.  Данный запрос в разделе контакты.

Select T1."Number" From  "ContactCommunication" T1

LEFT JOIN "Contact" T2 ON T1.Contact=T2.Id

Where T1.CommunicationType='3DDDB3CC-53EE-49C4-A71F-E9E257F59E49'

 

onEntityInitialized: function() {
        this.callParent(arguments);
        this.helping();
    },
    helping: function() {
     // Получаем [Id] объекта карточки.
      // Получаем [Id] объекта карточки.
var recordId = this.get("Id");
// Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "Contact"
});
esq.addColumn("[ContactCommunication:Contact:Id].Number", "Number");
esq.addColumn("[ContactCommunication:Contact:Id].CommunicationType", "CommunicationType");
var esqFirstFilter= esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "CommunicationType", "3DDDB3CC-53EE-49C4-A71F-E9E257F59E49");

// Добавление созданных фильтров в коллекцию запроса. 
esq.filters.add("esqFirstFilter", esqFirstFilter);

// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
esq.getEntityCollection(function (result) {
    if (result.success) {
      result.collection.each(function (item) {
      this.showInformationDialog(result.entity.get("Number"));
        });
    }
}, this);
        }

Нравится

2 комментария
Лучший ответ

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
		// Добавление созданных фильтров в коллекцию запроса. 
		esq.filters.add("esqFirstFilter", esqFirstFilter);
		esq.filters.add("esqSecondFilter", esqSecondFilter);
		// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
		esq.getEntityCollection(function(result) {
			if (result.success) {
				result.collection.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
		// Добавление созданных фильтров в коллекцию запроса. 
		esq.filters.add("esqFirstFilter", esqFirstFilter);
		esq.filters.add("esqSecondFilter", esqSecondFilter);
		// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
		esq.getEntityCollection(function(result) {
			if (result.success) {
				result.collection.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Быстров Сергей, Спасибо, сейчас попробуем. 

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

Добрый вечер! Не знаю как такое возможно, чтобы ESQ.GetEntity() возвращал другую строку, при заданном первичном ключе в параметре функции. На скрине видно, что Id который задан и тот который вернул запрос совсем разные, а именно эта запись которую он взял идёт первой в таблице, что я не так делаю или в чём может ошибка? 

Прикрепленные файлы

Нравится

1 комментарий

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

Мне такую же ошибку не удалось воспроизвести - GetEntity отрабатывает правильно.

Попробуйте явно указать id, вот так: esq.GetEntity(UserConnection, new Guid("e76f59d2-c8ca-4bc1-80fd-0cdf02ab92dc"));

Ещё отловить бы запрос, который уходит в БД, возможно он некорректно формируется.

 

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

Согласно статье https://academy.terrasoft.ru/documents/technic-sdk/7-16/klass-entityschemaquery-rabota-s-filtrami можно подключать и отключать фильтры и далее считывать уже разные отфильтрованные данные

var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Испания");
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Франция");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.getEntityCollection(function (result) {
    if (result.success) {
        result.collection.each(function (item) {
            // Обработка элементов коллекции.
        });
    }
}, this);
 
// Для второго фильтра указывается, что он не будет участвовать в построении результирующего запроса.
// При этом данный фильтр не удаляется из коллекции фильтров запроса.
esqSecondFilter.isEnabled = false;
 
esq.getEntityCollection(function (result) {
    if (result.success) {
        result.collection.each(function (item) {
            // Обработка элементов коллекции.
        });
    }
}, this);

Решил сделать так же

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "KtJasperFullNumberPool"
});
var requestFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
	"KtRequest", this.get("KtRequest").value);
var productFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
	"KtOpportunityProductInterest", this.get("Id"));
esq.filters.add("requestFilter", requestFilter);
esq.filters.add("productFilter", productFilter);
esq.getEntityCollection(function (result) {
	if (result.success) {
		this.set("IsVisibleKtJasperNumbersInKtRequestDetail", result.collection.getItems().length > 0 ? true : false);
	}
}, this);
productFilter.isEnabled = false;
esq.getEntityCollection(function (result) {
	if (result.success) {
		this.set("NumberCounts", result.collection.getItems().length);
	}
}, this);

Но при запуске, когда доходим до второго "esq.getEntityCollection" получаю ошибку "message: Uncaught Terrasoft.ItemAlreadyExistsException: Элемент с ключом "24f2c79e-4a52-457f-9e8e-e24009bb135b" Уже существует"

Как бы не старался, не могу сделать что бы как в примере с ак=ккадемии работало.

Подскажите, что я делаю не так, и что это за элемент что при чтении создается новый?

Нравится

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

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

Литвинко Павел,

 в какую колонку? Может у меня что-то не так?

А что это за GUID «24f2c79e-4a52-457f-9e8e-e24009bb135b»?

Это запись в таблице KtJasperFullNumberPool, Id поля, фильтра или ещё что-то?

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

Доброго времени суток. Появились проблемы с написанием esq запроса. Для бд я его написал, но на esq не получается перенести.

Прикрепленные файлы

Нравится

2 комментария
Лучший ответ

Для правильного построения запроса Вам нужно посмотреть это и это

 

если вкратце, то относительные пути будут примерно такие:

"=[Contract:Account].Number"
"=[Contract:Account].=[NrbTradingPoint:NrbContract].NrbName"

 

 

 

Для правильного построения запроса Вам нужно посмотреть это и это

 

если вкратце, то относительные пути будут примерно такие:

"=[Contract:Account].Number"
"=[Contract:Account].=[NrbTradingPoint:NrbContract].NrbName"

 

 

 

Спасибо

 

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

Добрый день, коллеги!

 

Необходимо добавить в модальное окно количество обращений за промежуток времени с 9-12, 12-15, 15-17 часов на 10 дней.

 

Прилагаю код модального окна.

https://pastebin.com/RP0JvZ8S

Как делать esq запросы и интегрировать в данную схему, чтобы отображалось всё в модальном окне.

Буду очень благодарен любой помощи! 

Нравится

3 комментария
Лучший ответ

Вариантов решения много, мне кажется проще сделать  свое представление в БД  (view) которая бы формировала несколько колонок например 

Дата,

Кол-во обращения поступили с 9 до 12,

Кол-во обращения поступили с 12 до 15,

 

Наложить ваше представления в БД (view) на обїект в конфигурации и выводить в видек грида отфильтровав по диапазону дат...

Для этого необходимо создать в БД представление,  создать в Конфигурации объект, где установить признак для свойства [Представление в БД] Объект в Конфигурации должен иметь такое же название, как и представление в БД.
В системе есть объекты, имя которых начинается на "VW*"

Вариантов решения много, мне кажется проще сделать  свое представление в БД  (view) которая бы формировала несколько колонок например 

Дата,

Кол-во обращения поступили с 9 до 12,

Кол-во обращения поступили с 12 до 15,

 

Наложить ваше представления в БД (view) на обїект в конфигурации и выводить в видек грида отфильтровав по диапазону дат...

Для этого необходимо создать в БД представление,  создать в Конфигурации объект, где установить признак для свойства [Представление в БД] Объект в Конфигурации должен иметь такое же название, как и представление в БД.
В системе есть объекты, имя которых начинается на "VW*"

Как вообще использовать ESQ в странице модального окна (https://pastebin.com/RP0JvZ8S). Чтобы отобразить хоть какой нибудь результат.  GRID создал, VIEW создал. 

Насколько понял, Вы хотите выводить не обычный реестр, а просто набор надписей со значениями. В таком случае программно (при помощи привязанной функции) заполнять их можно как в последнем комментарии тут, а интересующая Вас  информация по работе клиентской ESQ есть в этих статьях.

 

А вообще, вариантов действительно много, в зависимости от того, что хотите увидеть. Может, будет проще вместо модального окна вообще настроить в разделе панель итогов из нескольких показателей, выводящих числа по данным той же view.

 

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

Добрый вечер, коллеги.
Возможно ли с помощью EntitySchemaQuery реализовать запрос:

SELECT Amount - PaidAmount AS DebtAmount
FROM MyTable

?
Спасибо!

Нравится

2 комментария
Лучший ответ

С помощью EntitySchemaQuery подобное реализовать не получится, а вот с помощью Select - легко

 

new Select(connection)
.Column(Column.SourceColumn("Amount") - Column.SourceColumn("PaidAmount")).As("DebtAmount")
.From("MyTable");

 

А зачем вам это делать? вы можете вычитать обе колонки и получить их разницу через EntitySchemaQuery 

С помощью EntitySchemaQuery подобное реализовать не получится, а вот с помощью Select - легко

 

new Select(connection)
.Column(Column.SourceColumn("Amount") - Column.SourceColumn("PaidAmount")).As("DebtAmount")
.From("MyTable");

 

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

Доброго времени суток

Создал замещающую схему для Section base schema ( NUI ) в новом пакете (не Custom). В схеме добавляется фильтр для EntitySchemaQuery через esq.filters.addItem(). Фильтр рабочий, т.к. проверялся на локальной машине с последующим пушем на препрод.

На препроде фильтр не работает. Вероятно, не хватает какой-то генерации или чего-то еще. Но вопрос, чего именно.

Я делал генерацию source code для выбранного файла, в котором прописан скрипт, делал генерацию для модифицированных, в общем, я по очереди делал все виды генераций и после этого компилил. Результата нет.

Нравится

2 комментария
Лучший ответ

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Попробуйте очистить кэш браузера или проверить в другом броузере или в приват моде, проверьте наличие ошибок в консоли браузера

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