【发布时间】:2019-02-23 04:53:09
【问题描述】:
我在使用 API 插入采购订单时遇到了很多问题,因为它经常以模糊或无法正确识别原因的错误响应。我们对所涉及的站点进行了很多自定义,因此为了缩小问题范围,我创建了一个新的干净的 Acumatica ERP 安装 (v17.210.0034) 来使用,没有端点扩展,并在两者中都安装了 SalesDemo 数据。
即使有像这样干净的安装站点,我在尝试插入 PO 时仍然会遇到模糊的错误。例如,我按照以下步骤,使用 Postman 调用 API:
- 登录:POST 到 url = "http://localhost/Acu172100034/entity/auth/login,正文中包含 JSON 凭据。响应 = 成功。
- 获取采购订单:url = http://localhost/Acu172100034/entity/Default/17.200.001/PurchaseOrder/RO/PO000696?$expand=Details,ShippingInstructions。响应 = PO 的 JSON 数据
- 我在上面的 GET 响应中复制了 JSON,并将其粘贴到新的 PUT 请求正文中。我删除了所有“id”、“rowNumber”、“custom”和“files”字段。我删除了标题行和明细行中的“OrderNbr”字段,因为它是采购订单的自动编号字段。
- 我尝试使用带有 PUT 的修改后的 JSON 插入新 PO:url = http://localhost/Acu172100034/entity/Default/17.200.001/PurchaseOrder,
错误响应包括:“PX.Data.PXException: 错误: 'Branch' 不能为空。\r\n错误: 'Ship To' 不能为空。\r\n错误: 'Location' 在系统。\r\n ---> PX.Data.PXOuterException: 错误: 插入“采购订单”记录引发了至少一个错误。请查看错误。"
在采购订单行上指定了一个 BranchID,在采购订单标题上指定了一个位置,在 ShippingInstructions 上指定了一个 ShipTo。位置确实存在。这个错误显然是模糊和误导的。只有通过反复试验,我才确定我需要将 Hold 从 true 更改为 false 以克服这个错误。我认为这是因为有一些验证或规则在暂停时不允许插入或更新?在将 Hold 更改为 false 并再次尝试使用 PUT 插入后,我收到错误消息:“PX.Data.PXException:错误:处理字段 InventoryID 期间发生错误:对象引用未设置为对象的实例。 . ---> System.NullReferenceException:对象引用未设置为对象的实例。”并且调用堆栈包括 POOrderEntry.POLine_ExpenseAcctID_FieldDefaulting 和 POOrderEntry.POLine_LineType_FieldUpdated 事件处理程序。
订单行上有一个 InventoryID,并且库存项目存在,所以看起来这些事件处理程序在设置 LineType 时出于某种原因抛出错误,但我猜。任何想法如何让这个简单的 API 插入工作?
更新(2/23/19):我修改了 JSON 以进行更多插入,将详细项目 Completed 更改为“false”,并将 PO 标头 Hold 更改为“true”,并且状态为“暂停”。上面提到的错误现在更改为“错误:'UOM' 不能为空。\r\n错误:'Account' 不能为空。\r\n错误:'Sub.'不能为空。”。 UOM不为空,Account为空,SubAccount为空;但客户和子客户不是采购订单行的必填字段。
【问题讨论】:
-
我浏览了您的示例并看到了同样的问题。我查看了代码,发现这是由于字段默认,在某些设置字段上出错,即获取运营商。我删除了详细信息并收到其他字段的错误。我能够将其插入搁置状态,然后使用返回的 OrderNbr 进行快速放置,并将 Hold 设置为 false,然后它就通过了。试试这个解决方法,但我不确定其他人是否对为什么这些没有设置有任何意见?
-
KRichardson,如果您指定相同的 OrderNbr,那么它的行为就像更新而不是插入。我也可以更新工作。
-
解决方法是插入为保持状态,然后获取返回的 OrderNbr,然后执行第二个调用,这将是一个更新。由于第二次通话/更新,这能够让我的 PO 创建并准备好被批准暂停。
-
KRichardson,如果您的意思是只为插入提供必填字段并 Hold=true,那么执行更新,是的,这可能会起作用。
标签: acumatica