我想在标记为 PO(采购到订单)的销售订单中填写采购订单中的 2 个字段(一个来自 SOOrderExt,第二个来自 SOLineExt)。 如何使用处理表格“创建采购订单”(PO.50.50.00) 来执行此操作
您需要覆盖
FindOrCreatePOOrder
图表上的 FindOrCreatePOLine
和 POCreate
。
在FindOrCreatePOOrder
中,新的poOrder还没有在缓存中,它只是一个简单的对象,所以你无法获取它的扩展名。您必须在FindOrCreatePOLine
中为您的新采购订单设置代理。
using PX.Data;
using PX.Objects.CS;
using PX.Objects.PO;
using PX.Objects.SO;
namespace PX.Objects.PO
{
// Acuminator disable once PX1016 ExtensionDoesNotDeclareIsActiveMethod extension should be constantly active
public class POCreateExt : PXGraphExtension<POCreate>
{
private int? AgenceFromSO;
public delegate POOrder FindOrCreatePOOrderDelegate(DocumentList<POOrder> created, POOrder previousOrder,
POFixedDemand demand, SOOrder soorder, POOrderEntry.SOLineSplit3 soline, bool requireSingleProject);
[PXOverride]
public virtual POOrder FindOrCreatePOOrder(DocumentList<POOrder> created, POOrder previousOrder,
POFixedDemand demand, SOOrder soorder, POOrderEntry.SOLineSplit3 soline, bool requireSingleProject,
FindOrCreatePOOrderDelegate baseMethod)
{
var poOrder = baseMethod.Invoke(created, previousOrder, demand, soorder, soline, requireSingleProject);
// Save UsrAgence for FindOrCreatePOLine
var soOrderExt = soorder?.GetExtension<SOOrderExt>();
AgenceFromSO = soOrderExt?.UsrAgence;
return poOrder;
}
public delegate POLine FindOrCreatePOLineDelegate(POOrderEntry docgraph, DocumentList<POLine> ordered,
string orderType,
POFixedDemand demand, POOrderEntry.SOLineSplit3 soline);
[PXOverride]
public virtual POLine FindOrCreatePOLine(POOrderEntry docgraph, DocumentList<POLine> ordered, string orderType,
POFixedDemand demand, POOrderEntry.SOLineSplit3 soline, FindOrCreatePOLineDelegate baseMethod)
{
// Set Agence on header here
var poOrderExt = docgraph.Document.Current.GetExtension<POOrderExt>();
poOrderExt.UsrAgence = AgenceFromSO;
POLine poLine = baseMethod.Invoke(docgraph, ordered, orderType, demand, soline);
SOLine soLineActual = SOLine.PK.Find(docgraph, soline.OrderType, soline.OrderNbr, soline.LineNbr);
SOLineExt soLineExt = soLineActual.GetExtension<SOLineExt>();
if (poLine != null)
{
decimal? price = soLineExt.UsrVendorPrice;
docgraph.Transactions.SetValueExt<POLine.curyUnitCost>(poLine, price);
}
return poLine;
}
}
}