gpt4 book ai didi

acumatica - 如何覆盖 InventoryCD 编号序列

转载 作者:行者123 更新时间:2023-12-05 05:53:24 27 4
gpt4 key购买 nike

我请求根据为新项目选择的类别更改新项目的编号排序器。因此,用户选择一个特定的类,系统需要使用在首选项表单中的字段上设置的数字序列来查找 InventoryItem.InventoryCD 的下一个值。

关于如何做到这一点有什么想法吗?

我已经为 InventoryCD 和 InventoryID 字段尝试了 FieldDefaulting() 事件,但它不起作用。

TIA!

最佳答案

需要自定义编号属性才能实现您想要的功能。请在下面找到工作示例。

首先,我们在设置中定义字段,这些字段将保存我们的自定义编号序列:

public class INSetupExtension : PXCacheExtension<INSetup>
{
#region InventoryNumbering1ID

public abstract class inventoryNumbering1ID : PX.Data.BQL.BqlString.Field<inventoryNumbering1ID>
{
}
[PXDBString(10, IsUnicode = true)]
[PXDefault("INV1")]
[PXSelector(typeof(Numbering.numberingID), DescriptionField = typeof(Numbering.descr))]
[PXUIField(DisplayName = "Inventory Numbering One", Visibility = PXUIVisibility.Visible)]
public virtual String InventoryNumbering1ID { get; set; }
#endregion

#region InventoryNumbering1ID

public abstract class inventoryNumbering2ID : PX.Data.BQL.BqlString.Field<inventoryNumbering2ID>
{
}
[PXDBString(10, IsUnicode = true)]
[PXDefault("INV2")]
[PXSelector(typeof(Numbering.numberingID), DescriptionField = typeof(Numbering.descr))]
[PXUIField(DisplayName = "Inventory Numbering Two", Visibility = PXUIVisibility.Visible)]
public virtual String InventoryNumbering2ID { get; set; }
#endregion
}

接下来我们定义我们的自定义自动编号属性,在这里我将“默认”编号序列作为构造函数声明的参数。

在覆盖的 RowPersisting 事件中,我们利用我们的标准来确定用于下一个持久化新项目的编号序列。

在我的例子中,如果使用了一个项目类,我使用一个序列,如果没有选择项目类,我使用另一个序列。

public class NonStockAutoNumbereAttribute : AutoNumberAttribute
{
public NonStockAutoNumbereAttribute() : base(typeof(INSetupExtension.inventoryNumbering2ID), typeof(AccessInfo.businessDate))
{
}

public override void RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
InventoryItem row = e.Row as InventoryItem;
if(sender.GetStatus(row) == PXEntryStatus.Inserted)
{
base.RowPersisting(sender, e);

INSetup setup = PXSelectBase<INSetup, PXSelectReadonly<INSetup>.Config>.Select(sender.Graph, Array.Empty<object>());
INSetupExtension setupExt = setup.GetExtension<INSetupExtension>();
string nextNumber;

object newValue = sender.GetValue(e.Row, this._FieldOrdinal);
if(!string.IsNullOrEmpty((string)newValue))
{
INItemClass itemClass = PXSelectReadonly<INItemClass, Where<INItemClass.itemClassID, Equal<Required<INItemClass.itemClassID>>>>.Select(sender.Graph, row.ItemClassID);
if(itemClass != null)
{
nextNumber = AutoNumberAttribute.GetNextNumber(sender, e.Row, setupExt.InventoryNumbering1ID, DateTime.Now);
}
else
{
nextNumber = AutoNumberAttribute.GetNextNumber(sender, e.Row, setupExt.InventoryNumbering2ID, DateTime.Now);
}
sender.SetValue(e.Row, this._FieldName, nextNumber);
}
}
}
}

在 Inventory Item 维护页面上,我添加了一个简单的 CacheAttached:

public class NonStockItemMaintExtension : PXGraphExtension<NonStockItemMaint>
{
[PXDefault]
[NonStockAutoNumbereAttribute]
[InventoryRaw(typeof(Where<InventoryItem.stkItem.IsEqual<False>>), IsKey = true, DisplayName = "Inventory ID", Filterable = true)]
protected virtual void _(Events.CacheAttached<InventoryItem.inventoryCD> e) { }
}

结果如下图所示:

没有类(class)编号

Low Numbering Sequence No Class Numbering

类(class)编号

High Numbering Sequence Class Numbering

关于acumatica - 如何覆盖 InventoryCD 编号序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69903200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com