尝试在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。这行得通,但是我仍然不知道是什么试图将其清空,因为调用堆栈只是告诉我它的外部代码。无论如何,现在错误是“'Operation'不能为空”。我想我会保留默认字段并从错误中覆盖设置器,直到我用完字段-或耐心。
答案 0 :(得分:0)
我终于通过继续一个接一个地解决字段错误直到问题持续存在,终于解决了该问题。我还必须设置SOLine字段Operation,LineType和AutoCreateissueLine。如果您想知道为什么我要尝试使用单独的视图,那是出于性能原因。我有一个自定义页面,该页面处理EDI数据并使用SOLines创建SO。现有的视图可能需要数百分钟才能花费很多分钟。到目前为止,简化视图已将其缩减到一分钟或更短的时间。