acumatica - 无法将值设置为 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
}
}
解决方案
lotSerialNbr
和expireDate
字段似乎在他们自己的世界中。我终于能够让他们为我的需要采取一些价值观,所以我将分享我在这里所做的事情,希望如果其他人陷入困境,这可能会让他们朝着正确的方向前进,或者如果我这样做了有问题,有人可以纠正我。
我正在使用FieldSelecting
事件来设置批次和到期日期的默认值,因为此时InventoryID
填充了该字段,而它在 期间为空FieldDefaulting
,我需要InventoryID
以获取项目和批次类。
我正在使用该Base.lsselect.SetValueExt<>()
方法来设置值以及将值设置e.ReturnValue
为没有一个或另一个,似乎您在值位于缓存中但未显示在屏幕上的 UI 中得到混合结果。
当需要保存时,如果您在 Expire Date 或 Lot 字段中输入了日期,那么这些值会按预期通过 UI 传播到视图,但是,如果您不输入值,无论出于何种原因,我们在创建期间设置的值FieldSelecting
不会从视图复制到INTranSplit
记录。这就是为什么我在记录中添加FieldDefatulting
了两个字段的事件INTranSplit
,以便它们默认为相同的值(通过相同的逻辑),以防用户实际上没有输入值。
这个逻辑似乎在INReceiptEntry
,POReceiptEntry
和MoveEntry
图中起作用。
同样,如果有更好的方法,或者默认ExpireDate
和LotSerialNbr
字段的“正确”方法,请发布更正的答案。
这是代码:
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
}
}
推荐阅读
- amazon-web-services - 使用 codepipeline 创建构建并将其部署在 aws s3 中
- c++ - 在c ++中使用getline函数进行输入时忽略第一个字符
- node.js - Azure Devops - 部署前清理目标目录
- javascript - 有没有办法将 firstName 和 lastName 的第一个字母大写并使其成为 Javascript 中的首字母
- flutter - 为什么我不能在“只有静态成员可以在初始化程序中访问”的颤动中加载扩展面板中的实际数据?
- python - selenium 打开浏览器控制台并使用 python 粘贴一些 javascript 代码
- javascript - 防止 Webpack ProvidePlugin 替换 node_modules 上的标识符
- python - Flask 开发服务器重新加载时向前端发送消息
- java - Excel ::String单元格值未与Java中的整数连接
- r - 如何为 R 中的函数编写参数验证。可以使用胶水吗?