Acumatica:如何在创建采购订单处理表单中传递自定义字段
实现从销售订单自定义字段填充采购订单的方法
1. 确认自定义字段配置
- 先确保销售订单侧的两个自定义字段已正确定义:
- 订单级:
SOOrderExt.Usr[你的自定义字段名](对应SOOrder扩展) - 行级:
SOLineExt.Usr[你的自定义字段名](对应SOLine扩展)
- 订单级:
- 同时在采购订单侧创建对应的接收字段:
- 订单级:
POOrderExt.Usr[接收字段名](对应POOrder扩展) - 行级:
POLineExt.Usr[接收字段名](对应POLine扩展)
- 订单级:
2. 扩展「创建采购订单」处理逻辑
Acumatica中「创建采购订单」(PO.50.50.00)对应的后台Graph是POOrderEntry,我们需要编写Graph Extension来拦截采购订单的创建流程,从关联的销售订单中读取自定义字段值并填充到采购订单的对应字段中。
代码实现示例
using PX.Data; using PX.Objects.SO; using PX.Objects.PO; public class POOrderEntry_CustomFieldMapping : PXGraphExtension<POOrderEntry> { // 拦截采购订单头插入事件,同步销售订单级自定义字段 protected void _(Events.RowInserting<POOrder> e) { POOrder poHeader = e.Row; if (poHeader?.SOOrderNbr == null) return; // 查询关联的源销售订单 SOOrder soHeader = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<POOrder.sOOrderNbr>>>> .Select(Base, poHeader.SOOrderNbr); if (soHeader != null) { // 获取销售订单扩展字段并赋值给采购订单扩展字段 SOOrderExt soExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(soHeader); POOrderExt poExt = PXCache<POOrder>.GetExtension<POOrderExt>(poHeader); poExt.UsrSOOrderCustomField = soExt.UsrCustomOrderField; } } // 拦截采购订单行插入事件,同步销售订单行级自定义字段 protected void _(Events.RowInserting<POLine> e) { POLine poLine = e.Row; if (poLine?.SOOrderNbr == null || poLine?.SOLineNbr == null) return; // 查询关联的源销售订单行 SOLine soLine = PXSelect<SOLine, Where<SOLine.orderNbr, Equal<Required<POLine.sOOrderNbr>>, And<SOLine.lineNbr, Equal<Required<POLine.sOLineNbr>>>>> .Select(Base, poLine.SOOrderNbr, poLine.SOLineNbr); if (soLine != null) { // 获取销售订单行扩展字段并赋值给采购订单行扩展字段 SOLineExt soLineExt = PXCache<SOLine>.GetExtension<SOLineExt>(soLine); POLineExt poLineExt = PXCache<POLine>.GetExtension<POLineExt>(poLine); poLineExt.UsrSOLineCustomField = soLineExt.UsrCustomLineField; } } }
3. 部署与验证
- 将上述代码编译为Acumatica自定义程序集,部署到系统中并发布
- 打开标记为Purchase To Order的销售订单,通过「创建采购订单」(PO.50.50.00)表单生成采购订单
- 检查采购订单的头和行自定义字段,确认值已从对应销售订单同步过来

内容的提问来源于stack exchange,提问作者Lionel PARIS
相关产品推荐
相关产品推荐

