You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Acumatica生产订单维护界面字段更新致表头字段清空问题修复求助

问题背景与异常现象

在Acumatica制造模块的「库存项(Stock Items)」界面新增了自定义复选框,需求为:当该复选框勾选时,「生产订单维护(Production Order Maintenance)」界面的「允许预分配批次/序列号(Allow Preassigning Lot/Serial Numbers)」复选框自动勾选。

当前代码已实现复选框联动逻辑,但触发事件处理程序时,会清空Inventory ID等其他表头字段,需修复该异常。

原代码
using PX.Objects.Common.Exceptions;
using PX.Objects.Common.Scopes;
using PX.Objects.PM;
using IQtyAllocated = PX.Objects.IN.Overrides.INDocumentRelease.IQtyAllocated;
using LocationStatus = PX.Objects.IN.Overrides.INDocumentRelease.LocationStatus;
using LotSerialStatus = PX.Objects.IN.Overrides.INDocumentRelease.LotSerialStatus;
using SiteLotSerial = PX.Objects.IN.Overrides.INDocumentRelease.SiteLotSerial;
using SiteStatus = PX.Objects.IN.Overrides.INDocumentRelease.SiteStatus;
using System;
using PX.Data;
using PX.Objects.IN;
using PX.Objects.CS;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using PX.Objects.AM.GraphExtensions;
using PX.Common;
using PX.Objects.Common;
using PX.Objects.SO;
using PX.Objects.AM.Attributes;
using System.Linq;
using PX.Objects.AM.CacheExtensions;
using PX.Data.BQL.Fluent;
using PX.Data.BQL;
using PX.Objects.AR;
using PX.Objects.CR;
using PX.Objects.GL;
using PX.Objects;
using PX.Objects.AM;
using INInventoryItemExt = PX.Objects.IN.InventoryItemExt;

namespace PX.Objects.AM
{
  public class ProdMaint_Extension : PXGraphExtension<ProdMaint.ItemLineSplittingExtension,PX.Objects.AM.ProdMaint>
  {
   protected virtual void AMProdItem_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
        {
            var row = (AMProdItem)e.Row;
            if (row?.InventoryID == null) return;

            var item = InventoryItem.PK.Find(Base, row.InventoryID);
            if (item == null) return;

            var itemExt = PXCache<InventoryItem>.GetExtension<INInventoryItemExt>(item);
            
            cache.SetValueExt<AMProdItem.preassignLotSerial>(row, itemExt.UsrAutoGenerateNumberChecker == true);
        }
      }
}
修复方案

异常原因

使用SetValueExt方法会触发完整的字段更新生命周期,包括验证、关联事件触发等,这会导致当前行的其他字段被意外重置。应改用SetValue方法,仅直接设置字段值,不触发额外业务逻辑。

修改后的代码

using PX.Data;
using PX.Objects.IN;
using PX.Objects.AM;
using INInventoryItemExt = PX.Objects.IN.InventoryItemExt;

namespace PX.Objects.AM
{
    public class ProdMaint_Extension : PXGraphExtension<ProdMaint.ItemLineSplittingExtension, ProdMaint>
    {
        protected virtual void AMProdItem_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
        {
            var row = (AMProdItem)e.Row;
            if (row?.InventoryID == null) return;

            var item = InventoryItem.PK.Find(Base, row.InventoryID);
            if (item == null) return;

            var itemExt = PXCache<InventoryItem>.GetExtension<INInventoryItemExt>(item);
            
            // 替换SetValueExt为SetValue,避免触发额外字段更新逻辑
            cache.SetValue<AMProdItem.preassignLotSerial>(row, itemExt.UsrAutoGenerateNumberChecker);
        }
    }
}

优化说明

  • 移除了未使用的命名空间,精简代码结构
  • 直接使用itemExt.UsrAutoGenerateNumberChecker赋值,无需多余的布尔判断(该属性本身为布尔类型)

内容的提问来源于stack exchange,提问作者Tharidhi P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:45:18