Acumatica 更新DAC';值的正确方法是什么;是否通过PXResultset检索到?

Acumatica 更新DAC';值的正确方法是什么;是否通过PXResultset检索到?,acumatica,Acumatica,我们的业务要求是,如果可能,将SO退货成本设置为未开具发票的原始成本。我们确定销售订单是跟踪向客户发放材料所必需的,我们是成本驱动的,而不是价格驱动的。我们使用先进先出成本法,但退货订单似乎不会以原始成本退货,除非开具发票(我们也不会以传统方式这样做) 我发现在确认装运和更新之前,直接在数据库中设置SO装运行上的单位/外部成本似乎可以提供所需的结果。应用自定义菜单选项来简化并强烈控制返回,我克隆了附近的代码作为基础。===之间的部分是我设置单位/外部成本的地方。PXTrace显示了预期值,但在发

我们的业务要求是,如果可能,将SO退货成本设置为未开具发票的原始成本。我们确定销售订单是跟踪向客户发放材料所必需的,我们是成本驱动的,而不是价格驱动的。我们使用先进先出成本法,但退货订单似乎不会以原始成本退货,除非开具发票(我们也不会以传统方式这样做)

我发现在确认装运和更新之前,直接在数据库中设置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();
}
使用(var ts=new PXTransactionScope())
{
PXTimeStampScope.SetRecordComesFirst(typeof(SOOrder),true);
//提醒-soshipmentry docgraph=PXGraph.CreateInstance();
createShipping(订单、站点ID、filter.ShipDate、adapter.MassProcess、SOOperation.receive、created、adapter.QuickProcessFlow);
PXTrace.WriteError(“设置成本”);
//将装运成本设置为SO行的成本
PXResultset结果=
PXSelectJoin
.选择(docgraph,docgraph.Document.Current.ShipmentNbr);
PXTrace.WriteError(“发货{0}-记录{1}”,docgraph.Document.Current.ShipmentNbr,results.Count);
foreach(结果中的PXResult记录)
{
SoShipping Shipping=(SoShipping)记录;
SOShipLine shipmentLine=(SOShipLine)记录;
索林索林=(索林)记录;
==============================================
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=新列表{order};
PXAutomation.RemovePersisted(docgraph、typeof(SOOrder)、items);
PXAutomation.RemoveProcessing(docgraph,typeof(SOOrder),items);
ts.完成();
}

仍在学习过程中,因此我希望解决方案对更有经验的人来说可能简单明了。

有三个阶段:

  • 更改值
  • 更新缓存
  • 持久化缓存
  • 我认为你在改变价值观,但不是坚持它。调用Confirm shipping或Update IN action后它工作的原因可能是这些操作将通过调用graph Save操作来持久化所有更改

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

    DACRecord.Field = value;
    DataView.Update(DACRecord);    
    
    您的示例的特殊性在于请求未绑定到数据视图。 当您有一个松散的BQL请求时,您可以对缓存对象执行相同的操作。在您的示例中,缓存上下文可从docGraph获得:

    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);
    
    cache.SetValue(daccrecord,fieldValue);
    
    或在更改字段值时要触发框架事件(如FieldUpdate)时使用SetValueExt:

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

    如果您希望更改保持不变而不需要用户手动保存文档,则还必须在缓存中更新并保留这些更改。

    有三个阶段:

  • 更改值
  • 更新缓存
  • 持久化缓存
  • 我认为你在改变价值观,但不是坚持它。调用Confirm shipping或Update IN action后它工作的原因可能是这些操作将通过调用graph Save操作来持久化所有更改

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

    DACRecord.Field = value;
    DataView.Update(DACRecord);    
    
    您的示例的特殊性在于请求未绑定到数据视图。 当您有一个松散的BQL请求时,您可以对缓存对象执行相同的操作。在您的示例中,缓存上下文可从docGraph获得:

    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);
    
    cache.SetValue(daccrecord,fieldValue);
    
    或在更改字段值时要触发框架事件(如FieldUpdate)时使用SetValueExt:

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

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

    非常好的解释。非常感谢您提供的详细信息。我从你的回答中得到了更多的启示,而不仅仅是如何解决我眼前的问题!它就像一个符咒,但我不得不做一个调整。。。Persist需要一个操作作为参数。docgraph.Caches[typeof(SOShipLine)].U