如何修改Create Purchase Order代码以保留Sales Order同Inventory ID多行结构?
解决Sales Order转Purchase Order时保留多行结构的问题
我之前在Acumatica中处理过完全相同的需求——默认情况下,系统会把同一个Inventory ID的SO行数量合并生成单条PO行,要让PO严格对应SO的多行录入结构,我们需要修改PO生成的核心逻辑,下面是具体的实现方案:
1. 扩展SOOrderEntry图,重写PO生成方法
核心思路是:不再用InventoryID作为PO行的合并依据,而是用SO订单编号+行号作为唯一标识,确保每一行SO都生成独立的PO行。
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry> { public delegate IEnumerable CreatePurchaseOrderDelegate(PXAdapter adapter); [PXOverride] public IEnumerable CreatePurchaseOrder(PXAdapter adapter, CreatePurchaseOrderDelegate baseMethod) { // 获取用户选中的所有SO行 var selectedSOLines = Base.Transactions.Select() .Where(line => line.Selected == true) .Cast<SOLine>() .ToList(); // 用唯一键标记已处理的行,避免重复 var processedLineKeys = new HashSet<string>(); foreach (var soLine in selectedSOLines) { // 生成唯一行键:SO订单号+行号,确保每行SO都被单独处理 string lineUniqueKey = $"{soLine.OrderNbr}-{soLine.LineNbr}"; if (!processedLineKeys.Contains(lineUniqueKey)) { processedLineKeys.Add(lineUniqueKey); // 为当前SO行单独创建PO行 GenerateIndividualPOLine(soLine); } } return adapter.Get(); } private void GenerateIndividualPOLine(SOLine soLine) { // 初始化PO处理图 var poGraph = PXGraph.CreateInstance<POOrderEntry>(); // 创建PO头(如果需要将多行SO合并到同一个PO,这里可以先判断是否已有对应PO,否则新建) var poOrder = poGraph.Order.Insert(new POOrder { OrderType = "PO", // 按需调整你的PO类型 VendorID = soLine.VendorID, // 从SO行取供应商,或用系统默认 Status = POOrderStatus.Open, Description = $"Generated from SO {soLine.OrderNbr}" }); // 创建对应PO行,完全复制SO行的关键信息 var poLine = poGraph.Transactions.Insert(new POLine { InventoryID = soLine.InventoryID, OrderQty = soLine.OrderQty, UOM = soLine.UOM, CuryUnitPrice = soLine.CuryUnitPrice, WarehouseID = soLine.WarehouseID, ReqDate = soLine.RequestDate, // 添加SO关联信息,方便后续追溯 SOOrderNbr = soLine.OrderNbr, SOLineNbr = soLine.LineNbr }); // 保存PO poGraph.Save.Press(); } }
2. 关键逻辑说明
- 替换合并依据:把原来的
InventoryID合并键改成SO订单号+行号,确保每行SO都能生成独立的PO行。 - 灵活调整PO生成方式:如果需要把同一SO的多行合并到同一个PO里(而不是每行一个PO),可以在
GenerateIndividualPOLine方法里先查询是否已有对应SO的PO,再添加行,而不是每次新建PO。
3. 测试验证步骤
部署自定义代码后,按以下步骤验证:
- 创建一个Sales Order,添加2行相同
InventoryID但不同数量的记录; - 选中这两行,点击「Create Purchase Order」按钮;
- 打开生成的Purchase Order,确认两行独立存在,数量没有被合并。
注意事项
- 字段完整性:确保复制了SO行中所有业务必需的字段(比如折扣、备注、项目代码等),避免PO行信息缺失;
- 现有逻辑兼容:如果你的系统已有自定义PO生成逻辑,需要把这段代码和现有逻辑整合,避免冲突;
- 业务规则适配:如果有PO审批、供应商匹配等规则,要确保生成的PO符合系统要求。
内容的提问来源于stack exchange,提问作者Sameer Wagh
相关产品推荐
相关产品推荐

