【问题标题】:Inventory ID that combines fields组合字段的库存 ID
【发布时间】:2021-12-14 05:03:32
【问题描述】:

任何人都知道是否可以将像 Item Class 这样的字段(我们为每个字段使用 3 个字母代码)与序列号组合以获得唯一的 Inventory ID?

例如我们需要所有硬件为 HWR-00988,但所有运输用品为 SUP-00989,依此类推。

我现在的解决方法是创建一个名为 ITEMCLASS 的属性并基本上镜像项目类代码(HWR、SUP 等),然后将属性添加到每个项目类并使用库存 ID 段设置使其看起来像是在拉实际的物品类别。

这似乎应该存在吗?我知道数据已经存在于 INITEMMENU 中。

【问题讨论】:

    标签: acumatica inventory


    【解决方案1】:

    如果您的意思是拥有一个唯一的 InventoryCD 密钥,该密钥可以根据自定义业务规则(如附加项目类)在常量 HWR-XXXXX 和 SUP-XXXXX 之间切换;我认为如果没有编程,这是不可能开箱即用的。

    通常这是通过自定义属性来完成的。这是 [CuryID] 属性的示例,它根据任意逻辑计算键值。

    使用,用自定义属性[CuryID]装饰关键字段:

    [PXDBString(5, IsUnicode = true)]
    [PXDefault(typeof(AccessInfo.baseCuryID))]
    [PXUIField(DisplayName = "Currency", ErrorHandling = PXErrorHandling.Never)]
    [PXSelector(typeof(Currency.curyID))]
    [CuryID]
    public virtual String CuryID { get; set; }
    

    对于您的场景,您可以将 InventoryRaw 替换为您的自定义属性:

    [PXDefault]
    [InventoryRaw(IsKey = true, DisplayName = "Inventory ID")]
    public virtual String InventoryCD { get; set; }
    

    自定义属性 [CuryID],如果键是自动生成的,请考虑添加 FieldDefaulting 事件:

    public sealed class CuryIDAttribute : PXEventSubscriberAttribute, IPXFieldUpdatedSubscriber, IPXRowSelectedSubscriber, IPXRowUpdatingSubscriber, IPXRowUpdatedSubscriber, IPXFieldVerifyingSubscriber
    {
        public void FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
        {
            CurrencyInfo info = e.Row as CurrencyInfo;
            if (info != null)
            {
                //reset effective date to document date first
                info.SetDefaultEffDate(sender);
                try
                {
                    info.defaultCuryRate(sender);
                }
                catch (PXSetPropertyException ex)
                {
                    sender.RaiseExceptionHandling(_FieldName, e.Row, sender.GetValue(e.Row, _FieldOrdinal), ex);
                }
                info.CuryPrecision = null;
            }
        }
        public void RowSelected(PXCache sender, PXRowSelectedEventArgs e)
        {
            CurrencyInfo info = e.Row as CurrencyInfo;
            if (info != null)
            {
                bool disabled = info.IsReadOnly == true || (info.CuryID == info.BaseCuryID);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.curyMultDiv>(sender, info, !disabled);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.sampleCuryRate>(sender, info, !disabled);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.sampleRecipRate>(sender, info, !disabled);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.curyRateTypeID>(sender, info, !disabled);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.curyEffDate>(sender, info, !disabled);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.baseCuryID>(sender, info, false);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.displayCuryID>(sender, info, false);
                PXUIFieldAttribute.SetEnabled<CurrencyInfo.curyID>(sender, info, true);
            }
        }
        private bool? currencyInfoDirty = null;
        public void RowUpdating(PXCache sender, PXRowUpdatingEventArgs e)
        {
            CurrencyInfo info = e.Row as CurrencyInfo;
            if (info != null && info._IsReadOnly == true)
            {
                e.Cancel = true;
            }
            else
            {
                currencyInfoDirty = sender.IsDirty;
            }
        }
        public void RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
        {
            CurrencyInfo info = e.Row as CurrencyInfo;
            if (info != null)
            {
                CurrencyInfo old = e.OldRow as CurrencyInfo;
                if (old != null && (String.IsNullOrEmpty(info.CuryID) || String.IsNullOrEmpty(info.BaseCuryID)))
                {
                    info.BaseCuryID = old.BaseCuryID;
                    info.CuryID = old.CuryID;
                }
                if (currencyInfoDirty == false
                    && info.CuryID == old.CuryID
                    && info.CuryRateTypeID == old.CuryRateTypeID
                    && info.CuryEffDate == old.CuryEffDate
                    && info.CuryMultDiv == old.CuryMultDiv
                    && info.CuryRate == old.CuryRate)
                {
                    sender.IsDirty = false;
                    currencyInfoDirty = null;
                }
            }
        }
        public void FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
        {
            CurrencyInfo info = e.Row as CurrencyInfo;
            if (info != null)
            {
                CMSetup CMSetup = info.getCMSetup(sender);
            }
        }
    }
    

    【讨论】:

    • 谢谢!绝对希望有一些开箱即用的东西,但会将这个想法传递给正在“帮助”我们实施的顾问。我认为如果项目类别 ID 现在只显示在所有报告中也是可以接受的。感谢您的反馈:)
    • 似乎需要编程。请注意,虽然自定义属性提供了透明和原生的解决方案,但还有一些替代方法和变通方法比我的回答更容易实现。
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多