Acumatica PXCheckUnique-如何在错误消息上显示重复订单Nbr

时间:2018-08-02 06:11:38

标签: acumatica

当再次出现相同的值组合时,我需要在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。如果有人可以帮助我,那将非常好。

在此先感谢:)

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是创建自己的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>>>))]

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

enter image description here