首页 > 解决方案 > 无法将值设置为 INTran.LotSerialNbr 或 INTran.ExpireDate

问题描述

在屏幕 IN301000 上输入库存收据时,我需要在 INTran 记录上设置 LotSerialNbr 和 ExpireDate。

此外,INTran.LotSerialNbr 和 INTran.ExpireDate 的 FieldDefaulting 事件按预期触发,但这两个字段的 FieldUpdated 事件不会受到影响。

仅尝试设置值的简单代码(例如下面的代码)似乎不起作用。我也尝试过 INTranSplit 记录,但这些事件也没有受到影响。

我确定我错过了一些东西,所以任何见解都会受到赞赏。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PX.Common;
using PX.Data;
using PX.Data.BQL;
using PX.Data.BQL.Fluent;
using PX.Objects.CM;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.Objects.Common.Extensions;
using PX.Objects;
using PX.Objects.IN;

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) return;

      row.LotSerialNbr = "TESTING";
      row.ExpireDate = Convert.ToDateTime("12/31/2021");
    }
    #endregion
  }
}

标签: acumatica

解决方案


lotSerialNbrexpireDate字段似乎在他们自己的世界中。我终于能够让他们为我的需要采取一些价值观,所以我将分享我在这里所做的事情,希望如果其他人陷入困境,这可能会让他们朝着正确的方向前进,或者如果我这样做了有问题,有人可以纠正我。

我正在使用FieldSelecting事件来设置批次和到期日期的默认值,因为此时InventoryID填充了该字段,而它在 期间为空FieldDefaulting,我需要InventoryID以获取项目和批次类。

我正在使用该Base.lsselect.SetValueExt<>()方法来设置值以及将值设置e.ReturnValue为没有一个或另一个,似乎您在值位于缓存中但未显示在屏幕上的 UI 中得到混合结果。

当需要保存时,如果您在 Expire Date 或 Lot 字段中输入了日期,那么这些值会按预期通过 UI 传播到视图,但是,如果您不输入值,无论出于何种原因,我们在创建期间设置的值FieldSelecting不会从视图复制到INTranSplit记录。这就是为什么我在记录中添加FieldDefatulting了两个字段的事件INTranSplit,以便它们默认为相同的值(通过相同的逻辑),以防用户实际上没有输入值。

这个逻辑似乎在INReceiptEntry,POReceiptEntryMoveEntry图中起作用。

同样,如果有更好的方法,或者默认ExpireDateLotSerialNbr字段的“正确”方法,请发布更正的答案。

这是代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PX.Common;
using PX.Data;
using PX.Data.BQL;
using PX.Data.BQL.Fluent;
using PX.Objects.CM;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.Objects.Common.Extensions;
using PX.Objects;
using PX.Objects.IN;

namespace PX.Objects.IN
{
    public class INReceiptEntry_ExtensionCST : PXGraphExtension<INReceiptEntry>
    {
        public static bool IsActive() => true;

        #region Event Handlers
        protected void _(Events.FieldSelecting<INTran.lotSerialNbr> e)
        {
            INTran row = (INTran)e.Row;
            if (row == null) return;

            InventoryItem item = InventoryItem.PK.Find(Base, row.InventoryID);

            if (item != null && (item.LotSerClassID ?? "").Trim().ToUpper() == "TEST")
            {
                Base.lsselect.SetValueExt<INTran.lotSerialNbr>(Base.transactions.Current, "TESTING");
                e.ReturnValue = "TESTING";
            }
        }
        protected void _(Events.FieldDefaulting<INTranSplit.lotSerialNbr> e)
        {
            INTranSplit row = (INTranSplit)e.Row;
            if (row == null) return;

            InventoryItem item = InventoryItem.PK.Find(Base, row.InventoryID);

            if (item != null && (item.LotSerClassID ?? "").Trim().ToUpper() == "TEST")
            {
                e.NewValue = "TESTING";
            }
        }
        protected void _(Events.FieldSelecting<INTran.expireDate> e)
        {
            INTran row = (INTran)e.Row;
            if (row == null) return;
            if (row.InventoryID == null) return;

            InventoryItem item = InventoryItem.PK.Find(Base, row.InventoryID);

            if (item != null)
            {
                INItemClass itemClass = INItemClass.PK.Find(Base, item.ItemClassID);

                if (itemClass != null (itemClass.ItemClassCD ?? "").Trim().ToUpper() == "TEST" && row.ExpireDate == null)
                {
                   DateTime expire = DateTime.Today.AddDays(30);
                   Base.lsselect.SetValueExt<INTran.expireDate>(Base.transactions.Current, expire);
                   e.ReturnValue = expire;
                }
            }
        }
        protected void _(Events.FieldDefaulting<INTranSplit.expireDate> e)
        {
            INTranSplit row = (INTranSplit)e.Row;
            if (row == null) return;
            if (row.InventoryID == null) return;

            InventoryItem item = InventoryItem.PK.Find(Base, row.InventoryID);

            if (item != null)
            {
                INItemClass itemClass = INItemClass.PK.Find(Base, item.ItemClassID);

                if (itemClass != null (itemClass.ItemClassCD ?? "").Trim().ToUpper() == "TEST" && row.ExpireDate == null)
                {

                   DateTime expire = DateTime.Today.AddDays(30);
                   e.NewValue = expire;
                }
            }
        }

        #endregion
    }
}

推荐阅读