Acumatica - Ошибка при создании SalesOrder - Вариант / Подэлемент не может быть пустым - REST API - PullRequest
0 голосов
/ 30 октября 2018

В настоящее время я провожу некоторые тесты с использованием Postman с Acumatica REST Api. Я пытаюсь создать заказ на продажу, используя запрос PUT к конечной точке заказа на продажу. Я могу сказать, что достигаю нужной конечной точки и начинаю создавать заказ на продажу, но я получаю сообщение об ошибке, что подэлемент не может быть пустым, даже если я пытаюсь передать ему значение. Вот тело моего запроса PUT:

{
    "OrderType" : {value: "QT"},
    "CustomerID" : {value: 300000014},
    "Details" : 
    [
        {
            "InventoryID" : {"value" : "001"},
            "Subitem" : {"value" : "U"},
            "Quantity": {"value" : 1}
        },
        {
            "InventoryID" : {"value" : "002"},
            "Subitem" : {"value" : "U"},
            "Quantity": {"value" : 3}
        }
    ]
}

И это ошибка, которую я получаю:

{
    "message": "An error has occurred.",
    "exceptionMessage": "PX.Data.PXException: Error: 'Subitem' cannot be empty.\r\n ---> PX.Data.PXOuterException: Error: Inserting  'Sales Order Line' record raised at least one error. Please review the errors.\r\n   at PX.Data.PXUIFieldAttribute.CommandPreparing(PXCache sender, PXCommandPreparingEventArgs e)\r\n   at PX.Data.PXCache.OnCommandPreparing(String name, Object row, Object value, PXDBOperation operation, Type table, FieldDescription& description)\r\n   at PX.Data.PXCache`1.PersistInserted(Object row)\r\n   at PX.Data.PXCache`1.Persist(PXDBOperation operation)\r\n   at PX.Data.PXGraph.Persist(Type cacheType, PXDBOperation operation)\r\n   at PX.Data.PXGraph.Persist()\r\n   at PX.Objects.SO.SOOrderEntry.Persist()\r\n   at SuperiorText.SOOrderEntryExt.Persist(PersistDelegate baseMethod) in C:\\Users\\csilva\\Source\\Repos\\SuperiorText\\SuperiorText\\SOOrderEntryExt.cs:line 23\r\n   at PX.Data.PXSave`1.<Handler>d__2.MoveNext()\r\n   at PX.Data.PXAction`1.<Press>d__31.MoveNext()\r\n   at PX.Data.PXAction`1.<Press>d__31.MoveNext()\r\n   at PX.Api.SyImportProcessor.SyStep.a(Object A_0, PXFilterRow[] A_1, PXFilterRow[] A_2)\r\n   at PX.Api.SyImportProcessor.ExportTableHelper.ExportTable()\r\n   --- End of inner exception stack trace ---",
    "exceptionType": "PX.Api.ContractBased.OutcomeEntityHasErrorsException",
    "stackTrace": "   at PX.Api.ContractBased.EntityService.GetOperationResult(EntityImpl entity, EntityExportContextBuilder entityExportContextBuilder, PXSYTable exportedKeys, List`1 errors)\r\n   at PX.Api.ContractBased.EntityService.Put(ISystemContract systemContract, String version, String name, EntityImpl entity, CbOperationContext operationContext)\r\n   at PX.Api.ContractBased.Soap.EntityGateBase.PutImpl(EntityImpl entity)\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}

Я пробовал варианты как ключа подпункта (например, «Subitem», «SubItemID» и «Variant»), так и пробовал в качестве значения целые числа и строки (например, «U», 0). Мне пока не повезло.

Как правильно настроить таргетинг и назначить значение подэлемента для позиции в заказе клиента? А также, есть ли хорошая документация для этого где-нибудь? Те, с которыми я сталкивался до сих пор, не были достаточно полными в этом отношении.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Понял, надеюсь, эта информация поможет всем, кто окажется в подобной ситуации.

Как указал @HB_ACUMATIA, конечная точка Acumatica по умолчанию 6.00.001 не включает в себя функциональность, позволяющую по какой-либо причине назначать поле Subitem. Таким образом, расширение Default является тем, что заставило это работать. Вот изображение, которое должно объяснить, что делать: enter image description here

Просто нужно перейти на страницу Конечные точки веб-службы (Система> Интеграция> Конечные точки веб-службы), выбрать значение по умолчанию и расширить его. Я назвал мой CustomDefault. Затем найдите страницу для изменения (в данном случае SalesOrder), а затем поле (Подробности). На вкладке «Поля» вы можете добавить новое поле, присвоить ему имя, которое вы хотите, и указать его на сопоставленном поле, которое вы хотите указать («Подэлемент», сопоставленный с Variant в моем случае).

Затем измените HTTP-запрос, чтобы настроить таргетинг на эту новую конечную точку (в моем случае бит между именем моей компании и / entity / изменился с (W (бла)) на (W (8)), поэтому обязательно сохраняйте глаз для этого открыт) http://localhost/YourCompany/(W(8))/entity/CustomDefault/6.00.001/SalesOrder

Сначала казалось, что это не имеет значения, но через несколько минут адрес или запрос начали корректно обрабатываться, и теперь я могу отправлять заказы на продажу через REST API.

Как последний пример, тело моего запроса PUT по-прежнему выглядит следующим образом:

{
    "OrderType" : {"value": "SO"},
    "CustomerID" : {"value": "300000014"},
    "Details" : 
    [
        {
            "InventoryID" : {"value" : "EXAMPLEPRODUCT"},
            "Subitem" : {"value" : "U"},
            "Quantity": {"value" : 3}
        }
    ]
}
0 голосов
/ 30 октября 2018

EDIT:

Кажется, это ошибка в конечной точке 6.00.001.

При попытке с этой конечной точкой URL 6.00.001 происходит сбой: http://localhost/xxxyyyzzz/entity/Default/6.00.001/SalesOrder/

С конечной точкой 17.200.001 это успешно: http://localhost/xxxyyyzzz/entity/Default/17.200.001/SalesOrder/


Наиболее очевидным объяснением может быть то, что, поскольку подэлемент 'U' не существует для элемента '001' / '002', он получает значение NULL при выполнении проверки.

Вы можете быстро убедиться в этом, перейдя на экран «Заказ на продажу» и выполнив следующие действия:

  1. Вставьте одну новую запись во вкладку «Сведения о документе».
  2. Выберите ID инвентаря для вашего элемента '001' / '002'
  3. Нажмите на поле подпункта (отображается только в том случае, если активировано в лицензии)
  4. Нажмите клавишу F3

Это отобразит список допустимых значений подпункта во всплывающем окне селектора. Убедитесь, что там есть подпункт 'U' для позиции '001' / '002': enter image description here

Я успешно повторил вызов веб-службы с почтальоном:

{
    "OrderType" : { value: 'SO' },
    "CustomerID" : { value: 'ABARTENDE'},
    "Details" : 
    [
        {
            "InventoryID" : { value : 'AACOMPUT01'},
            "Subitem" : { value : '0'},
            "Quantity": { value : 1}
        },
        {
            "InventoryID" : { value : 'ADMCHARGE'},
            "Subitem" : { value : '0'},
            "Quantity": { value : 2}
        }
    ]
}

Создан новый заказ клиента с двумя позициями. Я не думаю, что ваш JSON плохой, попробуйте дважды проверить свой с моим и получить каждую минуту детали синтаксиса идентичны.

Например, обратите внимание, что значение заключено в кавычки в вашем примере:

"Subitem" : {"value" : "U"}, 

Пока у меня нет:

"Subitem" : {value : "U"}, 
...