【发布时间】:2019-08-07 03:22:06
【问题描述】:
尝试在 Acumatica 自定义代码中保留 SO 行时出现错误。我创建了一个新的简单 PXGraph 类,它定义了一个用于缓存和持久性的基本 SOLine 视图。很简单:
public PXSelect<SOLine> OrderLines;
在自定义代码中,它通过执行缓存插入在我上面的视图缓存中创建了一些 SO 行:
SOLine newOrderLineItem = lineGraph.OrderLines.Cache.Insert();
然后使用结果行在持久化之前设置其值。添加这些行后,我尝试保留它们。我都试过了:
lineGraph.OrderLines.Cache.Persist(PXDBOperation.Insert);
和:
lineGraph.Actions.PressSave();
并且两者都给出错误。前者说“‘OrderDate’不能为空。”。但是,在执行 Persist 之前,所有行都有一个 OrderDate 值。 StackTrace 显示它在 RowPersisting 事件中被抛出。因此,在 Persist() 调用和默认 RowPersisting 事件(我尚未定义)之间的某个时间,一行的 OrderDate 已设置为 null,但我不知道在哪里。后者表示“'Cross-Reference' 记录引发了至少一个错误”,并且“'Vendor/Customer' 不能为空”。但是,该行的 CustomerID 和 VendorID 不为空,并且都有效。
我可以做些什么来解决这些错误或以不同的方式保留实际有效的行?
v17.209.0028
Persist() 调用栈:
at PX.Data.PXDBDefaultAttribute.RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
at PX.Data.PXCache.OnRowPersisting(Object item, PXDBOperation operation)
at PX.Data.PXCache`1.PersistInserted(Object row)
at PX.Data.PXCache`1.Persist(PXDBOperation operation)
at Aktion.Acumatica.Customizations.EDI.EEdiDocInboundProcess.CreateOrderAndLineItems(EEdiStOrdHed doc, EEdiStOrdHed origDoc)
at Aktion.Acumatica.Customizations.EDI.EEdiDocInboundProcess.CreateSalesOrder(EEdiStOrdHed doc)
更新 (3/16): 所以我只是将 SOLine 子类化为我自己的类并覆盖 OrderDate 属性设置器以将其设置为 null。这行得通,但我仍然不知道是什么试图将其清空,因为调用堆栈只是告诉我它的外部代码。无论如何,现在的错误是“'操作'不能为空。”。我想我会一直使用默认字段并从错误中覆盖设置器,直到我用完字段 - 或耐心。
【问题讨论】:
-
SOLine 的 OrderDate 默认采用 SOOrder 的 OrderDate,这似乎是导致此问题的原因。您有该行的销售订单的数据视图吗?
-
Samvel,SO 的视图是现有 SOOrderEntry 图的 Document 视图,它的订单日期也有值。
-
正如 Samvel Petrosov 提到的,您应该确保查看 SOOrder 并将当前值设置为当前订单。这应该确保在插入期间设置 SOOrder 的 SOLine 默认值。
-
Brendan,正如我已经提到的,我正在使用 SOOrderEntry 图的文档视图。对于 SOLine,我使用自己的视图,因为 SOOrderEntry 的事务视图太慢。我通过继续一一解决字段错误最终解决了这个问题。我会尽快发布更新。
-
我以为您在自己的图表上创建了自己的视图?如果使用 SOOrderEntry 那么您可能只需要将 SOOrder 视图设置为当前。如果您制作自己的图表,您可以为 SOOrder 选择当前。两者都应该自动解决字段值。至于性能,根据需要设置默认值,甚至删除一些属性可能有助于提高性能。我没有这么多次,例如当我不需要该信息时删除引发子查询到其他表的属性。因此,我需要将条目限制在最低限度以获得您的条目。
标签: acumatica