Массовое изменение поля для карточек Контакта, выбранных по фильтру

Коллеги, добрый день.

Есть такая задача: на карточке клиента есть поле (к примеру Ответственный), которое нужно менять массово по нескольким карточками (количество неограниченно, может быть и по 100-200). Клиенты, по которым нужно поменять поле, выбираются с применением фильтра - настраивается динамический список. Как можно поменять массово это поля по нажатию на кнопку/действие, без необходимости выделения клиентов по отдельности. Может кто сталкивался с такой задачей?

В SDK нашел решение очень похожего кейса, только там, чтобы поменять нужно выделить те записи, по которым надо поменять. В нашем же случае, нужно просто настроить динамический список и по всем клиентам, входящим в список, поменять поле. Так как клиентов может быть больше 100, то вариант с выделением клиентов через массовое выделение не подходит. Ну либо нужна функциональность действия "Выделить все записи".

С уважением,
Дмитрий

Нравится

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

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

Попробуйте реализовать это процессом.
Используйте элемент "Изменить данные" для:
1) Построения фильтра
2) Задания новых значений полям.

Илья, добрый день!

Проблема в том, что фильтр в процессе настроить нельзя будет. Так как фильтр выбирает пользователь, настраивая динамический список.
То есть он зайдет в реестр карточек Клиентов, выберет клиентов по определенным параметрам и должен нажать кнопку, к примеру, и поменять по всем выбранным записям значение поле.

Это скорее всего нужно будет сделать, усложнив код по кейсу, который описан в SDK, но может кто уже делал похожее и сможет поделиться или есть варианты попроще.

Здравствуйте, Дмитрий.

Самым оптимальным способом реализации данной задачи будет вызов esq из раздела. К примеру, Вы можете в секции раздела добавить кнопку. При нажатии вызывать примерно следующий код:

var filters = this.getFilters();
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
   rootSchemaName: "Имя таблицы"
});
esq.filters.addItem(filters);
esq.addColumn("Name");
esq.execute(function(response){
  // обработка результата выборки
});

Строка var filters = this.getFilters(); вернет все фильтры, примененные к реестру раздела, которые затем применяются к esq.

Вместо Terrasoft.EntitySchemaQuery, Вы также можете воспользоваться Terrasoft.UpdateQuery для изменения записей.

Подскажите, пожалуйста, с чём может быть связано возникновение ошибки 'Collection item with Id "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" not found' при выполнении execute UpdateQuery такого вида:

var update = Ext.create("Terrasoft.UpdateQuery", {
rootSchemaName: "BTSampInShipment"
});
update.setParameterValue("BTStatus", "5f382609-a175-411c-a603-7507a050214a", Terrasoft.DataValueType.GUID);
update.setParameterValue("BTSampleStatus", "24807e44-e2c6-4af3-b61a-00e1e0b4629d", Terrasoft.DataValueType.GUID);
update.filters.addItem(update.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", result1.collection.getByIndex(0).get("Id")));

Значение поля "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" в самом update не фигурирует.

Где можно посмотреть откуда 'ноги растут'?

Здравствуйте, Алла!

Тяжело предоставить однозначное решение, т.к. сообщение об ошибке может быть косвенно связанным с запросом на обновление.

Самый лучший способ обнаружения проблемы, это провести отладку кода, а также воспользоваться средствами профайлинга http и sql запросов.

Можно попробовать перегенерировать код, после чего выполнить компиляцию и повторить действие.

Если задача по массовому изменению полей постоянная, как у нас, то можно решить ее через вынесение необходимых полей в реестр раздела.
Например, добавляете поле Ответственный в реестр. После этого через фильтры или кнопку Выбрать несколько записей/Выбрать все выделяете нужные записи, затем вносите значение в поле и нажимаете кнопку Сохранить. В результате значение поля Ответственный меняется на новое во всех выделенных записях.

Павел,

"Терещук Павел" написал:

Можно попробовать перегенерировать код, после чего выполнить компиляцию и повторить действие.


Данное решение не помогло устранить ошибку.

Какие есть ещё возможные варианты решения - отладка невозможна, так как мы используем приложение on-demand?

В консоли такой текст ошибок:
1) POST https://[название сайта]/0/DataService/json/SyncReply/UpdateQuery 500 (ItemNotFoundException)

2) Error while sending request
response status: 500 (ItemNotFoundException)
request url: ../DataService/json/SyncReply/UpdateQuery
method: POST
request data: {"rootSchemaName":"BTSampInShipment","operationType":2,"filters":{"items":{"89f74119-40cf-4668-83a5-9ae17d387abd":{"filterType":1,"comparisonType":3,"...

3) Uncaught i {errorCode: "ItemNotFoundException", message: "Collection item with Id "{AC47705B-A2C3-4D04-BBC6-26D7D66DB833}" not found.", stackTrace: undefined, errors: Array(0)}

В продолжении темы...

Описанная выше проблема заключалась в том, что ранее из entity schema была удалена колонка, а потом добавлена повторно новая, но с другим UId. Данная колонка использовалась в бизнес-процессе, который запускался по сигналу изменения записи в этой таблице.

Решение оказалось простым - из тестовой базы выгрузила старый вариант entity schema и загрузила на прод.

Надеюсь, кому-то решение поможет в будущем быстро решить проблему.

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