更新通过PXResultset检索的DAC值的正确方法是什么?

时间:2018-10-30 18:35:32

标签: acumatica

我们有一项业务要求,就是将SO退货成本设置为原始发出的成本,如果可能的话不要开票。我们确定销售订单对于跟踪向客户发出的物料是必需的,并且我们是成本驱动的,而不是价格驱动的。我们使用FIFO成本核算,但是SO退货订单似乎不会以原始COST退货,除非已开具发票(这也是我们传统上不这样做的方式)。

我发现,在“确认装运和更新IN”之前直接在数据库中的SO装运线上设置单位/附加成本似乎可以提供所需的结果。应用自定义菜单选项来简化并严格控制返回值,我克隆了附近的代码作为基础。 ===之间的部分是我设置单位/附加成本的地方。 PXTrace显示了期望值,但在发货记录中显示为$ 0。我以为可能需要“ docgraph.Update(sOShipmentLine)”来保存它,但是在此范围内无法访问。

using (var ts = new PXTransactionScope())
{
    PXTimeStampScope.SetRecordComesFirst(typeof(SOOrder), true);
    //Reminder - SOShipmentEntry docgraph = PXGraph.CreateInstance<SOShipmentEntry>();
    docgraph.CreateShipment(order, SiteID, filter.ShipDate, adapter.MassProcess, SOOperation.Receipt, created, adapter.QuickProcessFlow);


    PXTrace.WriteError("Setting Cost");
    //Set Cost on Shipment to Cost On SO Line
    PXResultset<SOShipment> results =
                            PXSelectJoin<SOShipment,
                            InnerJoin <SOShipLine, On<SOShipLine.shipmentNbr, Equal<SOShipment.shipmentNbr>>,
                            InnerJoin <SOLine, On<SOLine.orderType, Equal<SOShipLine.origOrderType>,
                                            And<SOLine.orderNbr, Equal<SOShipLine.origOrderNbr>, And<SOLine.lineNbr, Equal<SOShipLine.origLineNbr>>>>
                            >>,
                                Where<SOShipment.shipmentNbr, Equal<Required<SOShipment.shipmentNbr>>>>
                            .Select(docgraph, docgraph.Document.Current.ShipmentNbr);

    PXTrace.WriteError("Shipment {0} - Records {1}", docgraph.Document.Current.ShipmentNbr, results.Count);

    foreach (PXResult<SOShipment, SOShipLine, SOLine> record in results)
    {
        SOShipment shipment = (SOShipment)record;
        SOShipLine shipmentLine = (SOShipLine)record;
        SOLine sOLine = (SOLine)record;
        ==============================================
        shipmentLine.UnitCost = GetReturnUnitCost(sOLine.OrigOrderType, sOLine.OrigOrderNbr, sOLine.OrigLineNbr, sOLine.CuryInfoID);
        shipmentLine.ExtCost = shipmentLine.Qty * shipmentLine.UnitCost;
        PXTrace.WriteError(string.Format("{0} {1}-{2} = {3} / {4}", shipmentLine.LineType, shipmentLine.ShipmentNbr, shipmentLine.LineNbr, shipmentLine.Qty, shipmentLine.UnitCost));
        ==============================================
    }

    PXAutomation.CompleteSimple(docgraph.Document.View);
    var items = new List<object> { order };
    PXAutomation.RemovePersisted(docgraph, typeof(SOOrder), items);
    PXAutomation.RemoveProcessing(docgraph, typeof(SOOrder), items);
    ts.Complete();
}

仍然保持学习曲线,因此我希望对于经验丰富的人来说,解决方案可能简单明了。

1 个答案:

答案 0 :(得分:1)

有三个阶段:

  1. 改变价值
  2. 更新缓存
  3. 持久缓存

我认为您正在更改值,但没有保留。调用“确认发货”或“更新IN”操作后,该方法起作用的原因可能是这些操作将通过调用图形“保存”操作来保留所有更改。

要在数据视图中更改字段值,请执行以下操作:

DACRecord.Field = value;
DataView.Update(DACRecord);    

您的示例的特殊之处在于该请求未绑定到数据视图。 如果您有松散的BQL请求,则可以对缓存对象执行相同的操作。在您的示例中,可以从docGraph获得Caches上下文:

DACRecord.Field = value;
graph.Caches[typeof(DACType)].Update(DACRecord);
graph.Caches[typeof(DACType)].Persist(DACRecord, PXDBOperation.Update);

Update和Persist通常被省略,因为在许多情况下,稍后它们会被其他框架机制调用。例如,如果您只在UI字段上执行“更新”,则在用户单击“保存”按钮之前,记录将不会保留。

在UI上更新值与在缓存中更新有点不同。

UI字段的推荐方法是使用SetValue:

cache.SetValue<DAC.DacField>(DACRecord, fieldValue);

或在更改字段值时要触发诸如FieldUpdated之类的框架事件时,请使用SetValueExt:

cache.SetValueExt<DAC.DacField>(DACRecord, fieldValue);

如果您想要保留更改而不需要用户手动保存文档,则仍然必须更新并保留这些更改在缓存中。