我们有一项业务要求,就是将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();
}
仍然保持学习曲线,因此我希望对于经验丰富的人来说,解决方案可能简单明了。
答案 0 :(得分:1)
有三个阶段:
我认为您正在更改值,但没有保留。调用“确认发货”或“更新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);
如果您想要保留更改而不需要用户手动保存文档,则仍然必须更新并保留这些更改在缓存中。