Добрый час суток!

Немного не могу понять как построить запрос на UPDATE в мобильном приложении.

Например я хочу сделать такой запрос SQL

UPDATE TEST SET IsChecked = 1 WHERE Question = '' and Answer = ''

Я делаю так:

        var filters = Ext.create("Terrasoft.Filter", {

                type: Terrasoft.FilterTypes.Group,

                logicalOperation: Terrasoft.FilterLogicalOperations.And

            });

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Question ",

                value: multiAnswerId // тут Id Question (для фильтра как выше)

        }));

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Answer ",

                value: answerVariantId // тут Id Answer(для фильтра как выше)

        }));

        var sql = Terrasoft.Sql.UpdateBuilder.build({

                model: "Test", //Таблица в которую хочу сделать запрос

                queryConfig: queryConfig, //что это ?

                record: record, // что это?

                filter: filters,// это у меня есть

                includeOnlyModifiedColumns: true // что это?

        });

        sqls.push(sql);

        

Подскажите пожалуйста,как мне в мой обьект который я бросаю (var sql = ...) добавить по сути SET IsChecked =1 ? Ведь фильтры я уже сделал,а как сформировать немного не пойму.. может мне даже QueryConfig и includeOnlyModifiedColumns вообще ну нужны ? и достаточно как то константами сделать ? Спасибо заранее!

Нравится

12 комментариев

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

Вот пример фильтрации и перебора:

// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

Вот пример изменения и сохранения записи (но новой, а не существующей):

var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

 

А,разобрался,засейвить забыл. Спасибо,но результат тот же что и при обычном выполнении синхронизация с освновной базой  не работает. Вот полный код:

var store = Ext.create('Terrasoft.store.BaseStore', {

            model: 'SuInterviewAnswerChoice'

        });

        var queryConfig = Ext.create('Terrasoft.QueryConfig', {

            columns: ['SuInterviewQuestion', 'SuAnswer', 'SuIsChecked'],

            modelName: 'SuInterviewAnswerChoice'

        });

        

        store.loadPage(1, {

            queryConfig: queryConfig,

            filters: Ext.create('Terrasoft.Filter', {

                property: 'SuInterviewQuestion',

                value: multiAnswerId

            }),

            callback: function(records, operation, success) {

                for(var i =0; i<records.length;i++){

                    if(records[i].data.SuAnswer === answerVariantId){

                        var isChecked = records[i].get('SuIsChecked');

                        if(!isChecked){

                            records[i].set('SuIsChecked',true);

                            records[i].save({

                                success: function() {

                                    console.log('Successfully');

                                },

                                failure: function(exception) {

                                    Terrasoft.MessageBox.showException(exception);

                                },

                                queryConfig: Ext.create('Terrasoft.QueryConfig', {

                                    modelName: records[i].self.modelName,

                                    columns: ['SuIsChecked']

                                })

                            }, this);

                            return;

                        }

                    }

                    

                }

            },

            scope: this

        });

 

 

Вероятно, при синхронизации система не видит, что запись менялась. Проверьте, меняет ли эта логика поле с датой изменения. И что будет, если его менять.

Зверев Александр,

да,меняет. Поле ModifiedOn меняется. Подскажите пожалуйста еще,как правильно написать Insert,спасибо!

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

Зверев Александр пишет:

Вот пример изменения и сохранения записи (но новой, а не существующей):


 
var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

или я так понимаю вот это можно использовать вместо InsertBuilder?

 

Да, лучше вместо InsertBuilder использовать редактирование и сохранение записи.

Зверев Александр,Спасибо

Зверев Александр,

Извиняюсь,подскажите пожалуйста,какая есть возможность в мобильном приложении сделать код синхронным ?  Дело в том,что мне нужно дождаться получения данных из базы,а уже потом с ними делать манипуляции,а код соответственно идет дальше и в колбек заходит уже тогда,когда нужная мне область кода прошла. Спасибо!

Зверев Александр пишет:

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

Вот пример фильтрации и перебора:


 
// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

 

Работайте асинхронно, через callback.

Зверев Александр,

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

Основная логика bpm'online реализуется в веб-версии, мобильная имеет вспомогательное применение, её SDK не настолько подробен и не включает всех возможных сценариев. Если у Вас есть необходимость в какой-то логике, которую не реализовать иначе, можете завести идею, описать там подробно своё пожелание и, возможно, в новых версиях такое реализуют.

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

Всем привет.

Ввиду не внятности документации прошу помощи.

Как составить такой запрос используя 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' 

Собственно запрос выводит дату последней измененной активности по контрагенту.

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

 

 

Нравится

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

Последовский Роман,

А так?

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 &amp;&amp; result.collection.getCount() &gt; 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 &amp;&amp; result.collection.getCount() &gt; 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 &amp;&amp; result.collection.getCount() &gt; 0) {
		result.collection.collection.each(function(item) {
			//some logic
		}, this);
	}
}, this);

 

Варфоломеев Данила,

Памятник поставить мало! Спасибо)

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

Коллеги всем доброго времени суток!

Столкнулся с такой проблемой:

Формируем запрос к БД через ESQ - http://prntscr.com/jj0e03

далее делаем выборку из сформированной коллекции - http://prntscr.com/jj0efz

Однако при выборке вылетает ошибка - http://prntscr.com/jj0et9

Смотрим как сформировался SQL  - http://prntscr.com/jj0fa1

При этом var esqSmsStatus = esq.AddColumn("SmsStatus").Name; равно http://prntscr.com/jj0ka4

Кто с таким сталкивался? Прошу помочь.

Заранее благодарю.

Нравится

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

Недавно вроде отвечал на подобный вопрос. Попробуйте esq.AddColumn("SmsStatus.Id").Name. 

Чисто опытным путём было выяснено, что простые колонки и колонки, до которых можно просто добраться (пример: колонка Status, справочная. добавляем в запрос - esq.AddColumn("Status"). берём в результатах - p.GetTypedColumnValue<Guid>("StatusId") или p.GetTypedColumnValue<string>("StatusName")). Грубо говоря имеет смысл обозначать через Name только сложные пути, а-ля "Lead.QualifiedContact.Department.Name"

Варфоломеев Данила,

Благодарю!

В серверном коде при работе с этой функцией перед Id нет точки:

Page.DataSource.ActiveRow.GetTypedColumnValue&lt;Guid&gt;("AccountId"));

Отображаемое значение справочного поля тоже получается без точки:

entity.GetTypedColumnValue&lt;string&gt;("FacilityName");

 

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

Приветы, помогите как написать запрос на esq или select

SELECT TOP 1000 aa.[Id]

      ,aa.[AddressTypeId]

      ,aa.[Address]

      ,aa.[AccountId]

      ,aa.[SxSubwayStationId]

  FROM [BetaPressBPM].[dbo].[AccountAddress] aa, [BetaPressBPM].[dbo].[Account] a

  aa.AccountId = a.Id and a.Id = 'AcountId_Value' 

  and aa.AddressTypeId='FB7A3F6A-F36B-1410-6F81-1C6F65E50343'

 

Нравится

12 комментариев

Тут зависит от того, где будет писаться запрос: на сервере или у клиента. 

Если у клиента: https://academy.terrasoft.ru/documents/technic-sdk/7-11/ispolzovanie-entityschemaquery-dlya-chteniya-dannyh-iz-bd

Если на сервере: https://academy.terrasoft.ru/documents/technic-sdk/7-11/crud-operacii-na-servere

Для TOP 1000 нужно использовать RowCount на сервере или rowCount на клиенте.

Все остальное достаточно подробно и с примерами описано на академии по ссылкам выше.

Золотарев Артем Андреевич,

Спасибо,

Мы нашли вот такую возможность https://prnt.sc/ix4znc

Покажите пример как сие настроить кодом?? 

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

 

Вот ссылка, где описаны бизнес-правила, создаваемые из кода, а не мастера: https://academy.terrasoft.ua/documents/technic-sdk/7-12/biznes-pravila-i-ih-primenenie Там еще 5 вложенных статей (посмотрите в левой части в содержимом).

Там достаточно подробно описано применение с примерами.

Золотарев Артем Андреевич,

Посмотрел, спасибо. В коде не разобрался как указать что справочник и конкретное значение справочника. И есть вот такая задача (хак нужен):

Дано

 

Есть самописная страница на которую добавлена ссылка из cti panel и вроде как удобно пользователям

 

Найти

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

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

У обычной самописной страницы не получится вызвать визуальный редактор. Мастер разделов работает со связкой Объект-Раздел-Страница. 

Золотарев Артем Андреевич,

Вид адреса у нее

http://practice-clone.local/0/Nui/ViewModule.aspx#CardModuleV2/SxCandid…

подменили все как положено, но из меню <вид> -> <открыть дизайнер страницы>  ничего не открывается, хотя вроде как связка соблюдена

Вероятнее всего страница редактирования не привязана к сущности.

Посмотрите подобный вопрос по ссылке: https://community.terrasoft.ua/questions/registracia-stranicy-redaktirovania-obekta

Там в комментариях достаточно хорошо описали порядок действий.

Золотарев Артем Андреевич,

Да, там не соответствие корневых схем... 

https://prnt.sc/j1pqw3 вот как такое кодом сделать в rules? есть пример

Пример бизнес-правил есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/primer-primeneniya-pravila-filtration, а пути к колонкам пишуться как в EntitySchemaQuery

Золотарев Артем Андреевич,

Угу, спасибо

 

Вот у меня есть БП созданное мастером, такое же нужно перенести на самописную страницу

                "BpDicWorkAddr": {

                    "efe924fb-a8b5-4522-870f-ca545fe50156": {

                    "uId": "efe924fb-a8b5-4522-870f-ca545fe50156",

                    "enabled": true,

                    "removed": false,

                    "ruleType": 1,

                    "baseAttributePatch": "AddressType",

                    "comparisonType": 3,

                    "type": 0,

                    "value": "fb7a3f6a-f36b-1410-6f81-1c6f65e50343",

                    "dataValueType": 10

                    }

                }


 

"efe924fb-a8b5-4522-870f-ca545fe50156" - это наверно произвольное имя, а вот дальше какие гуиды не так очевидно???

QArt,

Не совсем ясно откуда взялся тот код ,который вы предоставили. больше похоже на метаданные бизнес процесса, чем на обьявление бизнес-правила. Что это за информация?

Золотарев Артем Андреевич,

Это бизнес правило, код которого создан мастером, уже разобрался, можно просто уникализировать

efe924fb-a8b5-4522-870f-ca545fe50156, например, efe924fb-a8b5-2222-870f-ca545fe50156 и вставить этот код в другую схему самописной страницы и оно заработало :)

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

Обнаружил некорректное поведение при отправке esq запроса, формируемого на стороне клиента.
Мне необходимо отфильтровать значения, выпадающие в Lookup поле.
Для этого в конфиге лукапа я устанавливаю значение свойству filters, в котором указываю, какие условия должны выполняться (ЛИБО поле не должно равняться определенному значению, ЛИБО поле может быть равно null).
Чтобы выполнялось условие "либо" - я указываю logicalComparisonTypes объекта Terrasoft.FilterGroup равное Terrasoft.LogicalOperatorType.OR (1).
Но фильтрация почему-то происходит, как будто я указываю условие не "либо", а "и".

Проверяю через tcpdump - какой именно запрос летит на сервер после формирования на клиенте, и к моему удивлению в запрос лепится "and" вместо "or".

001

Может кто сталкивался с подобной проблемой на 7.7, 7.8 или 7.10 - подскажите, пожалуйста, как боролись!

Нравится

3 комментария
Terrasoft.createFilterGroup().logicalOperation

возвращает по-умолчанию 0.

Ну собственно да, ответ выше, пишите
var filtersCollection = Terrasoft.createFilterGroup();
filtersCollection.logicalOperation = Terrasoft.LogicalOperatorType.AND;
при создании группы

Спасибо!
По ошибке использовал logicalComparisonTypes вместо logicalOperation

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

7.9.2
По умолчанию в системе насколько я понимаю для объекта SysSettingsValue нет прав даже у Supervisor пользователя, т.к. ESQ-запросом получить ничего невозможно.

Почему такое ограничение введено на эту таблицу ?

Нравится

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

Илья, здравствуйте!

Это системная таблица. Также через ESQ нет возможности получить данные из объекта SysAdminOperationGrantee. Пример получения значения системной настройки с кодом DataServiceQueryTimeout:

Terrasoft.SysSettings.querySysSettings(["DataServiceQueryTimeout"], function(sysSettings) {
	if (!Ext.isEmpty(sysSettings.DataServiceQueryTimeout)) {
		this.dataServiceQueryTimeout = sysSettings.DataServiceQueryTimeout;
	}
}, this);

Причина: значения системных настроек могут отличаться для разных ролей пользователей. По этой причине использовать ESQ не корректно.

Как выяснилось в число "особенных таблиц" так же входит "SysAdminUnitInRole"

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

Добрый день!

Коллеги, подскажите, пожалуйста, какой наиболее корректный способ массово (в цикле) удалять записи в БД с помощью ESQ?

Вариант с foreach:

EntitySchema schemaDeleteEntity =userConnection.EntitySchemaManager.GetInstanceByName(EntityName);
EntitySchemaQuery esqDeleteEntity = new EntitySchemaQuery(schemaDeleteEntity);
esqDeleteEntity.AddAllSchemaColumns();
esqDeleteEntity.Filters.Add(esqDeleteEntity.CreateFilterWithParameters(FilterComparisonType.Equal, AccountIdField, AccountId));
EntityCollection entitiesDeleteEntity = esqDeleteEntity.GetEntityCollection(userConnection);
  foreach (Entity deleteentity in  entitiesDeleteEntity)
  {
      deleteentity.Delete();
  }

возвращает exception "Коллекция была изменена после создания экземпляра перечислителя."

Если заменить на простой for:

for(int i = entitiesDeleteEntity.Count-1;i>=0;i--)
{
        entitiesDeleteEntity[i].Delete();
}

Код отрабатывает корректно, но при нагрузке удаление периодически вызывает exception о незавршённых транзакциях вида:
Данный SqlTransaction завершен; его повторное использование невозможно.   в System.Data.SqlClient.SqlTransaction.ZombieCheck()
   в System.Data.SqlClient.SqlTransaction.Rollback()
   в Terrasoft.Core.DB.DBExecutor.RollbackTransaction()
   в Terrasoft.Core.Entities.Entity.ExecuteDelete(Delete delete, Object keyValue)
   в Terrasoft.Core.Entities.Entity.Delete(Object keyValue)
   в Terrasoft.Core.Entities.Entity.Delete()

Как всё-таки правильнее?

Спасибо!

Нравится

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

Добрый день!
Для массового удаления лучше не использовать EntitySchemaQuery, так как ESQ накладывает права на запрос. Лучше всего использовать либо класс Delete, или же использовать хранимую процедуру.
Единственный случай, когда нужно использовать ESQ - это если вам нужно запускать процессы, которые настроенны на сигнал "удаления записи", но и в этом случае лучше найти альтернативу по запуску доп логики после удаления

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

Во время выполнения запроса:

var select = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "DimensionCustom"
});
select.addColumn("EntitySchemaUId", "EntitySchemaUId");
var levelColumn = select.addColumn("[ForecastDimensionCustom:DimensionCustom:Id].Level");
levelColumn.orderPosition = 1;
levelColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
select.addColumn("[ForecastDimensionCustom:DimensionCustom:Id].Id", "ForecastDimensionId");
select.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL, "[ForecastDimensionCustom:DimensionCustom:Id].ForecastCustom", forecastId));
select.rowCount = 1;
select.getEntityCollection(function(response) {
        if (response.success) {
                var collection = response.collection;
                if (collection && collection.getCount() > 0) {
                        var item = collection.getItems()[0];
                        if (item) {
                                this.set("EntitySchemaUId", item.get("EntitySchemaUId"));
                                this.set("ForecastDimensionId", item.get("ForecastDimensionId"));
                        }
                        if (callback) {
                                callback.call(this);
                        }
                }
        }
}, this);

Получаю Ошибки при исполнении запроса:

Недопустимое имя столбца "DimensionCustomId".
↵Недопустимое имя столбца "ForecastCustomId

Но я никак не могу понять, откуда такие имена колонок взялись - ведь при построении запроса такие колонки не в одной схеме ESQ не указываются.

PS: Объекты ForecastDimensionCustom и DimensionCustom являются копиями базовых объектов из CoreForecast, см.прикрепленные файлы.

Нравится

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

Здравствуйте, Илья.

Проверьте правильность названия колонок в созданных объектах, а так ж в базе данных. Так же переопубликуйте объекты и обновите структуру базы данных.

Для отладки ошибки будет полезным посмотреть какой запрос отправляется в базу данных при помощи Sql server managment studio или же утилиты fiddler2.

А как можно посмотреть запрос через Sql server managment studio ?

"Севостьянов Илья Сергеевич" написал:

А как можно посмотреть запрос через Sql server managment studio ?


В смысле профайлером :)

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

В SDK bpm'online дополнен раздел "Основные сведения для разработки".
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте в чем суть механизма замещения клиентских модулей, а также как

Статьи расположены в разделе "Основные сведения для разработки".

Нравится

Поделиться

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

Добрый день!
Нигде не смог найти информацию по использованию в entitySchemaQuery колонок с группировкой (Group By). Очень часто необходимо получать для отчетов в excel итоговые данные c использованием группировки по клиентам, операторам и т.д.
Буду признателен за информацию по данному вопросу.

Нравится

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

Здравствуйте. Иван!

Непосредственно класс entitySchemaQuery не поддерживает группировку данных.

Альтернативный вариант рассмотрен по ссылке ниже:
http://www.community.terrasoft.ua/forum/topic/7324#comment-31694

Спасибо, очень жаль...

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