【问题标题】:Acumatica PXCheckUnique - How to display duplicate order Nbr on the error messageAcumatica PXCheckUnique - 如何在错误消息中显示重复订单 Nbr
【发布时间】:2018-08-08 22:19:22
【问题描述】:

当再次出现相同的值组合时,我需要在 SO 屏幕上进行客户订单 Nbr 和外部 Nbr 验证。为了执行这个验证,我们使用了默认 Acumatica 的 PXCheckUnique 属性,如下所示

  [PXCheckUnique(Where = typeof(Where2<Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>,
        And<SOOrder.customerOrderNbr, Equal<Current<SOOrder.customerOrderNbr>>,
            And<SOOrder.customerRefNbr, Equal<Current<SOOrder.customerRefNbr>>>>>, 
        And<SOOrder.status, NotEqual<SOOrderStatus.cancelled>>>),
        ErrorMessage = "Order already exists with this Customer Order Nbr and External Ref.Nbr combination ")]

验证根据需要触发。我们需要的支持是在错误消息中显示现有的 Order Nbr。如果有人可以帮助我,那就太好了。

在此先感谢:)

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    我认为最好的方法是创建您自己的PXCheckUnique 版本,并添加错误消息报告功能。最简单的方法是覆盖 PrepareMessage 并返回您想要的消息。

    我确认以下将起作用。我重用了PXRestrictorAttribute 中的一些逻辑,因为它执行的操作类似于您想要执行的操作(在错误消息中包含当前值)。

    public class PXCheckUniqueCustomError : PXCheckUnique
    {
        protected System.Type[] _MsgParams;
    
        public PXCheckUniqueCustomError(string message, params System.Type[] pars)
        {
            ErrorMessage = message;
            if (pars.Any(par => !typeof(IBqlField).IsAssignableFrom(par)))
            {
                throw new PXArgumentException(nameof(pars), ErrorMessages.ArgumentException);
            }
            _MsgParams = pars;
        }
    
        protected override string PrepareMessage(PXCache cache, object currentRow, object duplicateRow)
        {
            // Can swap if needing the current row or duplicate row found
            return string.Format(ErrorMessage, _MsgParams
                .Select(param =>
                    cache.Graph.Caches[BqlCommand.GetItemType(param)]
                        .GetStateExt(PXResult.Unwrap(currentRow, BqlCommand.GetItemType(param)), param.Name))
                .ToArray());
        }
    }
    

    那你就可以像这样使用属性了……

    [PXCheckUniqueCustomError("Order already exists with Customer Order Nbr {0} and External Ref.Nbr {1}", typeof(SOOrder.customerOrderNbr), typeof(SOOrder.customerRefNbr),  
        Where = typeof(Where2<Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>,
            And<SOOrder.customerOrderNbr, Equal<Current<SOOrder.customerOrderNbr>>,
                And<SOOrder.customerRefNbr, Equal<Current<SOOrder.customerRefNbr>>>>>,
        And<SOOrder.status, NotEqual<SOOrderStatus.cancelled>>>))]
    

    结果会是这样的消息...

    【讨论】:

    • 我打算建议,CrossReferenceUniquenessAttribute 做了一些非常相似的事情,因为它还扩展了 PXCheckUnique 并在 PrepareMessage 覆盖中格式化错误消息。
    • 伟大的思想都一样 :) CrossReferenceUniquenessAttribute 的好发现。我没有考虑查看是否有另一个属性已经从 PXCheckUnqiue 延伸出来。这似乎是唯一能做到这一点的其他属性。
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多