Массовое изменение поля для карточек Контакта, выбранных по фильтру
Коллеги, добрый день.
Есть такая задача: на карточке клиента есть поле (к примеру Ответственный), которое нужно менять массово по нескольким карточками (количество неограниченно, может быть и по 100-200). Клиенты, по которым нужно поменять поле, выбираются с применением фильтра - настраивается динамический список. Как можно поменять массово это поля по нажатию на кнопку/действие, без необходимости выделения клиентов по отдельности. Может кто сталкивался с такой задачей?
В SDK нашел решение очень похожего кейса, только там, чтобы поменять нужно выделить те записи, по которым надо поменять. В нашем же случае, нужно просто настроить динамический список и по всем клиентам, входящим в список, поменять поле. Так как клиентов может быть больше 100, то вариант с выделением клиентов через массовое выделение не подходит. Ну либо нужна функциональность действия "Выделить все записи".
С уважением,
Дмитрий
Нравится
Здравствуйте!
Попробуйте реализовать это процессом.
Используйте элемент "Изменить данные" для:
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 и загрузила на прод.
Надеюсь, кому-то решение поможет в будущем быстро решить проблему.