Вопрос

Массовая модификация данных через OData

Добрый день.

Есть ли возможность массово поменять значения, например, объединив использование $filter и MERGE? Или единственный вариант по идентификатору?

Цели 2:

1. Действительно массово заменить общее значение на другое

2. Использовать кастомный идентификатор, известный внешней системе, без необходимости каждый раз разрешать его в guid.

Подход "в лоб" вернул ошибку

Query options $select, $expand, $filter, $orderby, $inlinecount, $skip, $skiptoken and $top are not supported by this request method or cannot be applied to the requested resource.

Может, просто синтаксис чуть неверен?

Отправленный запрос (по сути тоже по Id)

curl -X MERGE -H 'Content-Type: application/json;odata=verbose' -H 'Accept: application/atom+xml' -i 'http://terapp-t.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou? eq '\''648dbb58-2aea-578d-e053-2413a8c01794'\' --data '{Name: '\''Other name'\''}'

Нравится

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

Вы уверенны что правильно передали название объекта те что в системе есть объект Accou очень похоже что вы имели ввиду Account (Контрагент) но недокопипастили!

Если хотите получать помощь по ошибке приводите полностью описание ошибки.

В фильтре можно строить условия поиска по любым полям, но быстро и надежно работать именно с Id!

 

Григорий Чех,

 

Спасибо за ответ, но я пока не уверен, что хорошо объяснил свою задачу. Мне бы хотелось получить аналог update Account set Name='New name' where Name='Old Name'; я представляю, как сделать аналог select, но модифицировать могу только по первичному ключу

update Account set Name='New name' where Id='{61402C80-BB18-45FC-89A2-5BBFAC1A53F2}' через AccountCollection(guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2')

 

Мой запрос выглядит так:

curl -X PUT -H 'Accept: application/atom+xml' -H 'Content-Type: application/json;odata=verbose' -i 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'\''61402c80-bb18-45fc-89a2-5bbfac1a53f2'\' --data '{Name: "Other name3"}'

Ответ:

 

    Status Code: 405 Method Not Allowed

    Cache-Control: private

    Content-Length: 1197

    Content-Type: application/xml;charset=utf-8

    DataServiceVersion: 1.0;

    Date: Fri, 21 Sep 2018 10:03:14 GMT

    Server: Microsoft-IIS/8.5

    X-AspNet-Version: 4.0.30319

    X-Content-Type-Options: nosniff

    X-Frame-Options: SAMEORIGIN

    X-Powered-By: ASP.NET

 

<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>4</code><message xml:lang="">The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><innererror><message>The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><type>System.Data.Services.DataServiceException</type><stacktrace>   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;

   в System.Data.Services.DataService`1.HandleRequest()</stacktrace></innererror></error>

По поводу Accou - это валидатор сайта укоротил url, он был перенесен через клипборд прямо из браузера

The URI must point to a single resource for PUT operations!!!

Делайте в два прохода вызовите фильтр и получите коллекцию id пробежитесь по ним и проапдєйтите записи. Или используйте другие механизмы. (БП или кодом вариантов много)

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

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

Это не вариант, ищется generic решение, как заткнуть каждую конкретную дыру, мы и так знаем, но их ожидается неопределенное количество :)

 

Это вариант. Если считаете, что это «дыра» и такое требуется массово, делайте свой универсальный конфигурационный веб-сервис, заточенный под потребности.

Например, в bpm'online loyalty были специальные веб-сервисы и их методы для чтения, добавления, изменения контактов, карт, покупок и прочих сущностей. В любом случае специализированная логика будет работать быстрее стандартной, которая будет гонять тысячу Id туда и обратно, а потом тысячу раз обновлять по одной записи.

Итого ответ на 21.09.2018 такой:

указанная функциональность включена в OData V4.01, поэтому ожидать ее в bpm'online в ближайшее время бессмысленно; нужно искать обходные решения.

Начать искать можно с комментариев выше этого ^.

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

 спасибо, но как я уже написал, это не подходящий нам вариант по причине ограниченности типов входных параметров и, как следствие, необходимости либо выполнения серьезных трансформаций на уровне сервреа bpm'online, либо разработки многочисленных частных решений.

В текстовом параметре можно сериализировать какие угодно значения тем же JSON. Или передавать команды с любой разметкой, хоть прямо слать SQL-запросы (но это очень небезопасно, лучше так не делать).

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

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