【问题标题】:Acumatica API PO insert errorsAcumatica API PO 插入错误
【发布时间】:2019-02-23 04:53:09
【问题描述】:

我在使用 API 插入采购订单时遇到了很多问题,因为它经常以模糊或无法正确识别原因的错误响应。我们对所涉及的站点进行了很多自定义,因此为了缩小问题范围,我创建了一个新的干净的 Acumatica ERP 安装 (v17.210.0034) 来使用,没有端点扩展,并在两者中都安装了 SalesDemo 数据。

即使有像这样干净的安装站点,我在尝试插入 PO 时仍然会遇到模糊的错误。例如,我按照以下步骤,使用 Postman 调用 API:

  1. 登录:POST 到 url = "http://localhost/Acu172100034/entity/auth/login,正文中包含 JSON 凭据。响应 = 成功。
  2. 获取采购订单:url = http://localhost/Acu172100034/entity/Default/17.200.001/PurchaseOrder/RO/PO000696?$expand=Details,ShippingInstructions。响应 = PO 的 JSON 数据
  3. 我在上面的 GET 响应中复制了 JSON,并将其粘贴到新的 PUT 请求正文中。我删除了所有“id”、“rowNumber”、“custom”和“files”字段。我删除了标题行和明细行中的“OrderNbr”字段,因为它是采购订单的自动编号字段。
  4. 我尝试使用带有 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


【解决方案1】:

经过多次试验和错误,我能够通过删除“QtyOnReceipts”和“ReceivedAmount”两个字段来额外更改插入的 JSON 来插入 PO。你能明白为什么我在响应中收到的错误对找出错误原因没有任何帮助吗?我什至不知道为什么删除这些字段可以解决错误。执行 API 插入的最可靠方法可能是 - 正如 KRichardson 建议的那样 - 始终首先只插入最少的必填字段,然后对其余字段执行更新。或者,通过反复试验进行大量测试,以确定哪些字段和值允许成功插入。如果我要更改或添加 JSON 中的字段值,或者使用来自不同记录的 JSON,我无法真正相信我为使其正常工作所做的更改将始终有效。

【讨论】:

  • 我没有这些字段并出现错误,您可以发布您的测试 JSON 吗? RecievedAmount (CuryReceivedCost) 被标记为过时,并且 QtyOnReceipts (ReceivedQty) 在 UI 上是只读的,用于计算采购订单行,所以我可以看到这些在设置时会出错。您可以在插入时编写验证以确保数据进入并在您的代码中正确返回?无论如何,这对于验证对 POOrderEntry 图或 Web 服务端点的任何更改可能都很方便。
  • 我确实有一个验证来确保插入/更新成功。问题是构建一个会成功的通用插入/更新。我正在尝试插入最少的字段,然后执行更新方法,但是更新不起作用。我假设它不会让你在没有孩子的情况下进行插入,然后在有孩子的情况下进行更新,也许?我不知道,因为错误告诉我没有任何用处。
  • 事实证明,自定义导致我输入的一些调试代码出现最新错误。删除该错误后,带有子字段的最小字段起作用。所以我回到总是为插入做一个最小的字段,然后是更新。不是一种可靠的事务实践,但在使用 API 时我没有太多选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2020-11-24
  • 2021-03-05
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多