You need to enable JavaScript to run this app. IN301000入库单界面无法为INTran.LotSerialNbr等字段赋值问题
优惠活动
大模型
产品
解决方案
定价
更多

IN301000入库单界面无法为INTran.LotSerialNbr等字段赋值问题

Acumatica IN301000入库单批次/有效期字段赋值失效问题解决

问题原因

  • INTran表的LotSerialNbr、ExpireDate字段属于前台展示用的计算字段,实际数据持久化存储在INTranSplit子表中,直接修改INTran行的这两个属性,会被系统标准逻辑后续从Split子表同步的数值覆盖,导致赋值不生效。
  • INTranSplit相关事件默认不触发,是因为系统仅在用户手动打开批次拆分弹窗、或开启了自动批次/有效期分配规则时才会创建Split记录,没有Split行的场景下自然无法触发对应的子表事件。
  • 原代码中直接对行属性赋值,未调用缓存的更新方法,部分场景下会被缓存的原值覆盖。

解决方法

方案1:使用FieldDefaulting事件赋值(最简方案,已验证该事件可正常触发)

直接为两个字段的FieldDefaulting事件编写赋值逻辑,该事件优先级高于系统默认赋值逻辑,设置后不会被后续逻辑覆盖:

using PX.Data;
using PX.Objects.IN;
using System;

namespace PX.Objects.IN
{
  public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry>
  {
    #region Event Handlers
    protected void INTran_LotSerialNbr_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e)
    {
      var row = (INTran)e.Row;
      if (row == null) return;
      // 可自行增加判断条件,仅对符合要求的行赋值
      e.NewValue = "TESTING";
      e.Cancel = true; // 终止系统默认赋值逻辑
    }

    protected void INTran_ExpireDate_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e)
    {
      var row = (INTran)e.Row;
      if (row == null) return;
      e.NewValue = new DateTime(2021, 12, 31);
      e.Cancel = true;
    }
    #endregion
  }
}

方案2:需在InventoryID更新后触发赋值的场景

如果逻辑需要依赖InventoryID选择后的其他字段做判断,可修改代码同时处理INTran展示字段和Split子表的赋值,避免被覆盖:

using PX.Data;
using PX.Objects.IN;
using System;

namespace PX.Objects.IN
{
  public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry>
  {
    #region Event Handlers
    protected void INTran_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
      var row = (INTran)e.Row;
      if (row == null || row.InventoryID == null) return;

      // 更新INTran前台展示字段
      cache.SetValueExt<INTran.lotSerialNbr>(row, "TESTING");
      cache.SetValueExt<INTran.expireDate>(row, new DateTime(2021, 12, 31));

      // 自动创建Split子表记录并赋值,避免后续被系统逻辑覆盖
      Base.splits.Current = null;
      INTranSplit newSplit = Base.splits.Insert();
      if (newSplit != null)
      {
        newSplit.InventoryID = row.InventoryID;
        newSplit.LotSerialNbr = "TESTING";
        newSplit.ExpireDate = new DateTime(2021, 12, 31);
        newSplit.Qty = row.Qty;
        Base.splits.Update(newSplit);
      }
    }
    #endregion
  }
}

验证注意事项

  • 确认对应库存物品的批次管理、有效期管理属性已开启,否则系统不会处理这两个字段
  • 自定义发布后清理浏览器缓存再测试,避免前端缓存旧的页面逻辑

内容的提问来源于stack exchange,提问作者Jerry Kurtz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 16:45:03