Добрый день, как можно c помощью entitySchemaQuery изменить значение колонки в детали на странице.

Есть страница, и на ней две детали в разных вкладках. Одна деталь - "позиции заказа", другая "Документы по заказу". В деталь "документы по заказу" добавила кнопку, при нажатии на которую, происходит update значения выбранной колонки(сделала через updateQuery по инструкции из документации). В этом же методе с помощью entitySchemaQuery создаю коллекцию с корневой схемой "позиции заказа". При обработке этой коллекции я пытаюсь поменять значение колонки с помощью инструкции this.set("NameColumn",value);

Однако это не работает, и значение колонки не меняется. 

Подскажите, пожалуйста, что я делаю не так и можно ли изменить значение колонки в детали через front-end?

Нравится

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

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

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Добрый день,

Пожалуйста, предоставьте пример entitySchemaQuery, который вы настраиваете.

Viktoriia Hrynchuk,

Ниже код метода, который вызывается при нажатии кнопки. С таким подходом ошибок не возникает, но и значение StatusComponentOrder не проставляется. При отладке коллекция формируется. 

setStatusDetail:function()
{
    /* Получает массив идентификаторов выбранных записей. */
                var selectedRows = this.get("SelectedRows");
                /* Обработка запускается в случае, если выбрана хотя бы одна запись. */
                if (selectedRows.length > 0) {
                    /* Создает экземпляр класса пакетных запросов. */
                    var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
                    /* Обновляет каждую из выбранных записей. */
                    selectedRows.forEach(function(selectedRowId) {
                        /* Создает экземпляр класса UpdateQuery с корневой схемой Activity. */
                        var update = this.Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "DocumentComponent" // DocumentComponent - схема отвечающая за документы по заказу 
                        });
            //Далее я пытаюсь создать ещё одну коллекцию, на основе другой схемы и получить по связям колонку, которую также необходимо обновить, но уже в другой детали.
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",{
                rootSchemaName: "OrderPosition"
            });
            esq.addColumn("StatusComponentOrder","StatusComponent");
            esq.addColumn("RowDocumentComponent.DocumentId","DocMoving"); 
            esq.esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
            "RowDocumentComponent.DocumentId", selectedRowId);
            esq.filters.add("esqFirstFilter",esqFirstFilter);
                esq.getEntityCollection(function(result)
            {
                if(result.success)
                {
                    result.collection.each(function(item)
                    {
                        this.set("StatusComponentOrder",ConstantJS.StatusComponent);
                    }
                    
                )}
            },this);
 
                        /* Применяет фильтр для определения записи для обновления. */
                        update.enablePrimaryColumnFilter(selectedRowId);
                        /* Для колонки [Status] устанавливается значение из файла с константами */
                        update.setParameterValue("Status", "ConstantJS.DocShipped", this.Terrasoft.DataValueType.GUID);
                        /* Добавляет запрос на обновление записи в пакетный запрос. */
                        batchQuery.add(update);
                    }, this);
                    /* Выполняет пакетный запрос к серверу. */
                    batchQuery.execute(function() {
                        /* Обновляет реестр. */
                        this.reloadGridData();
                    }, this);
                }

}

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

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Anhelina,

спасибо за помощь! Помогло)

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

Добрый день!

Появилась идея отправлять уведомление некоторой выборке пользователей. Выборка производится в бизнес процессе в задании - сценарии с помощью ESQ.

Возможно ли из c#-го кода отправить уведомление?

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

Может быть есть способ проще написать метод для отправки такого уведомления?

Нравится

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

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);
Показать все комментарии

Добрый день!

Пытаюсь в элементе задание - сценарий получить доступ к записям базы данных с помощью esq. Однако при попытке опубликовать элемент, валятся ошибки компиляции.

Для примера написала такую строку:  var esq = Ext.create("Terrasoft.EntitySchemaQuery",{rootSchemaName: "Contact"});

Ошибки вылетают такие: expected ),expected }, expected ; , и т.д. в строке var esq.

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

Данные необходимы, чтобы написать бизнес процесс по уведомлению пользователей о всех просроченных счетах.

 

Нравится

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

В задании - сценарий необходимо использовать серверную версию esq и код c#, как коллеги выше же описали. см тут https://academy.terrasoft.ua/docs/8-0/developer/back_end_razrabotka/ope… или в других примерах на сообщесте

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

Я не уверена в правильности использования такой конструкции для элемента задание - сценарий. В руководствах находила два вида написания запросов. Один написан выше, другой выглядит так :

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Имя схемы");.

Такая конструкция ошибок компиляции не дает, но тут возникает сложность с присоединением других схем. Похожих примеров на форуме и в руководствах не нашла.

Не сразу увидел. var esq = Ext.create("Terrasoft.EntitySchemaQuery",{rootSchemaName: "Contact"}); - это код JS. 

В задании - сценарий необходимо использовать серверную версию esq и код c#, как коллеги выше же описали. см тут https://academy.terrasoft.ua/docs/8-0/developer/back_end_razrabotka/ope… или в других примерах на сообщесте

Безуглый Кирилл Александрович, Спасибо за помощь!

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

Добрый день. есть вот такой пример запроса.

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

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

в результате он генерирует следующий SQL запрос который не совсем подходит, так как он возвращает запись которая была возвращена в прошлой выборке (я вытаскиваю данные по 10 записей).

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

пример запроса, который создается

SELECT
       "Contact"."Name" "Name",
       "Contact"."QSoftGSTime" "QSoftGSTime",
       "Contact"."ContactPhoto" "ContactPhoto",
       "Contact"."Phone" "Phone",
       "Contact"."CreatedOn" "CreatedOn",
       COALESCE("SysCityLcz"."Name", "City"."Name") "City.Name"
FROM
       "public"."Contact" "Contact"
       LEFT OUTER JOIN "public"."City" "City" ON ("City"."Id" = "Contact"."CityId")
       LEFT OUTER JOIN "public"."SysCityLcz" "SysCityLcz" ON ("SysCityLcz"."RecordId" = "City"."Id"
       AND "SysCityLcz"."SysCultureId" = '{F0EA9715-8757-474C-AEE9-743D672E48C9}')
WHERE
       "Contact"."CreatedOn" > TO_TIMESTAMP('2023-02-06 21:21:02.149', 'YYYY-MM-DD HH24:MI:SS.FF3')
ORDER BY
       "CreatedOn" ASC NULLS FIRST
LIMIT 10

получается что при выборке данных проверяется только первые три цифры из милисекунд ('2023-02-06 21:21:02.149', 'YYYY-MM-DD HH24:MI:SS.FF3'). в итоге я получаю два раза одну и ту же запись. решение это указывать все 6 цифр милисекунд следующий запрос выполняется корректно и не приводит к дублированию данных

SELECT
       "Contact"."Name" "Name",
       "Contact"."QSoftGSTime" "QSoftGSTime",
       "Contact"."ContactPhoto" "ContactPhoto",
       "Contact"."Phone" "Phone",
       "Contact"."CreatedOn" "CreatedOn",
       COALESCE("SysCityLcz"."Name", "City"."Name") "City.Name"
FROM
       "public"."Contact" "Contact"
       LEFT OUTER JOIN "public"."City" "City" ON ("City"."Id" = "Contact"."CityId")
       LEFT OUTER JOIN "public"."SysCityLcz" "SysCityLcz" ON ("SysCityLcz"."RecordId" = "City"."Id"
       AND "SysCityLcz"."SysCultureId" = '{F0EA9715-8757-474C-AEE9-743D672E48C9}')
WHERE
       "Contact"."CreatedOn" > TO_TIMESTAMP('2023-02-06 21:21:02.149528', 'YYYY-MM-DD HH24:MI:SS.FF6')
ORDER BY
       "CreatedOn" ASC NULLS FIRST
LIMIT 10

я не нашел способа управлять количеством цифр милисекунд в запросе.

можете подсказать как это правильно сделать?

пока что как хак я решил генерировать запрос с помощью EntitySchemaQuery, делать esqResult.GetSelectQuery(_connection), с него получать текст запроса и в нем уже подменять значения с помощью регулярки. но это выглядит костылем, который не хотелось бы оставлять.

 

спасибо!

 

 

 

 

Нравится

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

добавлю, что когда пробовал делать через new Select(connection), то такой проблемы не было, но тогда надо вручную управлять локализацией и делать джоины, чего не хотелось бы делать.

так же регулярное выражение может не работать для других типов БД. в данный момент используется PostgreSql

Добрый день,

 

К сожалению пока возможности управления этим количеством символов нет. Поэтому нужно подумать над альтернативными решениями обхода проблемы - возможно увеличить лимит с 10 записей на большее количество, чтобминимизировать риск ошибки, можно попробовать еще модифицировать фильтр. Возможно поможет добавление сортировки по Id - это сделает порядок записей всегда одинаковым, или просто использовать встроенную постраничность.

а можете подсказать как работать с встроенным механизмом постраничной обработки? пример или ссылка на статью. спасибо!

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

Добрый день, необходимо написать веб сервис на c# и столкнулся с проблемой.

В таблице есть колонка UsrdDislocationId которая ссылается на другую таблицу. у меня есть айди по котрому надо найти запись. на данный момент я написал такой запрос.

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

но при этом я получаю ошибку 

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

если програмно сделать запрос вида 

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

то я получаю такой ответ

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

то есть колонка вроде как есть.

 

в чем может быть проблема? 

 

спасибо!

Нравится

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

1. При работе с ESQ/Entity (в отличие от Select/Insert и т.п.), в фильтрах названия колонок типа справочник указываются без окончания "Id".

2. FetchFromDB, помимо того, что возвращает true/false в зависимости от того, найдена запись в БД или нет, еще и вытягивает все колонки сущности, что является избыточным для простой проверки наличия записи в таблице. 

Лучше тогда уж использовать что-то в этом роде:

var select = (Select) new Select(UserConnection)
    .Column(Func.Count(Column.Asterisk()))
    .From("UsrAdressInCase")
    .Where("UsrdDislocationId").IsEqual(Column.Parameter(usrLookup1));
 
bool exists = select.ExecuteScalar<int>() > 0;

P.S.: 

var exists = contact.FetchFromDB("MobilePhone", phone); - здесь тоже затягивается куча избыточной информации.

Добрый день,

 

Не подскажите, пожалуйста, что именно вы передаете в параметре usrlookup1? Можете также поделиться частью кода там, где мы берем его значение?

 

С уважением,

Дарий

Добрый вечер.

usrLookup1 это Guid.

вот полный код

 

var contactSchema = UserConnection.EntitySchemaManager.FindInstanceByName("Contact");
var contact = contactSchema.CreateEntity(UserConnection);
var exists = contact.FetchFromDB("MobilePhone", phone);
 
if (!exists)
{
    return "1";
}
 
var usrLookup1 = (Guid)contact.GetColumnValue("UsrLookup1Id");
if (usrLookup1 == Guid.Empty)
{
    return "2";
}
 
var usrAddressSchema = UserConnection.EntitySchemaManager.FindInstanceByName("UsrAdressInCase");
 
//return string.Join(",", usrAddressSchema.Columns.Select(c => c.ColumnValueName));
var usrAdressInContact = usrAddressSchema.CreateEntity(UserConnection);
exists = usrAdressInContact.FetchFromDB("UsrdDislocationId", usrLookup1);
 
if (!exists)
{
    return "3";
}

если расскомментировать строку string.Join.... тогда получаю тот результат что выше.

я так же проверял какие колонки находятся в самой БД с помощью SQL запросов и там тоже есть UsrdDislocationId.

1. При работе с ESQ/Entity (в отличие от Select/Insert и т.п.), в фильтрах названия колонок типа справочник указываются без окончания "Id".

2. FetchFromDB, помимо того, что возвращает true/false в зависимости от того, найдена запись в БД или нет, еще и вытягивает все колонки сущности, что является избыточным для простой проверки наличия записи в таблице. 

Лучше тогда уж использовать что-то в этом роде:

var select = (Select) new Select(UserConnection)
    .Column(Func.Count(Column.Asterisk()))
    .From("UsrAdressInCase")
    .Where("UsrdDislocationId").IsEqual(Column.Parameter(usrLookup1));
 
bool exists = select.ExecuteScalar<int>() > 0;

P.S.: 

var exists = contact.FetchFromDB("MobilePhone", phone); - здесь тоже затягивается куча избыточной информации.

Спасибо за ответ.

Некоторые поля мне необходимы в дальнейшем, это был только кусок кода.

Спасибо за замечание №1, я этого не знал.

 

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

Создал новое поле для секции Opportunity, тип - справочник.

Заполнил его, но через EntitySchemaQuery не могу вытащить значение.

Ловлю Exception с сообщением: Value "Usercolumn" was not found.



скрипт:

UserConnection _userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

Guid paramID = new Guid(value.ToString());

var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Opportunity");

 esq.AddAllSchemaColumns();

 esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", paramID));

              

var opportunityCollection = esq.GetEntityCollection(_userConnection);

var result= opportunityCollection[0].GetTypedColumnValue("Usercolumn");//Тут ловлю exception. Сам столбец успешно найден, но значение не цепляется.

В чём может быть проблема?

Нравится

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

Добрый день,

 

Прошу, не используйте AddAllSchemaColumns(), потому что иногда колонок в объекте может быть столько, что каждое обращение к БД запросом, который генерирует ESQ, будет БД "убивать".

 

Касательно exception: Вы в коде так и указали <sGuid> или это опечатка?

Oleg Drobina,

С первым замечанием понятно. Обычно делаю так:

esq.AddColumn("Usercolumn");

Все колонки вытаскивал, чтобы проверить есть ли там Usercolumn - она там есть.



Да, это опечатка. В коде - Guid. Прошу прощения.

Решение проблемы следующее:

этот Usercolumn - был типом Lookup. А значит вытаскивать его надо через Id.

- esq.AddColumn("Usercolumn.Id");

- opportunityCollection[0].GetTypedColumnValue<Guid>("Usercolumn.Id")

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

Добрый день. У меня в таблице 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 тыс одним запросом, поэтому было решено ограничить , брав только первую запись из выборки , каким образом это можно сделать. (это не бизнес процесс)

 

Нравится

7 комментариев
var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, &lt;SchemaName&gt;);
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, &lt;FieldName&gt;, 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.RowCount = 1; // 20_000 - максимальный лимит

 

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

Добрый день,  коллеги. Помогите пожалуйста сделать 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"));

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

 

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