Глубокая вставка в Odata v4 в расширении Business Central AL

Мы создаем расширение в AL для импорта заказов. Для этого вопроса мы упростили наше расширение, чтобы объяснить проблемы, с которыми мы сталкиваемся.

Мы хотели бы импортировать заголовок + строки в Dynamics 365 Business Central.

Для этого у нас есть: - Создана таблица (Заголовок) - Создана таблица (Строки) - Создана страница Type API (Doc) - Создана часть списка (SalesLine)

Сценарий 1

Мы опубликовали страницу DOC и пытаемся отправить запрос на публикацию по этому URL-адресу odata.

POST https://api.businesscentral.dynamics.com/v1.0/{tennant}/Sandbox/ODataV4/Company('CRONUS%20NL')/Doc/ HTTP/1.1
Content-Type: application/json
Authorization: Basic {{username}} {{password}}

{
  "name": "Description",
  "SalesLines" : [{"lineno" : 1000}]
}

Ответ:

{
  "error": {
    "code": "BadRequest",
    "message": "Does not support untyped value in non-open type."
  }
}

Сценарий 2

Когда мы публикуем:

POST https://api.businesscentral.dynamics.com/v1.0/3{tennant}/Sandbox/ODataV4/Company('CRONUS%20NL')/Doc/ HTTP/1.1
Content-Type: application/json
Authorization: Basic {{username}} {{password}}

{
  "name": "Description"
}

Получаем такой ответ:

{
  "@odata.context": "https://api.businesscentral.dynamics.com/v1.0/3ddcca3d-d343-4a06-95f9-f32dbf645199/Sandbox/ODataV4/$metadata#Company('CRONUS%20NL')/Doc/$entity",
  "@odata.etag": "W/\"JzQ0O3BKUzExSUMrQUl4UXFQc2R6V1J1ellvZEttRTJoa2xhanNtV0M0K3Ezajg9MTswMDsn\"",
  "id": 4,
  "name": "Description",
  "DateTime": "2019-05-20T19:33:13.73Z"
}

Я опубликовал наше расширение на GitHub Справка.


person gbierkens    schedule 20.05.2019    source источник


Ответы (1)


Я работал над аналогичным решением и обнаружил, что для его работы необходимы следующие вещи:

  1. part, содержащий ваши строки, должен быть помещен в repeater вашего заголовка Page.
  2. Вы должны установить EntityName и EntitySetName на вашем part на те же значения, что и на реальной странице.
  3. При вызове API необходимо добавить параметр $expand=[EntitySetName of your lines part], например, $expand=orderLines.
  4. В теле JSON имя свойства массива, содержащего строки, должно соответствовать EntitySetName строк part.

Я могу привести несколько примеров, если приведенных выше инструкций недостаточно.

person kaspermoerch    schedule 18.11.2019
comment
Кроме того, OData чувствителен к регистру. По моему опыту, Business Central по умолчанию использует начальный символ нижнего регистра для subpart и игнорирует то, что было установлено в EntityName и EntitySetName, что в этом случае означало бы, что SalesLines станут salesLines. Лучший способ убедиться, какие имена свойств использовать, - это проверить метаданные. - person theschitz; 25.11.2019