【问题标题】:What is the proper way to update values of DAC's retrieved via PXResultset?更新通过 PXResultset 检索到的 DAC 值的正确方法是什么?
【发布时间】:2019-04-03 21:04:48
【问题描述】:

如果可能,我们有一项业务要求,将 SO 退货 COST 设置为未开票的原始成本。我们确定销售订单对于跟踪向我们的客户发放材料是必要的,而且我们是成本驱动的,而不是价格驱动的。我们使用 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();
}

仍在学习曲线上,所以我希望解决方案对于更有经验的人来说可能简单明了。

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    它分为三个阶段:

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

    我认为你正在改变价值,但没有坚持下去。在调用 Confirm Shipment 或 Update IN 操作后它起作用的原因可能是这些操作将通过调用图形 Save 操作来保留所有更改。

    要更改数据视图中的字段值,您可以:

    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);
    

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

    【讨论】:

    • 很好的解释。非常感谢您提供的详细程度。我从你的回答中得到了更多的启发,而不仅仅是如何解决我眼前的问题!它就像一个魅力,但我必须做出一个调整......坚持者需要一个操作作为论据。 docgraph.Caches[typeof(SOShipLine)].Update(shipmentLine); docgraph.Caches[typeof(SOShipLine)].Persist(PXDBOperation.Update);
    • 是的,你是对的,我更新了我的答案以包含它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多