【问题标题】:Export/import Acumatica data contract without API无 API 导出/导入 Acumatica 数据合约
【发布时间】:2018-07-27 14:29:03
【问题描述】:

有没有办法通过序列化或反序列化到/从 JSON 中导出或导入 Acumatica 中的数据,但不使用基于合约的 API?换句话说,我想在同一个 Acumatica 实例中基于数据合同序列化数据(例如库存项目)。这样做的唯一方法是通过 API 调用自身,还是能够在没有 API 的情况下访问 API 执行的查询和序列化?

【问题讨论】:

  • 您能否更具体地说明您的最终目标是什么,这可能有助于我们了解您想要做什么并帮助我们更好地帮助您。
  • 另外,我刚刚发现在 TranStatus 完成时数据行的 RowPersisted 事件中,它还没有提交到数据库。因此,如果我尝试为刚刚“持久”的行访问 API,它不会返回任何内容。
  • samol518,我认为我的问题很清楚。我想以支持的数据合同格式序列化数据,但不使用 API。如果您对细节感兴趣,我只是尝试将数据(例如库存项目和子项)发送到外部队列。到目前为止,我发现的唯一方法是通过 API 命中。如果我尝试按照我之前的评论在 RowPersisted 事件中执行此操作,则该行甚至还没有提交,因此 API 调用甚至不起作用。
  • 在 RowPersisted 中,您是否正在查看事件 args TranStatus == Completed,这应该是在事务提交之后?
  • Brendan,是的,正如我之前所说。我刚刚发现这并不意味着它实际上已经提交了。这一定意味着它即将成为。我什至直接在db中查询,直到离开RowPersisted才出现。

标签: serialization acumatica


【解决方案1】:

完成任务的最简单方法是重写自定义 BLC 或 BLC 扩展中的 Persist() 方法。在基础方法调用之后,您应该通过执行 PXLongOperation.StartOperation() 来启动后台线程,以序列化您要传输的项目并将它们发送到外部服务。

【讨论】:

  • 这正是我最终要做的(覆盖 Persist()),这样我就可以在提交后通过数据合约调用 API 进行序列化。我希望在不使用 API 的情况下有更好的方法,这是我最初的问题。而且我也在异步执行此操作,以便不会延迟持久化。我无法将此标记为对我的问题的回答,但感谢您的意见。
  • Tony,你不需要使用 C-B API 进行数据序列化。您可以通过当前 BLC 中可用的数据视图/缓存或通过 BQL 查询来获取所有必要的数据。据我所知,.Net 有很多不同的选项可以将类对象序列化为 JSON 格式。
  • 当然 API 不是序列化的唯一方法,但它似乎是使用 Acumatica 数据合约而不从头构建 JSON 的唯一方法。我从 IBqlTable 类型的简单序列化开始,但在插入表时无法使用该对象——事件处理程序和它认为无效的有效数据抛出了太多错误,因此它相当无用。然后我曾希望我可以使用 Acumatica 数据合约序列化*实体和子实体,但似乎没有办法,所以我正在使用 API。为了简单的事情做了大量的工作。
  • 新 System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dacObject)
  • HB_ACUMATICA... 你读过我的帖子吗?仅仅序列化一个 DAC 对象不是问题。