Невозможно создать уровни цен продукта при создании уровня цен. - PullRequest
7 голосов
/ 11 июня 2019

Я пытаюсь создать объект уровня цен в Dynamics CRM через API.

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

Я следую этому руководству.

Это ссылка на тип сущности уровня цен.

Для ценовых уровней товара существует ценное свойство навигации, называемое price_level_product_price_levels

Если я буду следовать учебнику, мне нужно составить следующий запрос

[POST] /pricelevels

Заголовки авторизации установлены правильно, а тело контента:

{
    "name": "MA - 2019W24",
    "paymentmethodcode": 1,
    "price_level_product_price_levels": [{
            "quantitysellingcode": 1,
            "amount": 89,
            "amount_base": 89,
            "pricingmethodcode": 1,
            "productid@odata.bind": "/products(ef43bf1f-e605-e911-a818-000d3a2cd4e8)",
            "uomid@odata.bind": "/uoms(942b3c4c-e405-e911-a818-000d3a2cd4e8)"
        }
    ]
}

Сообщение об ошибке в ответе:

уровень цен с Id = c0184273-ed8c-e911-a83b-000d3a2dd73b не Существовать

UUID меняется с каждым запросом. Трассировка стека, включенная в ответ:

at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.CreateInternal(Entity entity, InvocationContext invocationContext, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, Dictionary`2 optionalParameters)
at Microsoft.Crm.Extensibility.OData.CrmODataExecutionContext.CreateOrganizationResponse(Entity entity)
at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.CreateEdmEntity(CrmODataExecutionContext context, String edmEntityName, EdmEntityObject entityObject, Boolean isUpsert)
at Microsoft.Crm.Extensibility.OData.EntityController.PostEntitySetImplementation(String& entitySetName, EdmEntityObject entityObject)
at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 func, IEnumerable`1 additionalCustomProperties)
at Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger logger, XrmTelemetryActivityType activityType, Func`1 func)
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

Я проверил свойства навигации для объекта счета и уровня цен. В учетной записи указаны связанные свойства, а price_level_product_price_levels является ссылочным свойством.

Если я попытаюсь выполнить учебный запрос по первой ссылке, он сработает.

Массовое создание уровней цен продукта не поддерживается в Dynamics CRM.

Я уже пробовал пакетные действия, но потому что я с Java и использую google-http-api. Мне довольно сложно выполнить сложный и конкретный контракт на пакетное действие. Также информация о таком решении действительно ограничена.

Моя цель - создать как минимум все уровни цен на продукты в рамках одного запроса. Потому что в противном случае мне может потребоваться выполнить 20 запросов, которые создают уровни цен на продукты в crm.

1 Ответ

1 голос
/ 14 июня 2019

Дозировочные работы.Хотя я согласен, что это не очень прямолинейно.

https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/webapi/execute-batch-operations-using-web-api

Вот измененный отрывок (обратите внимание, я использую JavaScript, а не Java, но должно быть легкоконвертировать).

var payload1 = {
    "name": "NEW - 01",
    "paymentmethodcode": 1,
    "pricelevelid": "7e3876b5-9066-4df4-9bb5-5cf276ccbad7"
};

var payload2 = {
    "pricelevelid@odata.bind": "/pricelevels(7e3876b5-9066-4df4-9bb5-5cf276ccbad7)",
    "productid@odata.bind": "/products(7687b3fb-b48e-e911-a82b-000d3a112148)",
    "uomid@odata.bind": "/uoms(43e8aed3-5631-4ee2-9cea-093637817cbb)"
};

var headers = {
  'Content-Type': 'multipart/mixed;boundary=batch_123456',
  'Accept': 'application/json',
  'Odata-MaxVersion': '4.0',
  'Odata-Version': '4.0'
};

var data=[]
data.push('--batch_123456');
data.push('Content-Type: multipart/mixed;boundary=changeset_BBB456');
data.push('');
data.push("--changeset_BBB456");
data.push("Content-Type: application/http");
data.push("Content-Transfer-Encoding:binary");
data.push("Content-ID: 1");
data.push('');
data.push('POST /api/data/v9.0/pricelevels HTTP/1.1');
data.push('Content-Type:application/json;type=entry');
data.push('');
data.push(JSON.stringify(payload1));
data.push("--changeset_BBB456");
data.push("Content-Type: application/http");
data.push("Content-Transfer-Encoding:binary");
data.push("Content-ID: 2");
data.push('');
data.push('POST /api/data/v9.0/productpricelevels HTTP/1.1');
data.push('Content-Type:application/json;type=entry');
data.push('');
data.push(JSON.stringify(payload2));
data.push('--changeset_BBB456--');
data.push('');
data.push('--batch_123456');


var payload = data.join('\r\n');

$.ajax({method:"POST",url:"/api/data/v9.0/$batch", data:payload, headers: headers });
...